Одним словом "нет".
Linux на самом деле не делает различий между исполняемыми файлами и скриптами; #!
в начале это способ сообщить ядру , что программа для запуска , чтобы оценить вклад , но это не единственный способ , сценарий может быть выполнен.
Так, например, если у меня есть скрипт
$ cat x
#!/bin/sh
echo hello
Тогда я могу запустить это с командой
$ ./x
Это заставит ядро попытаться выполнить его, определить #!
и затем эффективно запустить /bin/sh x
вместо него.
Однако я мог бы также запустить любой из этих вариантов:
$ sh ./x
$ bash ./x
$ cat x | sh
$ cat x | bash
$ sh < x
или даже
. ./x
Таким образом, даже если ядро попыталось навязать подпись на exec
уровне, мы можем обойти это, только запустив интерпретатор со сценарием в качестве параметра.
Это означает, что код подписи должен быть в самом интерпретаторе. И что помешает пользователю скомпилировать собственную копию оболочки без кода принудительного подписания?
Стандартным решением этого является не использование подписи, а использование обязательного контроля доступа (MAC), такого как SELinux
. С системами MAC вы можете точно указать, что каждому пользователю разрешено запускать и переходить слои. Так, например, вы можете сказать, что «обычные пользователи могут запускать что угодно, но веб-сервер и процессы CGI могут получать доступ только к материалам из /var/httpd
каталога; все остальное отклоняется».