
Exploit determinista de escalada local de privilegios en el kernel de Linux que encadena dos primitivas de escritura de page-cache (xfrm/ESP y RxRPC) para obtener acceso root fiable en todas las principales distribuciones desde 2017.
Escalada local de privilegios universal en el kernel de Linux
| Campo | Detalle |
|---|---|
| CVE | CVE-2026-43284 (xfrm/ESP) + CVE-2026-43500 (RxRPC) |
| Apodo | Dirty Frag |
| CVSS | 7.8 HIGH |
| Tipo | Escalada local de privilegios (LPE) |
| Introducido | kernel de Linux 4.10 (2017, commit cac2661c53f3) |
| Corregido | Commits de mainline f4c50a4034e6 / aa54b1d27fe0 |
| Requiere | Acceso local a un shell sin privilegios |
| Vector remoto | Ninguno — solo local |
| Divulgado | 7 de mayo de 2026 por Hyunwoo Kim (@v4bel) |
Un fallo de lógica en los subsistemas xfrm/ESP y RxRPC del kernel de Linux permite a un usuario local sin privilegios realizar una escritura arbitraria controlada y determinista en la caché de páginas de cualquier archivo legible del sistema, incluidos binarios setuid como /usr/bin/su.
La causa raíz es el descifrado in situ inseguro de fragmentos de buffer de socket compartido (skb) que hacen referencia a páginas de la caché de páginas, especialmente cuando se utiliza splice(2) o sendfile(2). Esto proporciona una potente primitiva de escritura arbitraria en la caché de páginas, que puede aprovecharse para sobrescribir archivos sensibles en memoria y lograr acceso root completo.
Se encadenan dos primitivas distintas para lograr una cobertura universal:
xfrm-ESP Page-Cache Write: comparte el mismo sumidero que Copy Fail, pero se desencadena a través de los módulos esp4/esp6, independientemente de si algif_aead está disponible. Requiere privilegios de creación de namespaces.RxRPC Page-Cache Write: no requiere privilegios de namespace, pero debe estar presente rxrpc.ko (cargado por defecto en Ubuntu). Cubre los puntos ciegos de CVE-2026-43284.Encadenar ambas variantes hace que cubran mutuamente sus puntos ciegos, logrando root fiable en todas las distribuciones principales.
Sin condiciones de carrera. Sin reintentos. Sin riesgo de crash. Determinista en todas las distribuciones probadas.
Importante: Incluso en sistemas donde se aplica la mitigación pública conocida de Copy Fail (lista negra de
algif_aead), Dirty Frag sigue siendo explotable mediante CVE-2026-43284.
| Dirty Cow (2016) | Dirty Pipe (2022) | Copy Fail (2026) | Dirty Frag (2026) | |
|---|---|---|---|---|
| Requiere condición de carrera | Sí | Parcial | No | No |
| Específica de versiones | Sí | Sí | No | No |
| Fiabilidad | Inestable | Moderada | Determinista | Determinista |
| Cobertura de distribuciones | Limitada | Limitada | Todas desde 2017 | Todas desde 2017 |
| Omite la mitigación de Copy Fail | — | — | N/A | Sí |
algif_aead (solución de Copy Fail)CVE-2026-43284 (xfrm/ESP): kernel de Linux desde el commit cac2661c53f3 (2017-01-17) hasta f4c50a4034e6 (2026-05-05).
CVE-2026-43500 (RxRPC): kernel de Linux desde el commit 2dc334f1a63a (2023-06-08) hasta aa54b1d27fe0 (2026-05-10).
La vida útil efectiva de la cadena de vulnerabilidades es de aproximadamente 9 años.
Todas las principales distribuciones que incluyen kernels dentro de este rango están afectadas, entre ellas:
| Distribución | Versión probada | Estado |
|---|---|---|
| Ubuntu 24.04.4 | 6.17.0-23-generic | Afectada — parche en despliegue |
| RHEL 10.1 | 6.12.0-124.49.1.el10_1.x86_64 | Afectada — parche en despliegue |
| AlmaLinux 10 | 6.12.0-124.52.3.el10_1.x86_64 | Afectada — parche disponible |
| CentOS Stream 10 | 6.12.0-224.el10.x86_64 | Afectada — parche en despliegue |
| Fedora 44 | 6.19.14-300.fc44.x86_64 | Afectada — parche disponible |
| openSUSE Tumbleweed | 7.0.2-1-default | Afectada — en curso |
| Debian | — | Afectada — en curso |
gcc -O0 -Wall -o exp exp.c -lutil && ./exp
No lo utilices en sistemas en los que no estés autorizado a realizar pruebas.
⚠️ Importante: Después de ejecutar este exploit, la caché de páginas queda contaminada. Para limpiar la caché de páginas contaminada y garantizar la estabilidad del sistema, ejecuta:
echo 3 > /proc/sys/vm/drop_caches
o reinicia el sistema.
Actualiza a un kernel que contenga las correcciones de mainline y reinicia.
Corregido en mainline mediante:
f4c50a4034e62ab75f1d5cdd191dd5f9c77fdff4aa54b1d27fe0c2b78e664a34fd0fdf7cd1960d71# Ubuntu / Debian
sudo apt update && sudo apt upgrade -y && sudo reboot
# RHEL / AlmaLinux / CentOS Stream
sudo dnf clean metadata && sudo dnf upgrade && sudo reboot
# SUSE / openSUSE
sudo zypper refresh && sudo zypper update kernel-default && sudo reboot
# Fedora
sudo dnf upgrade --refresh && sudo reboot
Si no es posible parchear de inmediato, deshabilita los módulos vulnerables y limpia la caché de páginas.
# Blacklist vulnerable modules
sudo sh -c 'printf "install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n" > /etc/modprobe.d/dirtyfrag.conf'
# Unload modules immediately
sudo rmmod esp4 esp6 rxrpc 2>/dev/null || true
# Drop page cache
echo 3 | sudo tee /proc/sys/vm/drop_caches >/dev/null
| Componente | Impacto |
|---|---|
| SSH | ✅ No afectado |
| dm-crypt / LUKS | ✅ No afectado |
| kTLS / TLS en el kernel | ✅ No afectado |
| OpenSSL / GnuTLS / NSS (compilaciones predeterminadas) | ✅ No afectado |
| IPsec / XFRM (túneles ESP, VPN) | ⚠️ Se rompe — esp4 y esp6 no estarán disponibles |
| Clientes AFS / OpenAFS que usan RxRPC | ⚠️ Se rompe — rxrpc no estará disponible |
Aplicaciones que usan AF_ALG + AEAD directamente | ⚠️ Comprueba con lsof | grep AF_ALG |
Para cargas de trabajo no confiables — contenedores, runners de CI, entornos limitados (sandbox) — restringe la creación de sockets AF_ALG y splice() mediante políticas seccomp o AppArmor, independientemente del estado del parche. Esto limita la superficie de ataque incluso en kernels vulnerables, pero no es una solución completa.
Comprueba si los módulos vulnerables están cargados o en uso:
# Check if modules are loaded
lsmod | grep -E 'esp4|esp6|rxrpc'
# Check if any process has an AF_ALG socket open
lsof | grep AF_ALG
ss -xa | grep alg
# Confirm workaround is active after reboot
cat /etc/modprobe.d/dirtyfrag.conf