Cómo gestionar las capacidades de los archivos de Linux

Tradicionalmente, un proceso de Linux es privilegiado (se ejecuta como root) o no privilegiado. Los procesos con privilegios no están sujetos a las comprobaciones de permisos del núcleo y, por tanto, tienen pleno poder sobre un sistema. Una capacidad es un privilegio distinto e independiente que puede utilizar un proceso para saltarse ciertas comprobaciones de permisos. Las capacidades se introdujeron por primera vez en Linux 2.2, y se añadieron varias más en versiones posteriores. Suelen establecerse en archivos ejecutables y se conceden automáticamente al proceso cuando se ejecuta un archivo con una capacidad. Las capacidades esencialmente dividen el poder del usuario root en privilegios separados, lo que mejora la seguridad al limitar el acceso que obtendría un atacante al explotar o abusar de un servicio.

Esta guía presentará algunas capacidades de uso común y demostrará cómo se pueden ver y modificar.

Capacidades comunes

El núcleo de Linux implementa una multitud de capacidades. Algunas de ellas son

  • CAP_SYS_ADMIN: Permite una amplia gama de operaciones. Esta capacidad debe evitarse en favor de capacidades más específicas.
  • CAP_CHOWN: Realiza cambios en el ID de usuario y el ID de grupo de los archivos
  • CAP_DAC_READ_SEARCH: Eludir las comprobaciones de lectura de archivos y de lectura/ejecución de directorios. Un programa con esta capacidad puede utilizarse para leer cualquier archivo del sistema.
  • CAP_DAC_OVERRIDE: Anula el DAC (Control de Acceso Discrecional), es decir, evita las comprobaciones de permisos de lectura/escritura/ejecución. Esta capacidad otorga a un ejecutable la capacidad de acceder y modificar cualquier archivo del sistema de archivos.
  • CAP_NET_BIND_SERVICE: Permite enlazar con números de puerto inferiores a 1024.
  • CAP_KILL: Evita las comprobaciones de permisos para enviar señales a los procesos, como SIGHUP y SIGKILL.
  • CAP_SYS_NICE: Modifica el valor de niceness y la prioridad de programación de los procesos, entre otros.
  • CAP_SYS_RESOURCE: Permite anular varios límites de recursos del sistema, como cuotas de disco, límites de tiempo de CPU, etc.

La lista completa está disponible en la página del manual de capabilities(7).

A los archivos se les pueden asignar capacidades en 3 conjuntos diferentes: permitidas, heredables y efectivas. Los hilos tienen 2 conjuntos adicionales: ambiente y límite. Cada conjunto puede contener cero o más capacidades, a excepción del conjunto efectivo para los archivos, que en realidad es un solo bit. Estos conjuntos definen comportamientos complejos del núcleo que están fuera del alcance de esta guía. Al asignar capacidades a los archivos, utilizaremos los conjuntos permitidos y efectivos en la mayoría de los casos.

NOTA: SELinux puede interferir con las capacidades. En los sistemas con SELinux en modo de aplicación, puede impedir que los procesos aprovechen sus capacidades.

Herramientas necesarias

Existen dos paquetes diferentes para la gestión de capacidades: libcap y libcap-ng. Este último está diseñado para ser más fácil que el primero. Ambos se tratan en esta guía.

libcap proporciona getcap y setcap para ver y establecer las capacidades de los archivos, mientras que libcap-ng consolida ambas funciones en una sola herramienta, filecap.

libcap

Instalación

En Debian, Ubuntu y otras distribuciones basadas en Debian, las utilidades de libcap se pueden instalar con:

apt update
apt install libcap2-bin

Para instalar en CentOS, utiliza el siguiente comando:

yum install libcap

Para instalar en Fedora, utiliza el siguiente comando:

dnf install libcap

Para instalar en Arch, utiliza el siguiente comando:

pacman -Sy libcap

Uso

getcap simplemente muestra las capacidades asignadas a un archivo, si las hay. Utiliza la siguiente sintaxis:

getcap /path/to/binary

Por ejemplo:

using getcap

Getcap también puede buscar recursivamente con la bandera -r. Por ejemplo:

using getcap recursively

NOTA: 2>/dev/null se utiliza para evitar saturar la salida con errores de «Operación no soportada», que se producen cuando getcap intenta obtener las capacidades de los archivos en /sys, /proc, etc. Estos sistemas de archivos virtuales especiales no admiten capacidades.

Para establecer las capacidades de los archivos con setcap, utiliza la siguiente sintaxis:

setcap CAP+set filename

Por ejemplo, para añadir CAP_CHOWN y CAP_DAC_OVERRIDE a los conjuntos permitidos y efectivos, utiliza:

setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1

Para eliminar las capacidades de un archivo, utiliza la bandera -r:

setcap -r filename

Aquí tienes algunos ejemplos adicionales:

getcap examples

libcap-ng

Instalación

Para instalar en Debian, Ubuntu y otras distribuciones basadas en Debian:

apt update
apt install libcap-ng-utils

Para instalar en CentOS:

yum install libcap-ng-utils

Para instalar en Fedora:

dnf install libcap-ng-utils

Para instalar en Arch:

pacman -Sy libcap-ng

Utilización

  • El programa filecap se refiere a las capacidades sin el prefijo «CAP_» (por ejemplo, NET_ADMIN en lugar de CAP_NET_ADMIN).
  • filecap no funciona con rutas relativas, espera la ruta completa al pasar archivos o directorios como argumentos.
  • filecap no permite especificar conjuntos de capacidades, siempre utiliza permitidas y efectivas al establecer capacidades.

Para ver las capacidades asignadas a un archivo:

filecap /full/path/to/file

Para buscar en un directorio de forma recursiva, utiliza:

filecap /full/path/to/dir

Para buscar en todo el sistema de archivos con filecap, utiliza uno de los siguientes comandos:

filecap /
filecap -a

Estos son algunos ejemplos del uso de filecap para examinar archivos y directorios:

viewing capabilities with filecap

Para establecer una capacidad en un archivo, utiliza la sintaxis:

filecap /full/path/to/file cap_name

Por ejemplo:

filecap /usr/bin/tac dac_override

Para eliminar capacidades, utiliza esta sintaxis:

filecap /full/path/to/file none

Estos son algunos ejemplos de cómo establecer y eliminar capacidades mediante filecap:

setting and removing capabilities with filecap

Conclusión

Las capacidades son una potente característica del núcleo con amplias aplicaciones de seguridad. Siempre que sea posible, deben sustituir a los privilegios totales y al SUID de root.

Scroll al inicio