Может ли скрипт быть исполняемым, но нечитаемым?

Может ли скрипт быть исполняемым, но нечитаемым?

Можно ли выполнить скрипт, если нет разрешения на его чтение? В режиме root я создал скрипт и хочу, чтобы другой пользователь выполнил этот скрипт, но не прочитал его. Я запретил chmodчтение и запись, но разрешил выполнение, однако в режиме пользователя я увидел сообщение: разрешение отклонено.

решение1

Проблема в том, что запущен не скрипт, а интерпретатор ( bash, perl, python, и т. д.). И интерпретатор должен прочитать скрипт. Это отличается от «обычной» программы, такой как ls, тем, что программа загружается непосредственно в ядро, как это сделал бы интерпретатор. Поскольку само ядро ​​читает программный файл, ему не нужно беспокоиться о доступе на чтение. Интерпретатору нужно прочитать файл скрипта, как обычный файл нужно было бы прочитать.

решение2

Это возможно только для двоичных файлов.

$ chown foo:foo bar
$ chmod 701 bar

Как непривилегированный пользователь:

$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar

$ cat bar
cat: bar: Permission denied

$ ./bar
baz

Теперь, вот в чем загвоздка. Хотя файл не может быть прочитан обычными средствами, вы не можете фактически предотвратить чтение файла. Это на самом деле вызов наhttp://smashthestack.org/(уровень 13). Существует известная утилита, hktraceкоторая позволяет читать файл с помощью ptrace.

решение3

В предыдущих утверждениях есть доля правды. Вы можете настроить скрипт так, чтобы он не был доступен для чтения пользователем, но все еще мог быть выполнен. Процесс немного затянут, но это выполнимо, если сделать исключение в /etc/sudoer, чтобы пользователь мог временно запустить скрипт от своего имени без запроса пароля. Этот метод: - обходит патч setuid для других дистрибутивов. - позволяет временно предоставить повышенные права для определенного скрипта, не предоставляя пользователю права sudo на все.

Следуйте инструкциям в этом посте: Разрешение на выполнение только файла

решение4

Я думаю, это можно сделать с помощью setuid.

За исключением того, что вы не можете, потому что большинство дистрибутивов (судя по всему) отключили это, setuidпотому что это огромная дыра в безопасности. У меня это отключено, так что я не знаю, сработает ли этот ответ, я все равно его публикую, потому что я думаю, что этодолжен.

В любом случае, если бы я хотел сделать то, что хотите вы, и у меня был бы дистрибутив с setuidвключенными скриптами, я бы сделал что-то вроде:

$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!

То есть я бы написал еще один скрипт, единственной целью которого было бы вызвать скрипт, доступный только для чтения, сделать его владельцем root и предоставить ему разрешение setuid. (Вместе с сопутствующим запретом на запись для всех остальных.)

Поскольку функция myscript-nonroot доступна для чтения всем, ее можно читать и выполнять, и к тому времени, когда вы получите строку, в которой вы фактически выполняете свой скрипт ( bash myscript), он будет запущен от имени пользователя root (или любого другого пользователя, точный пользователь не имеет значения, главное, чтобы файл-оболочка принадлежал тому же пользователю).

Связанный контент