En un mot, "non".
Linux ne fait pas vraiment de différence entre les exécutables et les scripts; le #!
début est une façon de dire au noyau quel programme à exécuter pour évaluer l'entrée , mais ce n'est pas le seul moyen d' un script peut être exécuté.
Ainsi, par exemple, si j'ai un script
$ cat x
#!/bin/sh
echo hello
Ensuite, je peux l'exécuter avec la commande
$ ./x
Cela amènera le noyau à essayer de l'exécuter, à repérer #!
puis à exécuter à la /bin/sh x
place.
Cependant, je pourrais également exécuter l'une de ces variantes:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
ou même
. ./x
Donc, même si le noyau a essayé d'imposer la signature au niveau de la exec
couche, nous pouvons contourner cela en exécutant uniquement l'interpréteur avec le script comme paramètre.
Cela signifie que le code de signature devrait être dans l'interpréteur lui-même. Et qu'est-ce qui empêcherait un utilisateur de compiler sa propre copie d'un shell sans le code d'application de la signature?
La solution standard à cela n'est pas d'utiliser la signature, mais d'utiliser des contrôles d'accès obligatoires (MAC), tels que SELinux
. Avec les systèmes MAC, vous pouvez spécifier exactement ce que chaque utilisateur est autorisé à exécuter et à transposer les couches. Ainsi, par exemple, vous pouvez dire "les utilisateurs normaux peuvent exécuter n'importe quoi, mais le serveur Web et les processus CGI ne peuvent accéder qu'aux éléments du /var/httpd
répertoire; tout le reste est rejeté".