Mit einem Wort "nein".
Linux unterscheidet nicht wirklich zwischen ausführbaren Dateien und Skripten. Der #!
Anfang ist eine Möglichkeit, dem Kernel mitzuteilen, welches Programm ausgeführt werden soll, um die Eingabe auszuwerten. Es ist jedoch nicht die einzige Möglichkeit, ein Skript auszuführen.
Also zum Beispiel, wenn ich ein Skript habe
$ cat x
#!/bin/sh
echo hello
Dann kann ich das mit dem Befehl ausführen
$ ./x
Dadurch versucht der Kernel, ihn auszuführen, erkennt den Kernel #!
und wird /bin/sh x
stattdessen effektiv ausgeführt .
Ich könnte aber auch jede dieser Varianten ausführen:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
oder auch
. ./x
Selbst wenn der Kernel versucht hat, das Signieren auf der exec
Ebene zu erzwingen, können wir dies umgehen, indem wir den Interpreter nur mit dem Skript als Parameter ausführen.
Dies bedeutet, dass sich der Signaturcode im Interpreter selbst befinden muss. Und was würde einen Benutzer daran hindern, eine eigene Kopie einer Shell ohne den Signatur-Erzwingungscode zu kompilieren?
Die Standardlösung hierfür ist nicht die Verwendung von Signaturen, sondern die Verwendung von obligatorischen Zugriffskontrollen (Mandatory Access Controls, MAC) wie z SELinux
. Bei MAC-Systemen können Sie genau festlegen, was jeder Benutzer ausführen und Layer wechseln darf. Sie können also beispielsweise sagen, dass "normale Benutzer alles ausführen können, außer dass der Webserver und CGI-Prozesse nur auf Daten aus dem /var/httpd
Verzeichnis zugreifen können ; alles andere wird abgelehnt".