cd ~/blog

~/vulns/linux-capabilities-privesc.md

Linux Capabilities Privesc

privesc 18-06-2026
privesccapabilitiesLinux

~2 min de lectura


1. Descripción técnica del ataque

Las Linux capabilities dividen los privilegios tradicionalmente asociados a root en unidades más finas, de modo que un binario pueda recibir solo el permiso concreto que necesita en lugar del bit SUID completo. Por ejemplo, ping necesita abrir sockets raw, lo que se concede con cap_net_raw en lugar de hacerlo SUID root.

El problema surge cuando un binario recibe una capability peligrosa que puede abusarse para ejecutar código o cambiar de identidad. Las más explotables son:

  • cap_setuid — permite al proceso cambiar su UID; si un intérprete (python, perl, gdb, etc.) la tiene, puede hacer setuid(0) y convertirse en root.
  • cap_setgid — equivalente para el GID.
  • cap_dac_read_search / cap_dac_override — saltarse comprobaciones de permisos de lectura/escritura sobre cualquier archivo.
  • cap_sys_admin, cap_sys_ptrace, cap_chown — diversos abusos hacia root.

El sufijo +ep (effective, permitted) indica que la capability está activa para el binario.

2. Impacto de la vulnerabilidad

  • Escalada de privilegios a root cuando un binario con una capability peligrosa permite ejecutar código arbitrario (intérpretes, depuradores).
  • Lectura/escritura de archivos protegidos (con cap_dac_*), incluyendo /etc/shadow.
  • A menudo pasa desapercibida porque el binario no tiene el bit SUID, lo que la hace fácil de olvidar en un endurecimiento.

3. Historia y evolución

  • Las capabilities se introdujeron en el kernel de Linux a partir de la serie 2.2 (POSIX capabilities) y se ampliaron con file capabilities en 2.6.24.
  • Su mala configuración es un vector de escalada cada vez más común a medida que los sistemas reemplazan binarios SUID por capabilities; está ampliamente documentada en GTFOBins.

4. Factores que la hacen posible

  1. Un binario con una capability peligrosa asignada (especialmente cap_setuid).
  2. Que ese binario permita ejecutar código o leer/escribir archivos arbitrarios (python, perl, ruby, gdb, tar, etc.).
  3. Acceso de ejecución al binario por parte del atacante.

5. Detección

  • Listar binarios con capabilities en todo el sistema:
/usr/sbin/getcap -r / 2>/dev/null
# /usr/bin/ping cap_net_raw=ep
# /usr/bin/gdb cap_setuid=ep
  • Herramientas como LinPEAS marcan automáticamente las capabilities peligrosas.

6. Mitigación

  1. Asignar solo las capabilities estrictamente necesarias y nunca cap_setuid/cap_setgid a intérpretes o depuradores.
  2. Eliminar capabilities innecesarias: setcap -r <binario>.
  3. Auditar periódicamente con getcap -r /.
  4. Aplicar el principio de mínimo privilegio en los despliegues.

7. Ejemplo de explotación real

gdb tiene cap_setuid, lo que permite invocar setuid(0) y lanzar una shell de root:

killer@lower6:~$ /usr/sbin/getcap -r / 2>/dev/null
/usr/bin/ping cap_net_raw=ep
/usr/bin/gdb cap_setuid=ep

killer@lower6:~$ gdb -nx -ex 'python import os; os.setuid(0)' -ex '!bash' -ex quit
root@lower6:~#

Otros ejemplos (de GTFOBins) con cap_setuid:

# python
./python -c 'import os; os.setuid(0); os.system("/bin/sh")'
# perl
./perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'

8. Clasificación

  • Tipo: Privilege Escalation / Security Misconfiguration
  • CWE:
    • CWE-250 – Execution with Unnecessary Privileges
    • CWE-732 – Incorrect Permission Assignment for Critical Resource

9. Resumen

Las Linux capabilities fragmentan los privilegios de root; cuando un binary que puede ejecutar código (gdb, python, perl…) recibe una capability peligrosa como cap_setuid, se puede escalar a root sin necesidad de SUID. Se detectan con getcap -r / y se explotan según GTFOBins. La defensa es asignar solo lo imprescindible y auditar. Relacionado con Writable Critical Files Privesc y el abuso de SUID/sudo.

// relacionados