Propósito de permisos como 0111 o 0333

17

¿Cuál es el propósito de los permisos de Linux como 111 o 333 (es decir, el usuario puede ejecutar , pero no puede leer el archivo), si la capacidad de ejecución no implica automáticamente la capacidad de leer?

trolley813
fuente
1
¿Tienes un ejemplo para tal entorno? Creo que tienes razón. No puedes ejecutar lo que no puedes leer. Estas combinaciones son solo teóricas en el espacio de permisos entre 0000 y 0777. Tenga en cuenta que se debe agregar el 0 inicial para mostrar la base octal del número.
ikrabbe
66
A menos que sea un script (por ejemplo, shell-script), en realidad no necesita permiso de lectura para ejecutar un comando. A "normal" ejecutable - por ejemplo. su, bash o vi: solo necesita establecer el bit ejecutable para permitir que un usuario lo ejecute. Un archivo que no se puede leer, no se puede copiar . Por lo tanto, al no permitir que un usuario copie un comando importante para la seguridad (como su), se le impide hacer su propia copia, y también intentar desarmarlo. * BSD tiene varios comandos con ejecución pero sin permiso de lectura.
Baard Kopperud

Respuestas:

25

He jugado con él y, al parecer, los permisos Exec no implican permisos de lectura. Binarios pueden ser ejecutables sin ser legibles:

$ echo 'int main(){ puts("hello world"); }' > hw.c
$ make hw
$ ./hw
hello world
$ chmod 111 hw
$ ./hw 
hello world
$ cat hw
/bin/cat: hw: Permission denied

No puedo ejecutar secuencias de comandos sin embargo, a menos que tengan tanto de lectura y bits de permiso Exec en:

$ cat > hw.sh
#!/bin/bash
echo hello world from bash
^D
$ chmod +x ./hw.sh
$ ./hw.sh 
hello world from bash
$ chmod 111 ./hw.sh
$ ./hw.sh
/bin/bash: ./hw.sh: Permission denied
PSkocik
fuente
44
Esto es correcto ya que el segundo ejemplo usa el #! para empezar, ya que no alcanza la ELF-cabecera y así requiere el archivo para ser legible para que adivinar qué ejecutable para usarlo. Esta es una situación común en la que desea proteger el contenido de los archivos para que no se copien en otras ubicaciones. Un administrador de licencias es un ejemplo común en el que verías esto.
hspaans
1
Tenga en cuenta que aún puede leer un binario solo ejecutable: unix.stackexchange.com/a/34294
小 太郎
66
@hspaans: el kernel maneja el shebang, y al kernel no le importan las pequeñas cosas pintorescas como los permisos. Es la cáscara (o intérprete), que necesita acceso de lectura. El kernel se ejecuta (digamos) /bin/bash hw.shy luego bash intenta abrirse hw.shpara leer (y falla).
Kevin
2
Por mi parte, espero que el núcleo se preocupe por los permisos. Nada más lo hace. Lo que significa la frase aterradora en la publicación de @ Kevin es que el núcleo solo requiere permisos de ejecución para ejecutar archivos, independientemente de si usan el shebang.
Emil Jeřábek apoya a Monica el
2
@ EmilJeřábek El núcleo se preocupa por los permisos al decidir qué puede hacer un proceso de aplicación. Pero dado que es el componente que implementa los permisos, también puede ignorarlos internamente. Por lo tanto, puede leer la línea shebang al determinar cómo ejecutar un archivo interpretado, o leer el contenido de un archivo binario de solo ejecución en la memoria.
Barmar
16

tiene sentido para los directorios, por ejemplo, si mantiene los archivos ejecutables (secretos) en un directorio específico y luego permite que los usuarios llamen a esos archivos sin poder ver el contenido del directorio (¡pero sabiendo que hay un archivo específico después de informarles!). 333 en comparación con 111 permite escribir / borrar archivos a / desde esos directorios sin ser capaz de ver el contenido del directorio.

Afsin Toparlak
fuente
55
En mi Uni, esos permisos se usaron para colocar las tareas en un directorio sin que los estudiantes vieran que otros trabajaban. El profesor era viejo skool.
DarkHeart
@DarkHeart Interesante. Espero que haya tenido que agregar un componente aleatorio a los nombres de archivo, porque de lo contrario, si eso no es un incentivo para intentar copiar de sus compañeros de clase, no sé qué es.
PSkocik
5

Obviamente, no todas las combinaciones son tan útiles, pero para tomar el que menciona específicamente ... En realidad no necesita readpermiso para ejecutar un archivo - solamente executeel permiso - a menos que el archivo en cuestión es un script (por ejemplo, un script de shell ( .sh), perl-escritura ( .pl) y así sucesivamente). Los archivos binarios normales se pueden ejecutar solo con el executepermiso. En * BSD-systmes, varios ejecutables dan executepermiso sin permiso read, especialmente en comandos "importantes para la seguridad", por ejemplo su.

Entonces, ¿por qué no dar a los usuarios readpermiso (y solo executepermiso)? ¡Porque un archivo que no puede ser leído por un usuario, tampoco puede ser copiado por ese usuario! Al eliminar el readpermiso, se evita que los usuarios hagan sus propias copias "personales" de ejecutables, que luego pueden abusar (por ejemplo, obtener SUID=root on).

Y al no tener writepermiso, evita que un archivo se elimine correctamente.

Eso sí, no dar ni read-ni write-permission que el propietario es un poco raro, pero a veces puede ser una buena idea para evitar incluso el ownerde simplemente borrar un archivo. Por supuesto, el owner- por no hablar root- siempre puede eludir este tipo de medidas, si no en otras formas, a continuación, simplemente por chmodel permiso en el archivo.

Baard Kopperud
fuente
"Puede ser una buena idea evitar que incluso ownersolo eliminen un archivo". - excepto que no necesita ningún tipo de permiso en un archivo (leer, escribir o ejecutar) para eliminarlo.
Celada
Los ejecutables listos para usar se pueden usar, por ejemplo, si el ejecutable incorpora una contraseña de base de datos que utiliza cuando se ejecuta para conectarse a una base de datos y hacer su trabajo, pero no necesariamente quiere revelar la contraseña.
Celada
@Celada, es una pregunta antigua, pero ¿no sería un enfoque susceptible de volcar la memoria al buscar las compensaciones de la región de memoria /proc/${PID}/mapsy luego leer las secciones relevantes de la memoria /proc/${PID}/mem? ¿O restringir los permisos en el archivo ejecutable también restringe los permisos de lectura en sus secciones relevantes en la memoria durante la ejecución? (Esto último parece poco probable, OMI.)
Spencer D