Permisos de archivos en Linux

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. "Administrador de Linux". Anticipándonos al lanzamiento, tradicionalmente compartimos traducciones de material útil.

Permisos de archivos en Linux

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 SUID son Mala decisión desde el punto de vista de la seguridad.. Afortunadamente, si su aplicación requiere algunos privilegios limitados, existe una forma más eficiente llamada permisos de archivos.

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. esta listacuando pierden privilegios y son ejecutados por un usuario sin privilegios. Esto significa que si un atacante logra comprometer un proceso mediante un desbordamiento de búfer u otro exploit, no podrá aprovechar nada más que ciertos privilegios mínimos que el proceso realmente necesita.

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 enchufes crudos. Esto normalmente requiere que la aplicación se ejecute como root, pero al visualizar la lista resulta que solo se requiere permiso 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() o clone() 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 cuando exec() (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

Guía de permisos analiza todo esto con más detalle, pero espero que esta publicación haya desmitificado un poco lo que está sucediendo. Sólo quedan algunas advertencias y trucos por mencionar.

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_PATHpara 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 seminario web, que tendrá lugar el 24 de enero.

Fuente: habr.com

Añadir un comentario