Словом, "ні".
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каталогу; все інше відхилено".