- Dirty Frag es una vulnerabilidad universal de escalada local de privilegios que permite obtener privilegios de root en las principales distribuciones de Linux y, debido a que se rompieron el calendario de divulgación responsable y el embargo, todavía no hay parche ni CVE
- Es una extensión de la misma clase de errores que Dirty Pipe y Copy Fail, y como se trata de un bug lógico determinista, no requiere condición de carrera y tiene una tasa de éxito muy alta
- La vida útil efectiva de la vulnerabilidad es de aproximadamente 9 años y ya fue probada en distribuciones principales como Ubuntu, RHEL, Fedora y openSUSE
- Incluso los sistemas que aplicaron la mitigación existente para Copy Fail (lista negra de
algif_aead) siguen siendo vulnerables a Dirty Frag - Como mitigación temporal, se recomienda eliminar los módulos esp4, esp6 y rxrpc que disparan la vulnerabilidad hasta que lleguen los parches de cada distribución
Resumen general
- Es una clase de bug que corrompe el miembro
fragde la estructurask_buff, una extensión de la misma clase de errores a la que pertenecen Dirty Pipe y Copy Fail - Al encadenar las vulnerabilidades xfrm-ESP Page-Cache Write y RxRPC Page-Cache Write, es posible obtener privilegios de root en las principales distribuciones de Linux
- Como es un bug lógico determinista, no depende de una ventana de tiempo, por lo que no requiere condición de carrera
- Incluso si el exploit falla, no provoca kernel panic, y la tasa de éxito es muy alta
Por qué se encadenaron dos vulnerabilidades
- xfrm-ESP Page-Cache Write ofrece un potente primitivo STORE arbitrario de 4 bytes similar a Copy Fail y está presente en la mayoría de las distribuciones, pero requiere permisos para crear namespaces
- En Ubuntu, la política de AppArmor puede bloquear la creación de namespaces de usuario sin privilegios, y en ese entorno no se puede disparar xfrm-ESP Page-Cache Write
- RxRPC Page-Cache Write no requiere permisos para crear namespaces, pero el módulo
rxrpc.koen sí no está incluido en la mayoría de las distribuciones- Sin embargo, en Ubuntu el módulo
rxrpc.kose carga por defecto
- Sin embargo, en Ubuntu el módulo
- Al encadenar ambas vulnerabilidades, sus respectivos puntos ciegos se compensan mutuamente, haciendo posible obtener privilegios de root en todas las distribuciones principales
Relación con Copy Fail
- Copy Fail fue la motivación que inició esta investigación
- xfrm-ESP Page-Cache Write comparte el mismo sink que Copy Fail, pero puede dispararse independientemente de si el módulo
algif_aeadestá disponible - Incluso los sistemas que aplicaron la mitigación publicada para Copy Fail (lista negra de
algif_aead) siguen siendo vulnerables a Dirty Frag
Alcance del impacto
- xfrm-ESP Page-Cache Write: desde el commit
cac2661c53f3(2017-01-17) hasta upstream - RxRPC Page-Cache Write: desde el commit
2dc334f1a63a(2023-06) hasta upstream - La vida útil efectiva de la vulnerabilidad es de aproximadamente 9 años
- Versiones de distribuciones en las que se completaron las pruebas:
- Ubuntu 24.04.4: 6.17.0-23-generic
- RHEL 10.1: 6.12.0-124.49.1.el10_1.x86_64
- openSUSE Tumbleweed: 7.0.2-1-default
- CentOS Stream 10: 6.12.0-224.el10.x86_64
- AlmaLinux 10: 6.12.0-124.52.3.el10_1.x86_64
- Fedora 44: 6.19.14-300.fc44.x86_64
Medidas de mitigación
- Debido a que se rompieron el calendario de divulgación responsable y el embargo, no existe parche para ninguna distribución
- Como mitigación temporal, se proporciona el siguiente comando para eliminar los módulos donde se presenta la vulnerabilidad:
sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"- Registra los módulos
esp4,esp6yrxrpcen/etc/modprobe.d/dirtyfrag.confcomo lista negra y luego los descarga
- Registra los módulos
- Será necesario aplicar las actualizaciones una vez que cada distribución haya hecho el backport de los parches
Antecedentes de la divulgación
- Tras coordinarse con los mantenedores de linux-distros@vs.openwall.org, se publicó la documentación de Dirty Frag a petición de ellos
- El embargo ya se rompió por factores externos, y actualmente no existen parches ni CVE
- El PoC se publicó en coordinación con linux-distros con el objetivo de proporcionar información precisa, y se prohíbe su uso en sistemas no autorizados
2 comentarios
Comentarios de Hacker News
Esto es muy parecido a Copy Fail tanto en la causa raíz como en la forma de explotación.
Me parece un buen ejemplo de algo que es fácil perder cuando le delegas mucho trabajo a un LLM: la exploración. Siento que hacer investigación de vulnerabilidades con IA bloquea bastante la creatividad. En un flujo donde preguntas y obtienes una respuesta de inmediato, dejas de ver qué más hay alrededor. Es como un genio que te da exactamente lo que pediste y nada más.
El investigador que descubrió Copy Fail dependió bastante de la IA después de ver algo sospechoso; si hubiera revisado mucho código por su cuenta, probablemente habría tenido más oportunidades de encontrar bugs gemelos como este. Al mismo tiempo, si hubiera usado prompts un poco menos directivos, parece probable que incluso los LLM actuales hubieran encontrado estos bugs. Es un caso bastante curioso de sinergia negativa: trabajaron juntos y el rendimiento empeoró.
En copy.fail se arregló otra cosa, y la gente le echó la culpa demasiado rápido a AF_ALG.
[edición: sí, es el mismo problema de authencesn. En el código https://github.com/V4bel/dirtyfrag/blob/892d9a31d391b7f0fccb... authencesn solo aparece en comentarios, pero igual es el mismo problema]
[edición 2: el problema de RxRPC es aparte; aquí estoy hablando del lado de ESP]
Entiendo el punto sobre la creatividad. Como cualquier herramienta, la IA puede estrecharte la visión. Es difícil usarla solo como apoyo sin entregarle por completo el flujo de trabajo.
Salvo que ambas vulnerabilidades se hubieran divulgado juntas como una sola, me pregunto en qué escenario contrafactual diríamos que “exploró lo suficientemente bien”.
“Como se rompió el embargo, no hay parches ni CVE para estas vulnerabilidades”.
Enlace: https://github.com/V4bel/dirtyfrag
Análisis detallado: https://github.com/V4bel/dirtyfrag/blob/master/assets/write-...
La parte importante es esta: “Copy Fail fue la motivación para empezar esta investigación. En particular, la escritura en page cache de xfrm-ESP dentro de la cadena de vulnerabilidades Dirty Frag comparte el mismo sink que Copy Fail. Sin embargo, se activa sin importar si el módulo algif_aead está disponible. En otras palabras, incluso en sistemas donde se aplicó la mitigación publicada para Copy Fail, que consiste en poner algif_aead en blacklist, Linux sigue siendo vulnerable a Dirty Frag”.
La mitigación sería la siguiente, aunque no la probé ni la verifiqué personalmente: “Como se rompió el cronograma de divulgación responsable y el embargo, no hay parche en ninguna distribución. Elimina los módulos que disparan la vulnerabilidad con el siguiente comando”.
sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"En la conversación sobre la mitigación se dice que hace falta reiniciar o, si la máquina ya fue explotada, después del comando anterior habría que ejecutar lo siguiente:
sudo echo 3 > /prox/sys/vm/drop_cachessudo echo 3 > /prox/sys/vm/drop_caches, sudo no hace efecto. sudo ejecuta solo el echo; la escritura real no pasa por sudo.Y si la máquina ya fue explotada, para ese punto ya es demasiado tarde. Cualquier cosa en el disco pudo haberse corrompido, así que habría que reconstruir la imagen completa del disco.
sudo echoy la redirección así desde un shell sin sudo.echo 3 | sudo tee /proc/sys/vm/drop_cacheso
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'Y además corregí el typo de
/proc.echo 1 > .... No hace falta vaciar todo; con1basta para limpiar solo la page cache.Lo probé localmente en Ubuntu 26.04: ejecuté el exploit y obtuve root, configuré la mitigación y, al volver a ejecutar
susin argumentos, me dio root de inmediato sin pedir contraseña. Después de vaciar la page cache,suvolvió a pedir contraseña.Necesitamos una forma sencilla de garantizar que solo se carguen módulos del kernel que estén en una whitelist. Ya me cansé de seguir poniendo en blacklist módulos que ni siquiera necesito.
Lo pregunto otra vez: ¿por qué en copy.fail toda la culpa se la lleva algif_aead? El que hace estupideces es authencesn.
authencesn no se arregló, y ahora estamos viendo el resultado. Resulta que se puede llegar a la misma, o probablemente la misma, escritura fuera de límites a través de sockets de red comunes.
Ojalá se les hubiera ocurrido, pero no pasó.
[edición: hablo del problema a través de ESP. El problema de RxRPC, según entiendo, es completamente aparte]
Si esto de verdad funciona en todas las distribuciones principales, me sigue sorprendiendo lo irresponsables que son los maintainers. ¿Por qué hay funciones opcionales del kernel activadas por defecto si probablemente no le sirven ni al 0.1% de los usuarios?
Me recuerda a la práctica de las distribuciones Linux de 1999 de instalar por defecto decenas de servicios de red expuestos a internet. Pero ya no estamos en 1999.
Me acuerdo de los primeros años de Linux, cuando corrías
make menuconfigy elegías exactamente qué funciones querías en el kernel. La verdad, no tengo ganas de volver a esa época.Dicho eso, un objetivo fácil de mejora aquí sería RHEL. RHEL no deja muchos de esos componentes como módulos cargables, sino que los compila directo dentro del kernel, así que mitigaciones como la de copy fail eran imposibles. Quizá sí podrían reducir un poco eso.
Los maintainers de distribuciones Linux son de los mantenedores de software más responsables del planeta. Sus prácticas de seguridad son muchísimo mejores que las de esos gestores de paquetes ridículos de lenguajes de programación: mantienen una lista curada de paquetes, revisan cambios, corrigen bugs, resuelven problemas complejos de empaquetado, hacen backports, usan lanzamientos graduales, distribuyen archivos por mirrors de todo el mundo y verifican criptográficamente todos los archivos. Y no olvidemos que además hacen todo eso gratis.
Si el atacante ya logró todo eso, la situación ya está mal. Que con esto además escale a root sería una de las preocupaciones menores en ese punto.
Como puso otra persona más abajo: https://xkcd.com/1200/
Antes de asustarse, la gente debería entender qué es realmente esta vulnerabilidad.
Después de tantos años, por fin llegamos al punto de “con suficientes ojos, todos los bugs son superficiales”, y la verdad se siente bastante feo. ¿A partir de ahora habrá que hacer actualizaciones del kernel varias veces por semana?
Me pregunto cómo se rompió el embargo. ¿Hubo una filtración, o fue que un tercero lo encontró de forma independiente?
Linux es open source, así que todos los parches que corrigen bugs de seguridad son visibles de inmediato para todo el mundo. No hay forma de evitarlo con la manera en que se desarrolla el kernel. Eso que la gente llama “embargo” es la idea bastante tonta de que, si no escribes de frente “THIS IS A LPE” en la descripción del parche y todos se quedan callados, entonces puedes fingir que la vulnerabilidad no se filtró hasta que salga el mensaje “oficial” en la lista de correo.
Tal vez antes ese enfoque era medio defendible, pero en la era de los LLM no solo es tonto sino peligroso, porque puedes meter automáticamente los diffs de la lista de correo en un pipeline con el modelo más reciente y hacer que identifique si un parche corrige un problema de seguridad.
https://x.com/encrypted_past/status/2052409822998392962
¿Alguien sabe si Debian es vulnerable? Probé el exploit en máquinas con Debian 12 y Debian 13, pero no logré reproducirlo yo mismo.
Para quien en Bookworm no use el stream de seguridad de paquetes de Debian, el kernel 6.1.0-42-amd64 en realidad es inmune a copy.fail. Que también parezca inmune a dirtyfrag es sorprendente. Si todavía no lo han parcheado en el stream de seguridad, podrías elegir una versión de kernel que conserve el commit 2b8bbc64b5c2. Sospecho que ese mismo commit podría estar haciendo que algunas versiones del kernel de Debian 12 sean accidentalmente seguras frente a dirtyfrag.
Lo ejecuté en un contenedor
ubuntu:latestcon un nuevo usuario por defecto.git clone https://github.com/V4bel/dirtyfrag.git && cd dirtyfrag && gcc -O0 -Wall -o exp exp.c -lutil && ./expResultado:
dirtyfrag: failed (rc=3)¡Buena noticia!
copy fail sí puede usarse para escapar de contenedores (https://github.com/Percivalll/Copy-Fail-CVE-2026-31431-Kuber...), así que supongo que aquí solo haría falta un pequeño cambio en el exploit.
Comentarios en Lobste.rs
Vaya semana para administrar servidores Linux compartidos. Aun así, me gusta que esta divulgación vaya directo al grano
Aunque no entiendo por qué en las guías de mitigación todos ocultan
stderrEdit: esto dice que fue reportado el 30 de abril, “inspirado” por copy.fail, así que ¿lo descubrieron en menos de un día? Impresionante
Como alguien con privilegios de sudo en un servidor compartido bastante grande, también me pregunto si sería buena idea compilar el kernel uno mismo incluyendo la menor cantidad posible de módulos. No he analizado a fondo las ventajas y desventajas, pero parece que eso podría haber evitado ambas vulnerabilidades de escalación local de privilegios de esta semana
Edit 2:
Oh, esto no requiere
setuid. Qué bueno que lo incluyeron¿Sería posible y razonable tomar la lista de módulos del kernel cargados en un sistema en ejecución y usarla como lista permitida para
modprobeen ese sistema?Tanto CopyFail como DirtyFrag parecen abusar de módulos del kernel que no estaban cargados en ninguno de los sistemas que revisé. Si es así, ¿bloquear módulos que claramente no parecen necesarios no podría mitigar preventivamente algunos ataques?
2026-05-07: Detailed information and the exploit for this vulnerability were published publicly by an unrelated third party, breaking the embargo.No entiendo cómo se permite algo así. Se siente realmente absurdo que información de este nivel termine en un entorno tan poco confiable
Cualquier tercero que estuviera observando los commits de Linux podría haber seguido las mismas pistas y creado un exploit
Aquí el “entorno poco confiable” es internet entero, y en la práctica casi no existe algo que realmente pueda llamarse aislamiento. Siempre fue así, pero ahora solo quedó más claro. También vale la pena leer la publicación reciente de Stefan Eissing sobre cómo un bug de Apache httpd fue redescubierto dos veces antes de que saliera la corrección
¿Hay alguna manera de probar si los módulos afectados realmente no pueden cargarse?
Con CopyFail me equivoqué al aplicar la mitigación inicial. El nombre del archivo dentro de
/etc/modprobe.d/no terminaba en.conf, y no me di cuenta hasta ejecutar el comando de prueba de https://news.ycombinator.com/item?id=47954159. ¿Habrá comandos parecidos para los módulosesp4/esp6/rxrpc?modprobey me salió el mismo error que la vez pasadaTambién hay un código de prueba de concepto adjunto, aunque todavía no he intentado usarlo