¿Puede un script ser ejecutable pero no legible?

¿Puede un script ser ejecutable pero no legible?

¿Es posible ejecutar un script si no hay permiso para leerlo? En modo raíz, hice un script y quiero que el otro usuario ejecute este script pero no lo lea. Hice chmodprohibir la lectura y escritura pero permití la ejecución, sin embargo, en modo usuario, vi el mensaje que dice: permiso denegado.

Respuesta1

El problema es que no es el script lo que se ejecuta, sino el intérprete ( bash, perl, python, etc.). Y el intérprete necesita leer el guión. Esto se diferencia de un programa "normal", como ls, en que el programa se carga directamente en el núcleo, como lo haría el intérprete. Dado que el núcleo mismo lee el archivo de programa, no necesita preocuparse por el acceso de lectura. El intérprete necesita leer el archivo de secuencia de comandos, como sería necesario leer un archivo normal.

Respuesta2

Esto sólo es posible para binarios.

$ chown foo:foo bar
$ chmod 701 bar

Como usuario sin privilegios:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

Ahora, aquí está el truco. Si bien el archivo no se puede leer por medios convencionales, en realidad no se puede impedir su lectura. En realidad, esto es un desafíohttp://smashthestack.org/(nivel 13). Existe una utilidad muy conocida llamada hktraceque le permite leer el archivo usando ptrace.

Respuesta3

Hay una verdad a medias en las afirmaciones anteriores. Puede configurar un script para que el usuario no pueda leerlo, pero sí ejecutarlo. El proceso es un poco largo, pero es factible haciendo una excepción en /etc/sudoer para que el usuario pueda ejecutar el script como usted mismo temporalmente sin que se le solicite una contraseña. Este método: - evita el parche setuid para otras distribuciones. - le permite otorgar permisos elevados temporalmente para un script específico sin otorgarle al usuario derechos sudo para todo.

Siga las instrucciones de esta publicación: Permiso de archivo ejecutar solo

Respuesta4

Creo que puedes hacer esto con setuid.

Excepto que no puedes porque la mayoría de las distribuciones (aparentemente) se han setuiddeshabilitado porque es un agujero de seguridad enorme. Está deshabilitado en el mío, así que en realidad no sé si esta respuesta funcionará. La publicaré de todos modos porque creo quedebería.

De todos modos, si quisiera hacer lo que tú querías hacer, y tuviera una distribución setuidhabilitada para scripts, haría algo como:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

Es decir, escribiría otro script cuyo único propósito sea llamar al script de solo lectura de raíz, cambiarlo para que sea propiedad de root y darle el permiso setuid. (Junto con el estado de no escritura del asistente por parte de todos los demás).

Dado que todos pueden leer la función myscript-nonroot, se puede leer y ejecutar, y cuando obtiene dos, la línea donde realmente ejecuta su script ( bash myscript) se ejecuta como root (o quien quiera, el usuario exacto). no importa, siempre y cuando el archivo contenedor sea propiedad del mismo usuario).

información relacionada