С помощью Bash source
можно выполнить скрипт без установленного бита выполнения. Это задокументированное и ожидаемое поведение, но не против ли это использования бита выполнения?
Я знаю, source
это не создает подоболочки.
bash
permissions
executable
source
conventions
Motte001
источник
источник
chmod
вы можете установить права доступа (включая `x) с восьмеричным числом, дает некоторое представление о том, с какой эры это происходит. Я не удивлюсь, если бы он начинался как быстрый и грязный индикатор «это двоичный файл, который вы можете выполнить», со времен, предшествовавших тому, как была изобретена она, но у меня нет никаких доказательств этогоcp /sbin/suidexecutable /tmp/mycopy; /tmp/mycopy
Ответы:
Баш - переводчик; он принимает входные данные и делает все, что хочет. Не нужно прислушиваться к исполняемому биту. Фактически, Bash является переносимым и может работать в операционных системах и файловых системах, которые не имеют понятия о исполняемом бите.
Что заботится о исполняемом бите, так это ядро операционной системы. Когда ядро Linux выполняет
exec
, например, проверку того, что файловая система не смонтирована сnoexec
опцией, оно проверяет исполняемый бит программного файла и обеспечивает выполнение любых требований, предъявляемых модулями безопасности (такими как SELinux или AppArmor).Обратите внимание, что исполняемый бит является довольно произвольным видом управления. Например, в системе Linux x86-64 вы можете обойти проверку ядром исполняемого бита, явно вызвав
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
интерпретатор :Это несколько похоже на получение исходного кода Bash в Bash, за исключением того, что
ld.so
это интерпретатор, а выполняемый код - это машинный код в формате ELF.источник
ld.so
состоит в том, чтобы сделать динамическое связывание.source
или эквивалентная, но стандартная точка.
не выполняет сценарий, а читает команды из файла сценария, а затем выполняет их построчно в текущей среде оболочки.Там нет ничего против использования исполнения бита, потому что оболочка только нужно прочитать разрешение на чтение содержимого файла.
Бит выполнения требуется только при запуске скрипта. Здесь оболочка будет
fork()
новый процесс, затем с помощьюexecve()
функции для создания нового образа процесса из сценария, который должен быть обычным, исполняемым файлом.источник
bash < script
, вы получите по сути тот же результат, что иsource script
. Какую защиту обеспечивает проверка битов выполнения?execv
семейство системных вызовов OS * использоваться с исполняемым файлом, а не будет ли его выполнять интерпретатор. Зачем вводить людей в заблуждение (и нарушать способность оценивать код, передаваемый из нефайловых источников), нарушая соглашения?bin/activate
, не имеет исполняемого бита. Скрипты могут быть библиотеками или чем-то подобным. Я думаю, наличие .sh также может быть сигналом, но иметь минимум пушек - это хорошо: приятно, что./bin/activate
вместо этого невозможно бежать случайно. bin/activate
Исполняемый бит (в отличие от остальных) в файлах, отличных от unsetuid, не является механизмом безопасности. Все, что вы можете прочитать, вы можете запускать косвенно, а Linux позволит вам косвенно читать все, что вы можете запустить, но не можете читать напрямую (этого должно быть достаточно, чтобы пробить дыру в концепции неустановленного (g) uid x-bit как мера безопасности).
Это скорее для удобства: пусть система запускает его для меня напрямую, если бит установлен, в противном случае мне нужно сделать это косвенно (
bash the_script;
или некоторый взлом, чтобы получить образ памяти исполняемого файла без разрешения на чтение ).Вы можете установить его для удобства, если вы намереваетесь использовать как исходный код, так и исполнить свой источник.
Очевидно, однако, что многие разработчики разделяемых библиотек разделяют ваше мышление, и, следовательно, многие системы требуют, чтобы разделяемые библиотеки, которые по сути являются нативным эквивалентом неисчерпаемых оболочек, были помечены как исполняемые для того, чтобы их можно было использовать. См. Почему исполняемые библиотеки общего доступа? ,
источник
chmod
него и делаю его исполняемым. Он предназначен для сортировки данных из программ, поэтому вопрос ОП является обоснованным.x
бит - просто дополнительное место, где он может прочитать / написать подсказку о том, что делать./tmp$ cp /bin/cat ./cat ; chmod a-rw ./cat ; ./cat & cp /proc/$!/exe /tmp/cat2
->cp: cannot stat ‘/proc/16260/exe’: Permission denied
Это хороший вопрос! Unix использует исполняемый бит, чтобы различать программы и данные. ОС не требует бита выполнения, так как исходный сценарий не передается в ОС для выполнения в качестве нового процесса. Но оболочка обрабатывает исходный скрипт как программу и ищет
$PATH
файл, который вы хотите получить. Таким образом, самой оболочке могло потребоваться разрешение на выполнение для исходных файлов; но это не так.Вопрос должен был подняться давно. Дизайн оболочки Bourne был результатом «длинной последовательности изменений, диалогов, дискуссий» среди обитателей Bell Labs, и многие дизайнерские решения обсуждались SR Bourne и другими на протяжении многих лет. К сожалению, мой быстрый взгляд не нашел обсуждения исходной функции (в мою защиту трудно гуглить за это). Я обнаружил, что "." Команда не появляется в этом раннем введении в оболочку самого Борна, но она присутствует в более зрелой версии Версии 7 .
Отсутствие авторитета, вот моя собственная интерпретация:
Команда
.
, иначе говоряsource
, является текстовым включением (как#include
в препроцессоре C) в исходный код исполняемого скрипта или интерактивного сеанса. Таким образом, включенный файл, возможно, не «исполняется».Философия Unix всегда заключалась в том, чтобы дать программистам достаточно веревки, чтобы повеситься. Слишком много ручных и произвольных ограничений просто мешают. Лишь сравнительно недавно некоторые распространенные дистрибутивы
rm -r /
отказываются делать то, что вы просите. (Эта команда говорит,rm
чтобы удалить все на вашем компьютере. Не пытайтесь сделать это как root! Или еще лучше, совсем нет.) Так что, возможно, Bourne at al. просто решил, что когда вы пытаетесь найти файл, вы должны знать, что вы делаете. Это также позволяет избежать ненужной работы, и циклы имели большое значение в то время.источник
Что касается ОС, то файл, содержащий скрипт оболочки, - это просто данные. Если вы передаете имя такого файла данных
source
команде или передаете его в командной строке для вызова оболочки bash, все, что видит ОС, это строка, которая совпадает с именем файла, содержащего данные.Как бит выполнения будет вообще уместен в этом случае?
источник
Различие важно, потому что у вас может быть файл команд оболочки, который бесполезен в качестве исполняемого файла, но полезен только при использовании источника. Для этого файла вы можете отключить бит выполнения, и тогда он никогда не будет доступен, если явно в исходной команде. Причина такой вещи - иметь побочные эффекты на оболочке, из которой она запускается. Для конкретного примера у меня есть скрипт с именем fix_path, который просматривает и изменяет путь.
источник
На всякий случай, если кто-то заинтересован в дальнейшем изучении и / или разъяснении: в почти POSIX-совместимой оболочке, реализованной некоторое время назад, внутренняя работа функций exec_program () и builtin_source () очень показательна. В этих функциях вы видите, в чем разница между ними:
https://github.com/rsenn/shish/blob/master/src/builtin/builtin_source.c
https://github.com/rsenn/shish/blob/master/src/exec/exec_program.c
в основном, источник может рассматриваться как оболочка, временно перенаправляющая свой внутренний файловый дескриптор, с которого он анализирует скрипт оболочки (терминал в интерактивном режиме). так что это очень похоже на другие перенаправления, такие как
<input_file.txt
и,>>append_to_something.list
и они просто должны открывать и закрывать файлы.таким образом, выполнение выполняется
execve()
системным вызовом, для которого бит выполнения является обязательным.Я помню, как видел некоторые системы, которые разрешают выполнение двоичных файлов ELF / a.out, но через выполнение "/lib/ld-dynamic-linker.so" и с двоичной программой (без бита exec) в качестве первого аргумента. Я считаю, что это было на некоторых машинах DEC Alpha или VAX (это мог быть SCO Unix?)
источник
Другая точка зрения:
Исходный скрипт в основном состоит из встроенных командных оболочек и вызовов программ. Встроенные оболочки (включая
source
их) являются частями оболочки, и оболочка должна быть исполняемой в первую очередь. Каждая вызываемая программа (то есть ELF, другой скрипт с shebang) должна иметь установленный бит выполнения, иначе она не будет работать.Так что это не против использования бита выполнения, потому что ничто без бита выполнения не будет работать. Проверка не происходит для исходного сценария в целом; это выполняется для каждой части отдельно, но это так.
источник