Bash
bash 腳本可以重置和清理整個環境嗎?如何?
你知道這些
sudo
東西:
Defaults env_reset
這使得環境注入成為不可能。如果可以直接從 bash 腳本“從內部”獲得此功能,我一直在徘徊?
至少有一部分可以,這是肯定的。例子:
#!/usr/bin/env php <?php //... // sanitizes $PATH putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"); // unsets $LD_LIBRARY_PATH, as it should be in Ubuntu putenv('LD_LIBRARY_PATH'); //...
我們可以
env_reset
在執行腳本sudo
中做和如何做嗎?編輯:
我不是在尋找“從外部”做它的方法,
env -i command
而是從腳本本身的內部。我的目的是確保無論誰(什麼使用者)和如何(在什麼情況下,即環境變數)執行它的安全性。
bash
本身使用一些環境變數。當bash
開始並準備解釋它的第一個命令時,已經太晚了,惡意環境可能已經bash
造成了破壞。
bash
您需要在呼叫之前對環境進行消毒。您可以在大多數係統上使用 C 函式擦除環境,clearenv()
或者您可以只呼叫execve()
腳本並在envp
參數中傳遞一個空列表。即使腳本包含:
#! /bin/bash - :
(
:
作為一個特殊的內置函式),如果環境包含SHELLOPTS=xtrace PS4='$(reboot)'
,reboot
則將呼叫該命令:
。如果
bash
是動態連結的,LD_PRELOAD
/LD_LIBRARY_PATH
可以在bash
呼叫時立即執行任意程式碼。
bash
還尊重語言環境的字元集進行解析,因此使用LOCPATH
和LC_*
變數,您甚至可以讓該#! /bin/bash -
行呼叫任意程式碼(#!/bina
例如,通過使字元為空白)。也可以看看:
env SHELLOPTS=noexec any-bash-script
那停止
bash
做任何事情。這些只是幾個例子。
另請注意,環境變數並不是命令在啟動時繼承的唯一內容,並且可能會影響其行為(如參數、umask、限制、目前工作目錄、打開文件描述符、信號處置、控制終端……)。