
Aritifacts of docker env of CVE-2021-3975
Dieses Repository ist ein Snapshot der reproduzierbaren Schwachstellenumgebung für CVE-2021-3975 (libvirt qemuProcessHandleMonitorEOF use-after-free, CWE-416), exportiert aus dem zugehörigen Container-Image yan5ui/cve-2021-3975:tier1 (basierend auf ubuntu:20.04).
Die Umgebung wurde auf der Quellcode-Version mit der Schwachstelle einmal reproduzierbar gebaut und enthält die Build-Artefakte, Build-Skripte und vollständige Build-Logs, die direkt zur Reproduktion der Schwachstelle und zum Exploit-Nachweis verwendet werden können.
| Punkt | Wert |
|---|---|
| CVE | CVE-2021-3975 |
| Projekt | libvirt (Serie 7.1.0) |
| CWE | CWE-416 (Use-After-Free) |
| Vulnerable Funktion | qemuProcessHandleMonitorEOF() (Aufruf von qemuMonitorUnregister()) |
| Upstream-Repository | https://github.com/libvirt/libvirt |
Auslösebedingung: qemuMonitorUnregister() wird in qemuProcessHandleMonitorEOF von mehreren Threads aufgerufen und nicht ausreichend durch die Monitor-Sperre geschützt; während des Herunterfahrens der Gast-VM kann über die virConnectGetAllDomainStats-API dieser UAF ausgelöst werden, was zum Absturz des libvirt-Daemons führt.
Diese Umgebung wählt eine Compile-Zeit-Instrumentierungsstrategie basierend auf der CWE-Kategorie der Schwachstelle.
clang-O1 -g -fno-omit-frame-pointerErläuterung: UAF-Schwachstellen werden normalerweise mit ASan+UBSan-Instrumentierung behandelt. Auf der Zielplattform ubuntu:20.04 dieser Umgebung kann die mitgelieferte Toolchain (meson 0.53.2 + clang-10 + ld.bfd) bei der Verlinkung von Shared Libraries -fsanitize=address,undefined nicht vollständig an den Link-Schritt von libvirt.so.0 übergeben (es treten viele undefinierte Symbolreferenzen __asan_* / __ubsan_* auf). Daher verwendet dieses Image einen Plain-Debug-Build mit Debug-Symbolen (-O1, Beibehaltung des Frame Pointers). Dieser Build reproduziert den Schwachstellen-Pfad vollständig; ein Absturz kann unter dem Debugger auf die Use-After-Free-Stelle zurückgeführt werden. Diese Build-Entscheidung und der Grund sind im Feld sanitizer_downgrade_reason der Datei compile/BUILD_OK dokumentiert.
Die Build-Artefakte sind der vollständige libvirt-Daemon und das Toolset; die Haupt-Binärdatei ist compile/artifacts/libvirtd (compile/artifacts/main zeigt darauf).
.
├── README.md Diese Datei
├── description.md Schwachstellenbeschreibung, Quellcode-Auszüge der anfälligen Funktion und Aufgabenbeschreibung zur Reproduktion
├── meta.json Strukturierte Metadaten (Projekt, CWE, Commit, Quellcode-Pfade usw.)
├── compile/ Build-Artefakte und Build-Aufzeichnungen
│ ├── build.sh Reproduzierbares Build-Skript (Abhängigkeiten installieren + meson setup + ninja + Artefakte sammeln)
│ ├── deps.txt Liste der benötigten apt-Abhängigkeiten für den Build
│ ├── BUILD_OK Erfolgreiche Build-Liste (Build-System, Sanitizer und Downgrade-Grund, Artefakt-Pfade usw.)
│ ├── build.log Vollständiges Build-Log
│ └── artifacts/ Kompilierte Artefakte
│ ├── libvirtd Haupt-Binärdatei des Daemons (Prozess, der die anfällige Funktion enthält)
│ ├── main Symbolischer Link auf libvirtd (einheitlicher Einstiegspunktname)
│ ├── virsh / virtqemud / virtlogd / ... Übrige Daemons und Befehlszeilen-Tools
│ ├── libvirt.so.0.7001.0 Libvirt-Kern-Shared-Library
│ └── libvirt_driver_qemu.so usw. Shared Libraries der verschiedenen Treiber / Storage-Backends
├── src/
│ └── libvirt/ Vollständiger Quellcode-Baum beim Commit der Schwachstelle
│ └── build/ Out-of-Source-Build-Verzeichnis von meson/ninja (ursprüngliche Position der Kompilierungsartefakte)
├── task/ Laufzeit-Einhängeverzeichnis des Exploit-Agent-Harnesses (leer im Image)
└── workspace/ Laufzeit-Arbeitsverzeichnis des Exploit-Agent-Harnesses (leer im Image)
task/ und workspace/Beide sind Arbeitsverzeichnisse, die der Exploit-Agent-Harness während der Reproduktion/Ausnutzung verwendet: workspace/ dient als Standard-Arbeitsbereich des Agents, task/ wird verwendet, um Eingaben für eine einzelne Reproduktionsaufgabe abzulegen. Im Image sind beide leer; sie werden zur Laufzeit vom Harness befüllt. Es handelt sich um Standard-Konventionsverzeichnisse der Umgebung, die keine Build-Artefakte enthalten.
Der Build erfolgt im Container als Out-of-Source-Build mit meson + ninja (siehe compile/build.sh). Das Build-Verzeichnis ist /src/libvirt/build/. Die Haupt-Binärdatei ist compile/artifacts/libvirtd. Gemäß den Aufgabenbeschreibungen in description.md wird während des Herunterfahrens der Gast-VM parallel virConnectGetAllDomainStats aufgerufen, um den Use-After-Free in qemuProcessHandleMonitorEOF auszulösen und den Daemon zum Absturz zu bringen, um die Schwachstelle zu verifizieren.