desarrollo-web-br-bd.com

¿Cómo pueden los usuarios ejecutar un archivo sin permiso?

Creé un script Bash que hace eco "Hello World". También creé un usuario de prueba, bob, usando adduser.

Nadie tiene permiso para ejecutar ese archivo como lo indica ls:

$ ls -l hello.sh 
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh

Como podemos ver en lo anterior, el propietario del archivo es george donde solo tiene acceso de lectura y escritura pero no tiene acceso de ejecución. Pero inicié sesión como george Puedo ejecutar el script directamente:

$ . hello.sh 
Hello World

Para empeorar las cosas, inicio sesión como bob, donde solo he leído el permiso, pero todavía puedo ejecutar el archivo:

$ su bob
Password: 
$ . /home/george/testdir/hello.sh 
Hello World

¿Que esta pasando?

11
Themelis

En sus ejemplos, no está ejecutando los archivos, sino ¡fuente ellos.

La ejecución sería a través de

$ ./hello.sh

y para eso, el permiso de ejecución es necesario. En este caso, se abre un sub Shell en el que se ejecutan los comandos del archivo de script.

¡Abastecimiento, es decir.

$ . hello.sh

(con un espacio en el medio) solamente ¡lecturas el archivo y el Shell desde el que ha llamado . hello.sh command luego ejecuta los comandos directamente como leídos, es decir, sin abrir un sub-Shell. Como el archivo solo se lee, el permiso de lectura es suficiente para la operación. ( También tenga en cuenta que al indicar el nombre del archivo de la secuencia de comandos de esa manera se invoca una búsqueda PATH, así que si hay otra hello.sh en su PATH que se obtendrá! Utilice rutas explícitas, como en . ./hello.sh para asegurarse de que obtiene "la correcta".)

Si desea evitar que eso suceda, también debe eliminar el permiso de lectura para cualquier usuario que no deba utilizar el script. Esto es razonable de todos modos si realmente le preocupa el uso no autorizado del script, ya que

  • los usuarios no autorizados pueden omitir fácilmente el permiso de ejecución faltante simplemente copiando y pegando el contenido del script en un nuevo archivo para que puedan otorgarse permisos de ejecución, y
  • como señaló Kusalananda, de lo contrario, un usuario no autorizado aún podría usar cómodamente el script llamándolo a través de
    sh ./hello.sh
    
    en vez de
    ./hello.sh
    
    porque esto solo requiere permisos de lectura en el archivo de secuencia de comandos (consulte esta respuesta por ejemplo).

Como nota general , tenga en cuenta que existen diferencias sutiles entre el abastecimiento y la ejecución de un script (vea esta pregunta por ejemplo) .

27
AdminBee

El permiso de ejecución simplemente significa que este archivo puede ser ejecutado. Sin embargo, cuando lo obtiene (. hello.sh o source hello.sh) o cuando lo pasa como argumento a un intérprete de Shell (sh hello.sh), no estás ejecutando el archivo, estás ejecutando otro comando (. o sh) y pasando el archivo como argumento a ese comando.

Entonces, para responder a su pregunta, la razón por la que puede "ejecutar" el archivo con . hello.sh es la misma razón por la que puedes ejecutar cat hello.sh: solo eres leyendo el archivo, no ejecutándolo.

Para ilustrar:

$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh

$ cat ./foo.sh 
#!/bin/sh
echo Hello

$ ./foo.sh
bash: ./foo.sh: Permission denied

$ sh ./foo.sh
Hello

Como puede ver, en realidad no puedo ejecutar el script, pero puedo leerlo, ya sea con cat o con .-perfectamente bien.

12
terdon

La versión muy corta es: no estás ejecutando el archivo. Estás leyendo en el Shell, que luego lo ejecuta.

Tenga en cuenta que algunos intérpretes de idiomas verifican los permisos de ejecución de un archivo que se les pide que ejecuten y se negarán a hacerlo si el usuario no tiene los permisos adecuados. Pero esa es una verificación completamente discrecional por parte del autor de ese intérprete en particular, y el sistema operativo no la aplica.

Hagamos un pequeño experimento mental.

Creo que ambos podemos estar de acuerdo en que si un programa tiene permisos ejecutables, se me debería permitir ejecutar este programa. Creo que también podemos estar de acuerdo en que este programa debería poder imprimir la cadena "Hello World" en la consola.

Además, probablemente también podamos estar de acuerdo en que un programa debería poder leer un archivo siempre que ese archivo tenga permisos de lectura. Y realmente no importa cuál sea el contenido de ese archivo, siempre que el archivo tenga el bit de permiso de lectura establecido, el programa debería poder leerlo.

De acuerdo, entonces, dado que hemos acordado que el programa debería poder imprimir "Hello World" en la consola y hemos acordado que el programa debería poder leer el archivo, lógicamente también debe aceptar que el programa debería poder lea el archivo y imprima "Hello World" en la consola. Y también hemos dicho que si el programa puede o no leer el archivo depende de los permisos y no del contenido, también debería permitirse leer el archivo e imprimir "Hello World" en la consola si el contenido del archivo es echo Hello World.

Ahora, ¿puede aceptar también que, dado que el programa puede leer el archivo y que el programa puede imprimir "Hello World" en la consola, también puede verificar el contenido del archivo y solo imprime "Hello World" en la consola si el contenido del archivo es echo Hello World?

Bueno, pero luego es "interpretando", en otras palabras ejecutando el archivo, y acabas de estar de acuerdo conmigo en cada paso del camino que debería permitirse ¡Haz eso!

Y eso es exactamente lo que está sucediendo aquí. El Shell simplemente está leyendo un archivo de texto, lo cual está permitido porque el archivo de texto tiene permisos de lectura. Y el Shell está ejecutando las instrucciones en el archivo de texto, lo cual está permitido porque el Shell tiene permisos de ejecución.

5
Jörg W Mittag