
Probador para CVE-2026-43284
Una herramienta de diagnóstico comunitaria para determinar si un host dom0 de XCP-ng está expuesto a CVE-2026-43284 ("Dirty Frag"), una vulnerabilidad de escalada de privilegios local en el subsistema xfrm-ESP del kernel de Linux.
TL;DR — Todas las versiones actuales de XCP-ng (8.1, 8.2, 8.3) que ejecutan el kernel dom0 4.19 estándar se encuentran en el rango de código vulnerable. No se ha publicado un parche oficial de XCP-ng a mayo de 2026. Esta herramienta le indica de manera definitiva si su host está expuesto y proporciona una mitigación provisional segura.
"Dirty Frag" es una vulnerabilidad de escalada de privilegios local divulgada públicamente en mayo de 2026 por el investigador Hyunwoo Kim (@v4bel). Explota una ruta rápida de descifrado en el lugar en el subsistema IPsec ESP del kernel de Linux, introducida en enero de 2017 (kernel 4.14+). Una prueba de concepto pública funcional produce un shell de root mediante llamadas al sistema estándar sin requerir exploits del kernel.
Se publicaron dos CVE:
| CVE | Subsistema | Introducido | ¿Aplica a XCP-ng 4.19? |
|---|---|---|---|
| CVE-2026-43284 | xfrm-ESP (esp4/esp6) | kernel 4.14, enero 2017 | SÍ |
| CVE-2026-43500 | RxRPC (rxkad) | kernel 6.4, junio 2023 | No — rxrpc.ko no incluido |
XCP-ng no necesita CVE-2026-43500 para ser explotable. La ruta esp4 (CVE-2026-43284) por sí sola es suficiente porque el dom0 de XCP-ng no tiene política AppArmor y permite la creación de espacios de nombres de usuario no privilegiados — el único requisito previo que necesita la ruta de explotación esp4. Consulte TECHNICAL.md para el análisis completo.
El script de diagnóstico prueba la condición necesaria y suficiente para CVE-2026-43284 en XCP-ng: si un proceso no privilegiado puede activar el motor de descifrado en el lugar de esp4 a través de la interfaz netlink de XFRM dentro de un espacio de nombres de usuario.
No:
Es seguro ejecutarlo en dom0 de producción.
# Clone el repositorio
git clone https://github.com/grabesec/XCP_ng_CVE-2026-43284_tester.git
cd XCP_ng_CVE-2026-43284_tester
# Ejecute el diagnóstico (como no root para la prueba más sólida)
python3 XCP_ng_CVE_2026_43284_tester.py
Nota: Ejecutar como usuario no root cuando sea posible. Esto simula el modelo de amenaza real: una cuenta de servicio comprometida o una fuga de invitado que alcanza dom0. Ejecutar como root aún produce un resultado válido pero es menos ilustrativo.
=================================================================
XCP-ng Dirty Frag Diagnostic -- CVE-2026-43284
xfrm-ESP Page-Cache Write / Local Privilege Escalation
=================================================================
Kernel : 4.19.0+1
Host : xcpng-prod-01
PID : 52306 | UID: 1000
=================================================================
[Phase 0] Pre-flight environment checks
---------------------------------------------
[*] Unprivileged user namespaces : ALLOWED
[*] esp4 blacklist in modprobe.d : NOT FOUND
[*] CVE-2026-43284 patch in kernel RPM : NOT FOUND
[Phase 1] Baseline esp4 module state
---------------------------------------------
[*] esp4 is DORMANT -- not currently loaded in the kernel.
The autoload mechanism may fetch it on demand via XFRM.
[Phase 2] Attempting esp4 engagement from unprivileged namespace
---------------------------------------------
[*] Spawning child in isolated user+network namespace
(unshare -U -n -r) -- simulating a non-root local attacker
[*] Child signal : XFRM SA accepted by kernel
[*] esp4 refcount : 0 (before) -> 1 (now)
[*] /proc/modules : esp4 16384 1 - Live 0xffffffffc0a12000
[Phase 3] Engineering verdict
=================================================================
[!!!] PROOF OF EXPOSURE -- CVE-2026-43284 [!!!]
esp4 refcount increased: 0 -> 1
An unprivileged process inside a user+network namespace
successfully registered an XFRM Security Association and
engaged the esp4 in-place decryption engine in the host
kernel. This is the gate condition for CVE-2026-43284.
XCP-ng-specific analysis:
[FAIL] Kernel 4.19 carries the vulnerable code (since 4.14)
[FAIL] User namespaces are open -- esp4 path is reachable
[OK] rxrpc.ko absent -- CVE-2026-43500 does not apply
[FAIL] esp4 path alone is sufficient on this configuration
[Phase 0] Pre-flight environment checks
---------------------------------------------
[+] esp4 blacklist found in /etc/modprobe.d/
Module-load mitigation appears to be in place.
...
[Phase 2] Attempting esp4 engagement from unprivileged namespace
---------------------------------------------
[+] XFRM state add was REJECTED by the kernel.
The esp4 engine was not engaged from the namespace.
[RESULT] The namespace loophole did NOT grant esp4 access.
El script mitigate.sh incluido aplica la mitigación de forma segura, con detección de IPsec incorporada para evitar romper túneles:
# Verificar el estado actual únicamente (sin cambios)
sudo ./mitigate.sh --check
# Aplicar mitigación (se cancela si se detecta IPsec)
sudo ./mitigate.sh
# Eliminar mitigación (tras aplicar el parche oficial del kernel)
sudo ./mitigate.sh --undo
Opción A — Hosts que NO usan IPsec (la mayoría de los dom0):
echo 'install esp4 /bin/false' > /etc/modprobe.d/dirtyfrag-cve-2026-43284.conf
rmmod esp4 2>/dev/null || true
echo 3 > /proc/sys/vm/drop_caches
Opción B — Hosts que usan IPsec (strongSwan / Libreswan):
NO incluya esp4 en la lista negra — rompería inmediatamente todos los túneles. En su lugar:
⚠️ Esto es una ESCALADA DE PRIVILEGIOS LOCAL. Un atacante ya debe tener un shell o ejecución de código en dom0. La defensa principal es limitar quién tiene acceso local a dom0 en primer lugar. Root de dom0 = root del hipervisor = todas las máquinas virtuales invitadas comprometidas.
| Requisito | Notas |
|---|---|
| Python 3.6+ | Incluido con XCP-ng 8.x dom0 |
iproute2 (comando ip) | Incluido con XCP-ng 8.x dom0 |
unshare | Parte de util-linux, incluido con XCP-ng 8.x dom0 |
| Kernel de Linux | Cualquier kernel 4.14–6.x en un dom0 de XCP-ng |
No se requieren librerías Python externas. No se necesita pip install.
XCP_ng_CVE-2026-43284_tester/
├── XCP_ng_CVE_2026_43284_tester.py # Script de diagnóstico — ejecute esto primero
├── mitigate.sh # Script de mitigación con detección de IPsec
├── README.md # Este archivo — inicio rápido y resumen
├── TECHNICAL.md # Análisis técnico profundo — cadena de ataque,
│ # por qué rxrpc no es necesario en XCP-ng,
│ # explicación de los internos del script
├── CHANGELOG.md # Historial de versiones
└── LICENSE # MIT
Para una explicación completa de:
Consulte TECHNICAL.md.
| Versión de XCP-ng | Kernel | ¿Vulnerable? | ¿Parche Oficial? |
|---|---|---|---|
| 8.3 LTS | 4.19 + parches Vates | SÍ | No publicado a mayo de 2026 |
| 8.2 | 4.19 + parches Vates | SÍ | No publicado a mayo de 2026 |
| 8.1 (fin de vida) | 4.19 + parches Vates | SÍ | No esperado |
Esta herramienta prueba únicamente la condición previa para la explotación (acceso a espacio de nombres + esp4). No contiene, reproduce ni referencia ningún código de exploit. La vulnerabilidad subyacente es públicamente conocida, tiene una prueba de concepto publicada por el investigador original y se le han asignado CVE. El propósito de esta herramienta es ayudar a los administradores de XCP-ng a determinar su exposición y aplicar mitigaciones provisionales mientras esperan un parche oficial del kernel por parte de Vates.
Rodrigo Gracia — Contribución de seguridad comunitaria
Practicante de XCP-ng / Xen Orchestra
https://github.com/grabesec
Mayo de 2026