En una palabra, "no".
Linux realmente no diferencia entre ejecutables y scripts; el #!
al principio es una forma de decirle al núcleo qué programa se ejecute para evaluar la entrada pero no es la única forma en que un script puede ser ejecutado.
Entonces, por ejemplo, si tengo un script
$ cat x
#!/bin/sh
echo hello
Entonces puedo ejecutar esto con el comando
$ ./x
Eso hará que el núcleo intente ejecutarlo, detecte #!
y luego se ejecute efectivamente /bin/sh x
.
Sin embargo, también podría ejecutar cualquiera de estas variantes:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
o incluso
. ./x
Entonces, incluso si el núcleo intentó imponer la firma en la exec
capa, podemos evitar esto ejecutando solo el intérprete con el script como parámetro.
Esto significa que el código de firma debería estar en el propio intérprete. ¿Y qué impediría a un usuario compilar su propia copia de un shell sin el código de cumplimiento de firma?
La solución estándar para esto no es usar la firma, sino usar los Controles de acceso obligatorios (MAC), como SELinux
. Con los sistemas MAC puede especificar exactamente lo que cada usuario puede ejecutar y hacer la transición de capas. Entonces, por ejemplo, puede decir "los usuarios normales pueden ejecutar cualquier cosa menos que el servidor web y los procesos CGI solo puedan acceder a cosas del /var/httpd
directorio; todo lo demás se rechaza".