Bash

bash 腳本可以重置和清理整個環境嗎?如何?

  • February 2, 2017

你知道這些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還尊重語言環境的字元集進行解析,因此使用LOCPATHLC_*變數,您甚至可以讓該#! /bin/bash -行呼叫任意程式碼(#!/bina例如,通過使字元為空白)。

也可以看看:

env SHELLOPTS=noexec any-bash-script

那停止bash做任何事情。

這些只是幾個例子。

另請注意,環境變數並不是命令在啟動時繼承的唯一內容,並且可能會影響其行為(如參數、umask、限制、目前工作目錄、打開文件描述符、信號處置、控制終端……)。

引用自:https://unix.stackexchange.com/questions/341999