В OpenBSD механизм divert (4)
может использоваться для передачи пакетов между ядром и произвольным процессом пользовательской среды, написанным произвольным язык, предполагая, что язык может быть настроен для взаимодействия с системным вызовом (либо напрямую, либо, возможно, с помощью дополнительного усложнения прокси-уровня прокладки divert (4)
-to-any-IPC-is-required, если язык отстой при системных вызовах).
bash
сам использует некоторые переменные окружения. К тому времени, когда bash
запускается и готов интерпретировать свою первую команду, уже слишком поздно, вредоносное окружение уже может заставить bash
нанести ущерб.
Перед вызовом bash
необходимо, чтобы среда была очищена. Вы можете очистить окружение с помощью функции clearenv()
C на большинстве систем или просто вызвать execve()
в вашем сценарии и передать пустой список в параметре envp
.
Даже если сценарий содержит:
#! /bin/bash -
:
(:
- специальный встроенный модуль), если окружение содержит SHELLOPTS=xtrace PS4='$(reboot)'
, команда reboot
будет вызвана при :
.
Если bash
динамически связан, LD_PRELOAD
/LD_LIBRARY_PATH
может заставить bash
выполнять произвольный код сразу после его вызова.
bash
также учитывает charset локали при разборе, так что с переменными LOCPATH
и LC_*
вы можете получить даже #! /bin/bash -
вызывать произвольный код (например, сделав символы #!/bina
пустыми).
См. также:
env SHELLOPTS=noexec any-bash-script
Это мешает bash
делать что-либо.
Это лишь несколько примеров.
Также обратите внимание, что переменные окружения - это не единственные вещи, которые команда наследует при запуске и которые могут повлиять на ее поведение (например, аргументы, umask, ограничения, текущий рабочий каталог, открытые дескрипторы файлов, расположение сигналов, управляющий терминал...).
Вы можете найти свои экспорты с помощью export -p
или просто export
и заменить declare -x
на declare + x
в каждой строке, чтобы экспортировать его:
eval "$(export|sed s/-/+/)"
Если вы поместите это в начало вашего скрипта, то никакие переменные среды не будут передаваться в программы, которые он выполняет, если вы явно не экспортируете их сами. Возможно, вы захотите экспортировать языковой стандарт и переменные TZ
, а также TERM
и многое другое ...