Можно выполнить сброс и очистку сценария bash * целиком * environment и как?

В OpenBSD механизм divert (4) может использоваться для передачи пакетов между ядром и произвольным процессом пользовательской среды, написанным произвольным язык, предполагая, что язык может быть настроен для взаимодействия с системным вызовом (либо напрямую, либо, возможно, с помощью дополнительного усложнения прокси-уровня прокладки divert (4) -to-any-IPC-is-required, если язык отстой при системных вызовах).

3
02.02.2017, 17:01
2 ответа

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

5
27.01.2020, 21:13

Вы можете найти свои экспорты с помощью export -p или просто export и заменить declare -x на declare + x в каждой строке, чтобы экспортировать его:

eval "$(export|sed s/-/+/)"

Если вы поместите это в начало вашего скрипта, то никакие переменные среды не будут передаваться в программы, которые он выполняет, если вы явно не экспортируете их сами. Возможно, вы захотите экспортировать языковой стандарт и переменные TZ , а также TERM и многое другое ...

1
27.01.2020, 21:13

Теги

Похожие вопросы