¿Cuál es un caso de uso válido para un permiso de archivo "ejecutar solo"?

20

Estaba leyendo sobre chmod y sus modos octales . Vi que 1solo se ejecuta. ¿Cuál es un caso de uso válido para un permiso de ejecución solamente? Para ejecutar un archivo, uno normalmente querría leer y ejecutar el permiso.

$ echo 'echo foo' > say_foo
$ chmod 100 ./say_foo
$ ./say_foo
bash: ./say_foo: Permission denied
$ chmod 500 ./say_foo
$ ./say_foo
foo
popedotninja
fuente

Respuestas:

41

Los scripts de shell requieren el permiso de lectura para ejecutarse, pero los archivos binarios no:

$ cat hello.cpp
#include<iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
    return 0;
}
$ g++ -o hello hello.cpp
$ chmod 100 hello
$ ./hello
Hello, world!
$ file hello
hello: executable, regular file, no read permission

Mostrar los contenidos de un archivo y ejecutarlos son dos cosas diferentes. Con los scripts de shell, estas cosas están relacionadas porque se "ejecutan" "leyéndolas" en un nuevo shell (o el actual), si perdona la simplificación. Es por eso que necesita poder leerlos. Los binarios no usan ese mecanismo.

Para los directorios, el permiso de ejecución es un poco diferente; significa que puede hacer cosas a los archivos dentro de ese directorio (por ejemplo, leerlos o ejecutarlos). Entonces, supongamos que tiene un conjunto de herramientas en el /toolsque desea que las personas puedan usar, pero solo si saben de ellas. chmod 711 /tools. Luego, las cosas ejecutables /toolspueden ejecutarse explícitamente (por ejemplo /tools/mytool), pero ls /tools/serán denegadas. Del mismo modo, se podrían almacenar documentos en los /private-docsque se podrían leer si y solo si se conocen los nombres de los archivos.

DopeGhoti
fuente
1
Por cierto, ya no tiene sentido configurar ejecutar solo en los binarios del sistema a menos que ejecute ftp anónimo.
Joshua
1
Además, establecer el bit ejecutable en un directorio le permite cdhacerlo.
cabeza de jardín
1
También se puede ejecutar
phuclv
1
Por cierto, no hay necesidad de incluir el encabezado C stdio.haquí. Sugiero eliminarlo.
Spikatrix
1
@Kevin: Probablemente porque el hecho de no tener lsy completar la pestaña hace que el trabajo de mantenimiento sea molesto y proporciona poco o ningún beneficio de seguridad real. La mayoría de los archivos en los que un atacante podría estar interesado están en ubicaciones estándar conocidas de todos modos, o sus ubicaciones se pueden descubrir indirectamente a partir de los datos en otros archivos (de lo contrario, ¿cómo sabrían los programas que usan legítimamente esos archivos dónde encontrarlos?).
Ilmari Karonen
4

En Gentoo, a los programas ejecutables que están configurados (configurados para ejecutarse con los permisos de su propietario en lugar de su invocador) se les niega el acceso de lectura (modo 4711). Esto es para agregar una capa de protección contra la explotación de errores para ayudar a escalar los privilegios.

Si un atacante sin privilegios puede leer un archivo setuid y conoce un error que permite un ataque de estilo de retorno a la libc , puede usar el contenido del archivo para predecir dónde es probable que se encuentren ciertas funciones o bibliotecas útiles. colocado en la memoria cuando se invoca el programa.

Los sistemas modernos a menudo incluyen protecciones adicionales que son más efectivas, como ASLR , pero las restricciones presentes en las plataformas de 32 bits pueden dejarlos más fácilmente explotables.

Nadie
fuente
Tenga en cuenta que la protección solo se aplica a las distribuciones basadas en fuente. Con distribuciones basadas en binarios, el atacante puede mirar su propia copia del programa para descubrir dónde están las cosas interesantes.
Mark
Un binario solo ejecutable también puede tener contraseñas integradas. El usuario puede ejecutar el programa y puede enviar la contraseña al servidor, pero el usuario no podrá obtener la contraseña del mismo (el sistema tampoco debería permitirles realizar volcados de núcleo).
Barmar
1

Parece que el valor de "ejecutar solo" no tiene mucho uso para un archivo, pero puede usarse para evitar que uno lea el contenido de un directorio.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
popedotninja
fuente
1
Vale la pena mencionar que la razón por la que esto es útil es porque aún puede leer foo / bar si conoce el nombre del archivo. Lo he usado en servidores web.
Random832
0

Debe tener permisos de lectura y ejecución para ejecutar un script. Leer el contenido de un script es lo que le permite ejecutarse, por lo que debe poder hacerlo read and execute. De lo contrario, no puede ejecutar un script sin él.

¿Cuál es un caso de uso válido para un permiso de ejecución solamente?

Seguridad. Algunos pueden querer proteger sus archivos y evitar que otros los ejecuten o usen.

Jordan Savell
fuente
2
chmod 000Tendrá en cuenta los permisos a nadie excepto root. A veces, no es necesario que sea tan extenso solo por protección, depende de las intenciones del usuario. Para, digamos "re-chmod", el archivo vuelve a tener permisos de lectura y escritura en los que tendría que hacerlo root. Si no puede acceder root, será difícil.
Jordan Savell
2
Supongamos que tiene un conjunto de herramientas en el /toolsque desea que las personas puedan usar, pero solo si saben de ellas. chmod 711 /tools. Entonces las cosas ejecutables en /tools se pueden ejecutar de forma explícita, pero ls /tools/se negaron.
DopeGhoti
1
¡Buena respuesta! Me enseñó algo allí también. ¿Por qué los archivos binarios no necesitan el permiso de lectura para ejecutarse?
Jordan Savell
2
Porque mostrar el contenido de un archivo y ejecutarlo son dos cosas diferentes. Los scripts de shell se "ejecutan" "leyéndolos" en un nuevo shell (si perdona la simplificación), razón por la cual necesita poder leerlos. Los binarios no usan ese mecanismo.
DopeGhoti
1
Ah sentido común. Pensé que era algo diferente, ¡gracias!
Jordan Savell