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, ограничения, текущий рабочий каталог, открытые дескрипторы файлов, расположение сигналов, управляющий терминал...).