Hola a todos. Nos estamos poniendo manos a la obra activamente y ya estamos preparando muchos lanzamientos potentes para enero. Entre otras cosas, se ha anunciado la inscripción para una nueva transmisión del curso favorito de todos.
Los permisos de archivos ofrecen una alternativa segura a los ejecutables SUID, pero pueden parecer un poco confusos al principio.
Todos sabemos que los binarios
Le ahorraré algo de tiempo si desea evitar leer el artículo anterior en detalle: Esencialmente, los permisos de archivos permiten procesos que se ejecutan como root y, por lo tanto, se les permite hacer algo para conservar ciertas capacidades, limitadas.
Los permisos son excelentes para los servicios que normalmente siempre se ejecutan como root, pero ¿qué pasa con las utilidades de línea de comandos? Afortunadamente, esto también es compatible siempre que tengas instaladas las utilidades adecuadas. Si está utilizando Ubuntu, necesitará, por ejemplo, el paquete libcap2-bin
. También necesitarás ejecutar un kernel no arcaico (de la versión 2.6.24).
Estas funciones permiten asociar permisos con archivos ejecutables, similar a configurar el bit SUID, pero solo para un conjunto específico de permisos. Utilidad setcap
Se utiliza para agregar y eliminar permisos de un archivo.
El primer paso es seleccionar los permisos que necesita. Por el bien de este artículo, supongo que existe una herramienta de diagnóstico de red llamada tracewalk
, que debería poder utilizar CAP_NET_RAW
.
Suponiendo que está en el directorio donde se encuentra el binario tracewalk
, puedes agregar este permiso de esta manera:
sudo setcap cap_net_raw=eip tracewalk
Ignora el sufijo por ahora =eip
Para la resolución, hablaré de eso en un par de segundos. Tenga en cuenta que el nombre del permiso está en minúsculas. Ahora puedes comprobar si has configurado los permisos correctamente con:
setcap -v cap_new_raw=eip tracewalk
O puede enumerar todos los permisos establecidos para un ejecutable determinado:
getcap tracewalk
Como referencia, también puedes eliminar todos los permisos del ejecutable con:
setcap -r tracewalk
En este punto, debería poder ejecutar el ejecutable como un usuario sin privilegios y debería poder trabajar con sockets sin formato, pero no tener ninguno de los otros privilegios que tiene el usuario root.
Entonces, ¿qué significa este extraño sufijo? =eip
? Esto requiere cierta comprensión de la naturaleza de los permisos. Cada proceso tiene tres conjuntos de permisos: efectivo, heredable y permitido:
- Eficaz Los permisos son aquellos que definen lo que realmente puede hacer un proceso. Por ejemplo, no puede tratar con enchufes sin procesar si
CAP_NET_RAW
no está en el conjunto efectivo. - Disponible Los permisos son aquellos que un proceso puede tener si los solicita mediante la llamada adecuada. Impiden que un proceso realmente haga algo a menos que haya sido escrito específicamente para solicitar dicho permiso. Esto permite escribir procesos para agregar permisos críticos al conjunto efectivo solo durante el período en el que realmente se requieren.
- Heredable Los permisos son aquellos que se pueden heredar en el conjunto accesible del proceso hijo generado. durante la cirugía
fork()
oclone()
el proceso hijo siempre recibe una copia de los permisos del proceso padre, ya que todavía está ejecutando el mismo ejecutable en ese momento. Un conjunto heredable se utiliza cuandoexec()
(o equivalente) se llama para reemplazar el archivo ejecutable por otro. En este punto, el conjunto disponible del proceso queda enmascarado por el conjunto heredable para obtener el conjunto accesible que se utilizará para el nuevo proceso.
Entonces la utilidad setcap
nos permite agregar los permisos de estos tres conjuntos de forma independiente para un ejecutable determinado. Tenga en cuenta que el significado de grupos se interpreta de forma ligeramente diferente para los permisos de archivos:
- Disponible Los permisos de archivo son aquellos que siempre están disponibles para un archivo ejecutable, incluso si el proceso principal que lo llamó no los tenía. Solían llamarse permisos “forzosos”.
- Heredado Los permisos de archivo definen una máscara adicional que también se puede usar para eliminar permisos del conjunto del proceso de llamada. Se aplican además del conjunto heredado del proceso de llamada, por lo que el permiso se hereda sólo si existe en ambos conjuntos.
- Eficaz Los permisos de archivos son en realidad un solo bit, no un conjunto, y si se establecen, significa que todo el conjunto disponible también se copia en el conjunto efectivo del nuevo proceso. Esto se puede utilizar para agregar permisos a procesos que no se escribieron específicamente para solicitarlos. Dado que es un bit, si lo configura para algún permiso, debe configurarse para todos los permisos. Puede considerarlo como un bit heredado porque se usa para permitir que aplicaciones que no los admiten utilicen permisos.
Al especificar permisos a través de setcap
tres cartas e
, i
и p
son eficaz, heredable y accesible conjuntos respectivamente. Entonces, la especificación anterior:
sudo setcap cap_net_raw=eip tracewalk
...indica que la resolución CAP_NET_RAW
debe agregarse a los conjuntos disponibles y heredables y que también debe establecerse el bit efectivo. Esto anulará cualquier permiso establecido previamente en el archivo. Para establecer varios permisos a la vez, utilice una lista separada por comas:
sudo setcap cap_net_admin,cap_net_raw=eip tracewalk
En primer lugar, las capacidades de los archivos no funcionan con enlaces simbólicos: debe aplicarlas al archivo binario en sí (es decir, al destino del enlace simbólico).
En segundo lugar, no trabajan con guiones interpretados. Por ejemplo, si tiene un script de Python al que desea asignar permiso, debe asignarlo al intérprete de Python. Obviamente, este es un posible problema de seguridad porque entonces todos los scripts ejecutados con ese intérprete tendrán el permiso especificado, aunque esto sigue siendo significativamente mejor que convertirlo en SUID. La solución más común parece ser escribir un ejecutable separado en C o equivalente que pueda realizar las operaciones necesarias y llamarlo desde un script. Esto es similar al enfoque utilizado por Wireshark que utiliza un binario /usr/bin/dumpcap
para realizar operaciones privilegiadas:
$ getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
En tercer lugar, los permisos de archivos están deshabilitados si usa una variable de entorno. LD_LIBRARY_PATH
por razones obvias de seguridad(1). Lo mismo se aplica a LD_PRELOAD
, Por lo que yo sé.
1. Dado que un atacante obviamente puede reemplazar una de las bibliotecas estándar y usar LD_LIBRARY_PATH
para forzar que se llame a su biblioteca con preferencia a la del sistema y, por lo tanto, ejecutar su propio código arbitrario con los mismos privilegios que la aplicación que llama.
Eso es todo. Más detalles sobre el programa del curso se pueden encontrar en
Fuente: habr.com