In una parola, "no".
Linux non fa realmente distinzioni tra eseguibili e script; l' #!
all'inizio è un modo per dire al kernel quale programma da eseguire per valutare l'ingresso ma non è l'unico modo in cui uno script può essere eseguito.
Quindi, per esempio, se ho una sceneggiatura
$ cat x
#!/bin/sh
echo hello
Quindi posso eseguirlo con il comando
$ ./x
Ciò indurrà il kernel a tentare di eseguirlo, individuare #!
e quindi eseguire effettivamente /bin/sh x
.
Tuttavia, potrei anche eseguire una di queste varianti:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
o anche
. ./x
Quindi, anche se il kernel ha cercato di imporre la firma a exec
livello, possiamo bypassarlo eseguendo solo l'interprete con lo script come parametro.
Ciò significa che il codice di firma dovrebbe trovarsi nell'interprete stesso. E cosa impedirebbe a un utente di compilare la propria copia di una shell senza il codice di applicazione della firma?
La soluzione standard a questo non è usare la firma, ma usare i controlli di accesso obbligatori (MAC), come SELinux
. Con i sistemi MAC è possibile specificare esattamente ciò che ogni utente può eseguire e livelli di transizione. Quindi, ad esempio, puoi dire "gli utenti normali possono eseguire qualsiasi cosa tranne che i processi del server Web e CGI possono accedere solo alle cose dalla /var/httpd
directory; tutto il resto viene rifiutato".