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