Tradicionalmente, un proceso de Linux es privilegiado (ejecutándose como root) o sin privilegios. Los procesos privilegiados no están sujetos a verificaciones de permisos del kernel y, por lo tanto, tienen pleno poder sobre un sistema. Una capacidad es un privilegio distinto e independiente que un proceso puede utilizar para eludir determinadas comprobaciones de permisos. Las capacidades se introdujeron por primera vez en Linux 2.2 y se agregaron varias más en versiones posteriores. Por lo general, se establecen en archivos ejecutables y se otorgan 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 un atacante obtendría 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 kernel de Linux implementa una multitud de capacidades. Algunos de ellos 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:omite la lectura de archivos y las comprobaciones de lectura/ejecución de directorios. Un programa con esta capacidad se puede usar para leer cualquier archivo en el sistema.
- CAP_DAC_OVERRIDE:anula DAC (control de acceso discrecional), es decir, omite las verificaciones de permiso de lectura/escritura/ejecución. Esta capacidad otorga a un ejecutable la capacidad de acceder y modificar cualquier archivo en el sistema de archivos.
- CAP_NET_BIND_SERVICE:permite la vinculación a números de puerto inferiores a 1024.
- CAP_KILL:Omita las verificaciones de permisos para enviar señales a procesos como SIGHUP y SIGKILL.
- CAP_SYS_NICE:Modificar el valor de amabilidad y la prioridad de programación de los procesos, entre otros.
- CAP_SYS_RESOURCE:permite anular varios límites en los 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 capacidades(7).
A los archivos se les pueden asignar capacidades en 3 conjuntos diferentes:permitido, heredable y efectivo. Los subprocesos tienen 2 conjuntos adicionales:ambiente y delimitación. Cada conjunto puede contener cero o más capacidades, con la excepción del conjunto efectivo para archivos, que en realidad es un solo bit. Estos conjuntos definen comportamientos complejos del núcleo que están más allá 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 sistemas con SELinux en modo de aplicación, puede evitar que los procesos aprovechen sus capacidades.
Herramientas requeridas
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 están cubiertos en esta guía.
libcap proporciona getcap y setcap para ver y configurar capacidades de 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 libcap se pueden instalar con:
apt update apt install libcap2-bin
Para instalar en CentOS, use el siguiente comando:
yum install libcap
Para instalar en Fedora, use el siguiente comando:
dnf install libcap
Para instalar en Arch, use el siguiente comando:
pacman -Sy libcap
Uso
getcap simplemente muestra las capacidades asignadas a un archivo, si las hay. Utilice la siguiente sintaxis:
getcap /path/to/binary
Por ejemplo:
Getcap también puede buscar recursivamente con el indicador -r. Por ejemplo:
NOTA:2>/dev/null se usa para evitar saturar la salida con errores de "Operación no admitida", que ocurren cuando getcap intenta obtener las capacidades de los archivos en /sys, /proc, etc. Estos sistemas de archivos virtuales especiales no admiten capacidades.
Para establecer capacidades de archivo con setcap, use la siguiente sintaxis:
setcap CAP+set filename
Por ejemplo, para agregar CAP_CHOWN y CAP_DAC_OVERRIDE a los conjuntos permitidos y efectivos, use:
setcap CAP_CHOWN,CAP_DAC_OVERRIDE+ep file1
Para eliminar capacidades de un archivo, use el indicador -r:
setcap -r filename
Aquí hay algunos ejemplos adicionales:
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
Uso
- El programa filecap hace referencia a 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 le permite especificar conjuntos de capacidades, siempre usa permitido y efectivo al establecer capacidades.
Para ver las capacidades asignadas a un archivo:
filecap /full/path/to/file
Para buscar un directorio recursivamente, use:
filecap /full/path/to/dir
Para buscar en todo el sistema de archivos con filecap, use uno de los siguientes comandos:
filecap / filecap -a
Estos son algunos ejemplos del uso de filecap para examinar archivos y directorios:
Para establecer una capacidad en un archivo, use la sintaxis:
filecap /full/path/to/file cap_name
Por ejemplo:
filecap /usr/bin/tac dac_override
Para eliminar capacidades, use esta sintaxis:
filecap /full/path/to/file none
Aquí hay algunos ejemplos de configuración y eliminación de capacidades usando filecap:
Conclusión
Las capacidades son una característica poderosa del kernel con amplias aplicaciones de seguridad. Deben sustituirse por privilegios completos y SUID raíz siempre que sea posible.