Можно ли выполнить скрипт, если нет разрешения на его чтение? В режиме root я создал скрипт и хочу, чтобы другой пользователь выполнил этот скрипт, но не прочитал его. Я сделал, chmod
чтобы запретить чтение и запись, но разрешить выполнение, однако в пользовательском режиме я увидел сообщение, которое говорит: разрешение отказано.
65
Ответы:
Вопрос заключается в том , что сценарий не то , что работает, но переводчик (
bash
,perl
,python
и т.д.). И переводчик должен прочитать сценарий. Это отличается от «обычной» программы, напримерls
, в том, что программа загружается непосредственно в ядро, как это делает интерпретатор. Поскольку само ядро читает программный файл, ему не нужно беспокоиться о доступе для чтения. Интерпретатор должен прочитать файл сценария, так как обычный файл должен быть прочитан.источник
Это возможно только для двоичных файлов.
Как непривилегированный пользователь:
Теперь вот кикер. Хотя файл не читается обычными средствами, вы не можете предотвратить его чтение. Это на самом деле вызов на http://smashthestack.org/ (уровень 13). Существует хорошо известная утилита,
hktrace
которая позволяет вам читать файл используяptrace
.источник
Это невозможно, по крайней мере, в Linux (другие Unices могут разрешить это); Подумайте об этом, когда вы запускаете скрипт, оболочка должна прочитать его, чтобы знать, что делать.
источник
Вы можете, я думаю, сделать это с
setuid
.За исключением того, что вы не можете, потому что большинство дистрибутивов (очевидно)
setuid
отключены, потому что это огромная дыра в безопасности. У меня он отключен, поэтому я не знаю, сработает ли этот ответ, я все равно его публикую, потому что думаю, что должен .Во всяком случае, если бы я хотел сделать то, что вы хотели сделать - и у меня был дистрибутив с
setuid
включенным для сценариев - я бы сделал что-то вроде:То есть я бы написал другой сценарий, единственная цель которого - вызвать сценарий только для чтения с правами root, изменить его на принадлежащий root и дать ему разрешение setuid. (Наряду с сопутствующим незаписываемым статусом всех остальных.)
Поскольку функция myscript-nonroot доступна для чтения всем, ее можно прочитать и выполнить, и к тому времени, когда вы получите две строки, где вы фактически выполняете свой скрипт (
bash myscript
), она запускается от имени пользователя root (или того, кого вы хотите, точного пользователя). не имеет значения, если файл-оболочка принадлежит одному и тому же пользователю.)источник
4
устанавливает УИП бит. См. Раздел «Режимы» на странице руководства chmod на manpagez .755
немного.chmod 755
это то же самое, что 0775 восьмеричный. вокруг этого много путаницы .. На этой странице ( manpagez.com/man/1/chmod ) есть ужасная и ненужная горизонтальная прокрутка, которую я не могу понять ...В этой ситуации я использовал sudo с параметром NOPASSWD, чтобы пользователи могли запускать скрипт, не имея возможности его прочитать.
источник
В предыдущих заявлениях есть половина правды. Вы можете настроить скрипт так, чтобы он не читался пользователем, но оставался исполняемым. Процесс немного затягивается, но его можно выполнить, сделав исключение в / etc / sudoer, чтобы пользователь мог временно запускать скрипт от своего имени без запроса пароля. Этот метод: - обходит патч setuid для других дистрибутивов. - позволяет временно предоставлять повышенные разрешения для конкретного сценария, не предоставляя пользователю права sudo на все.
Следуйте инструкциям на этот пост: разрешение на выполнение файла
источник
Работает на OpenBSD
Как уже упоминалось в комментарии @eradman, это возможно в OpenBSD.
Как корень:
Как обычный пользователь:
Это работает путем передачи
/dev/fd/3
(или чего бы то ни было открытого сценария для скрипта) интерпретатору. Этот трюк не сработает в Linux, где/dev/fd/N
используются не специальные символьные устройства, которые возвращаютdup(2)
fd при открытии, а «магические» символические ссылки на оригинальный файл / dentry, которые открывают файл с нуля [1]. Это может быть реализовано в Free / NetBSD или Solaris ...Но дело не в том, что
По сути, предоставление
x
разрешения (execute) означает также предоставление разрешенияr
(read) для любого файла, который имеет shebang [2]:ktrace
не единственный путь; если интерпретатор является динамически связанным исполняемым файлом, например,perl
илиpython
, вместо этого можно использоватьLD_PRELOAD
хак ed, который переопределяетread(2)
функцию.И нет, установка setuid не помешает обычному пользователю увидеть его содержимое; она может просто запустить его
ptrace(2)
, что приведет к игнорированию битов setuid:Как корень:
Как обычный пользователь:
(извините, если это не самый простой способ продемонстрировать это)
[1] это можно было бы эмулировать в Linux с помощью
binfmt_misc
, но интерпретатор нужно будет изменить или использовать оболочку; см. последнюю часть этого ответа для примера, намеренно сделанного до смешного небезопасным.[2] или вообще любой файл, который не вызовет
execve()
возвратаENOEXEC
.источник
Да, если вы являетесь пользователем root, вы можете запустить файл без разрешения на чтение
Но если вы войдете с любым другим пользователем, вы не сможете выполнить этот файл
источник
Чтобы сделать ваши сценарии нечитаемыми, но исполняемыми, у вас есть 3 основных варианта:
Первый вариант
Используйте команду openssl, чтобы зашифровать ее вручную. И в будущем, когда вы захотите запустить скрипт, вам придется снова запустить openssl вручную и предоставить пароль для расшифровки.
Шифрование с помощью openssl:
кошка yourscript.sh | openssl aes-128-cbc -a -salt -k ваш пароль> yourscript.enc
Расшифровка с помощью openssl:
кошка yourscript.enc | openssl aes-128-cbc -a -d -salt -k ваш пароль> yourscript.dec
yourscript.dec будет таким же, как ваш оригинальный скрипт yourscript.sh
Второй вариант
Используйте сайт, такой как www.Enscryption.com, чтобы автоматически зашифровать ваш скрипт и сделать зашифрованную версию скрипта исполняемой. Этот сайт использует как возможности шифрования openssl, так и некоторые другие методы обфускации, чтобы злоумышленникам было довольно трудно заглянуть в ваш сценарий или раскрыть секреты, которые вы хотите скрыть. С помощью этого сайта вы можете зашифровать сценарии оболочки и сценарии командной строки perl, python, ruby. Я думаю, что php также.
Третий вариант
Используйте такой инструмент, как shc . Похоже, он не обновлялся с 2012 года, но я использовал его в прошлом. Вы должны скомпилировать свой скрипт для каждой ОС, в которой вы хотите его использовать, если ОС отличается от той, которую вы использовали для его компиляции.
Резюме:
Если для вас очень важно скрыть свой код, то вам могут помочь только полномочия и права собственности, поскольку любой, кто имеет права root, сможет получить к нему доступ. Это просто факт. Если вы действительно хотите предотвратить несанкционированный просмотр вашего кода кем-либо, вы можете написать скрипт вокруг команды openssl. Сделайте так, чтобы перед запуском скрипта он запрашивал пароль И после того, как пароль задан, он запускает скрипт, не записывая его во временный файл. Если это звучит как слишком много работы, то вариантов 2 и 3 должно быть достаточно для ваших целей.
источник