El acceso privilegiado a archivos y directorios en realidad está determinado por las capacidades, no solo por ser root
O no. En la práctica, root
por lo general tiene todas las capacidades posibles, pero hay situaciones en las que todas/muchas de ellas pueden descartarse, o algunas pueden cederse a otros usuarios (sus procesos).
En resumen, ya describió cómo funcionan las comprobaciones de control de acceso para un proceso privilegiado. Así es como lo afectan las diferentes capacidades:
La capacidad principal aquí es CAP_DAC_OVERRIDE
, un proceso que lo tiene puede "omitir la lectura, escritura y ejecución de comprobaciones de permisos de archivos". Eso incluye leer y escribir en cualquier archivo, así como leer, escribir y acceder a directorios.
En realidad, no se aplica a la ejecución de archivos que no están marcados como ejecutables. El comentario en generic_permission
(fs/namei.c
), antes de que el acceso verifique los archivos, dice que
Los DAC de lectura/escritura siempre se pueden anular. Los DAC ejecutables se anulan cuando hay al menos un conjunto de bits exec.
Y el código verifica que haya al menos un x
bit establecido si está intentando ejecutar el archivo. Sospecho que es solo una característica de conveniencia, para evitar ejecutar accidentalmente archivos de datos aleatorios y obtener errores o resultados extraños.
De todos modos, si puede anular los permisos, puede hacer una copia ejecutable y ejecutarla. (Aunque podría hacer una diferencia en teoría para los archivos setuid de un proceso que era capaz de anular los permisos de archivo (CAP_DAC_OVERRIDE
), pero no tenía otras capacidades relacionadas (CAP_FSETID
/CAP_FOWNER
/CAP_SETUID
). Pero teniendo CAP_DAC_OVERRIDE
permite editar /etc/shadow
y cosas por el estilo, por lo que es aproximadamente igual a tener acceso completo a la raíz de todos modos).
También está el CAP_DAC_READ_SEARCH
capacidad que permite leer cualquier archivo y acceder a cualquier directorio, pero no ejecutarlos ni escribir en ellos; y CAP_FOWNER
eso permite que un proceso haga cosas que generalmente están reservadas solo para el propietario del archivo, como cambiar los bits de permiso y el grupo de archivos.
La anulación del bit fijo en los directorios se menciona solo en CAP_FOWNER
, entonces parece que CAP_DAC_OVERRIDE
no sería suficiente ignorar eso. (Le daría permiso de escritura, pero por lo general en los directorios fijos lo tiene de todos modos, y +t
lo limita.)
(Creo que los dispositivos especiales cuentan como "archivos" aquí. Al menos generic_permission()
solo tiene una verificación de tipo para directorios, pero no verifiqué fuera de eso).
Por supuesto, todavía hay situaciones en las que incluso las capacidades no le ayudarán a modificar archivos:
- algunos archivos en
/proc
y/sys
, ya que en realidad no son archivos reales - SELinux y otros módulos de seguridad que podrían limitar la raíz
chattr
inmutable+i
y agregue solo+a
banderas en ext2/ext3/ext4, las cuales detienen incluso a la raíz y evitan también el cambio de nombre de archivos, etc.- sistemas de archivos de red, donde el servidor puede hacer su propio control de acceso, p.
root_squash
en NFS mapea root a nadie - FUSE, que asumo podría hacer cualquier cosa
- montajes de solo lectura
- dispositivos de solo lectura
Eso es exactamente como lo ha notado para los permisos predeterminados:
-
Leer y escribir:
De forma predeterminada, el usuario raíz puede acceder a cualquier archivo del sistema. Puede eliminar este acceso cambiando los atributos como se explica aquí:chattr. Esto luego se vincula a las capacidades. -
Ejecutar:
El usuario raíz no tiene permiso de ejecución a menos que se establezca al menos uno de los bits de ejecución.
El myFile.txt
se obtiene por chmod 000 myFile.txt
.
0 no permission
1 execute
2 write
3 execute + write
4 read
5 read + execute
6 read + write
7 all
---------
significa que no hay permiso para usuario, grupo y otros.
El usuario raíz tiene un acceso sin restricciones posibilidad de modificar este archivo. Se concede la lectura/escritura. Para ejecutar este archivo, el usuario raíz debe hacerlo ejecutable de todos modos. (chmod 100, 010 o 001)