
Artefactos del entorno docker de CVE-2021-3975
Este repositorio es una instantánea del entorno de vulnerabilidad reproducible de la CVE-2021-3975 (use-after-free en qemuProcessHandleMonitorEOF de libvirt, CWE-416), exportada desde la imagen de contenedor correspondiente yan5ui/cve-2021-3975:tier1 (basada en ubuntu:20.04).
El entorno se ha sometido a una compilación reproducible sobre el código fuente de la versión vulnerable y conserva los artefactos de compilación, los scripts de construcción y el registro de compilación completo, listos para usar directamente en la reproducción de la vulnerabilidad y en la verificación de exploits.
| Elemento | Valor |
|---|---|
| CVE | CVE-2021-3975 |
| Proyecto | libvirt (serie 7.1.0) |
| CWE | CWE-416 (liberación y uso posterior, Use-After-Free) |
| Función vulnerable | qemuProcessHandleMonitorEOF() (que invoca qemuMonitorUnregister()) |
| Repositorio upstream | https://github.com/libvirt/libvirt |
Condición de disparo: qemuMonitorUnregister() se invoca desde qemuProcessHandleMonitorEOF en múltiples hilos sin la protección suficiente del monitor lock; durante el apagado de la guest, esta UAF puede activarse a través de la API virConnectGetAllDomainStats, lo que provoca el fallo del daemon de libvirt.
Este entorno elige la estrategia de instrumentación en tiempo de compilación según la categoría CWE de la vulnerabilidad.
clang-O1 -g -fno-omit-frame-pointerNota: las vulnerabilidades de tipo UAF suelen combinarse con instrumentación ASan+UBSan. En la plataforma objetivo de este entorno, ubuntu:20.04, la cadena de herramientas proporcionada por el sistema (meson 0.53.2 + clang-10 + ld.bfd) no consigue pasar -fsanitize=address,undefined de forma completa a la etapa de enlazado de la biblioteca compartida libvirt.so.0 (aparecen numerosas referencias a los símbolos indefinidos __asan_* / __ubsan_*); por lo tanto, esta imagen adopta una compilación debug plain con símbolos de depuración (-O1, conservando el puntero de marco). Dicha compilación reproduce por completo la ruta de código vulnerable y el fallo puede localizarse en el punto de liberación y uso posterior bajo el depurador; esta decisión de compilación y su motivo quedan registrados fielmente en el campo sanitizer_downgrade_reason de compile/BUILD_OK.
Los artefactos de compilación comprenden el daemon de libvirt completo y el conjunto de herramientas; el binario principal es compile/artifacts/libvirtd (compile/artifacts/main apunta a él).
.
├── README.md 本文件
├── description.md 漏洞描述、漏洞函数源码摘录与复现任务说明
├── meta.json 结构化元数据(项目、CWE、commit、源码路径等)
├── compile/ 构建产物与构建记录
│ ├── build.sh 可复现构建脚本(依赖安装 + meson setup + ninja + 收集产物)
│ ├── deps.txt 构建所需的 apt 依赖清单
│ ├── BUILD_OK 构建成功清单(构建系统、sanitizer 与降级原因、产物路径等)
│ ├── build.log 完整构建日志
│ └── artifacts/ 编译产物
│ ├── libvirtd 守护进程主二进制(漏洞函数所在进程)
│ ├── main 指向 libvirtd 的符号链接(统一入口名)
│ ├── virsh / virtqemud / virtlogd / ... 其余守护进程与命令行工具
│ ├── libvirt.so.0.7001.0 libvirt 核心共享库
│ └── libvirt_driver_qemu.so 等 各 driver / storage backend 共享库
├── src/
│ └── libvirt/ 漏洞 commit 处的完整源码树
│ └── build/ meson/ninja 的 out-of-source 构建目录(编译产物原位置)
├── task/ exploit agent harness 的运行时挂载目录(镜像内为空)
└── workspace/ exploit agent harness 的运行时工作目录(镜像内为空)
task/ y workspace/Estos dos directorios son las áreas de trabajo que utiliza el harness del agente de exploit al ejecutar la reproducción/explotación: workspace/ actúa como el área de trabajo predeterminada del agente, mientras que task/ se usa para colocar las entradas de una única tarea de reproducción. En la imagen ambos están vacíos; durante la reproducción, el harness los rellena en tiempo de ejecución. Son directorios de convención estándar del entorno y no contienen artefactos de compilación.
La compilación dentro del contenedor es una compilación out-of-source con meson + ninja (ver compile/build.sh); el directorio de compilación es /src/libvirt/build/. El binario principal es compile/artifacts/libvirtd. Siguiendo las instrucciones de la tarea de description.md, durante el apagado de la guest se invoca de forma concurrente virConnectGetAllDomainStats, lo que dispara la liberación y uso posterior en qemuProcessHandleMonitorEOF y provoca el fallo del daemon, verificando así la vulnerabilidad.