Dirty Frag es una vulnerabilidad de escalada de privilegios local (LPE) en el kernel Linux que permite a un usuario sin privilegios obtener acceso de root. La vulnerabilidad se compone de dos cadenas de exploit separadas, ambas explotando fallos en la forma en que el kernel maneja las operaciones de memoria y criptografía en el page cache.
La primera cadena de exploit, que afecta a los módulos esp4/esp6 (parte de XFRM), abusa de una condición de carrera entre las operaciones de splice() y la descifrado de ESP-in-UDP. Un atacante puede manipular el page cache de un archivo setuid como /usr/bin/su, sobrescribiendo sus primeros 160 bytes con un ELF de shell de root. Esto se logra instalando múltiples Security Associations (SAs) de XFRM, cada una con un fragmento del payload deseado en su campo seq_hi, y luego desencadenando operaciones de splice que fuerzan al kernel a descifrar estos fragmentos directamente en el page cache del archivo objetivo. La clave de esta cadena es la capacidad de controlar el contenido escrito en el page cache a través de los metadatos de XFRM y la ejecución de operaciones de splice.
La segunda cadena de exploit, que afecta al módulo rxrpc/rxkad, explota una vulnerabilidad en la función rxkad_verify_packet_1(). Esta función realiza un descifrado in-place de 8 bytes con IV=0 sobre una página del page cache en un offset específico. Al manipular los parámetros de rxrpc, un atacante puede forzar al kernel a descifrar una sección del archivo /etc/passwd con una clave de sesión controlada por el atacante. El exploit realiza un ataque de fuerza bruta offline para encontrar una clave que, al descifrar el contenido original de /etc/passwd en los offsets 4, 6 y 8, produzca los caracteres deseados (por ejemplo, '::0:0:GGGGGG:') para la entrada de root. Esto efectivamente elimina la contraseña de root y establece su UID y GID a 0, permitiendo el acceso de root sin contraseña a través de su (debido a la opción nullok de PAM).
Ambas cadenas de exploit demuestran fallos críticos en la gestión de memoria y la seguridad criptográfica dentro del kernel, permitiendo la corrupción controlada del page cache. La falta de parches en el momento de la divulgación, debido a la ruptura del embargo, expuso a todas las distribuciones principales de Linux a esta vulnerabilidad universal de LPE.