Bash

為什麼在環境變數中定義函式的能力本身不是安全風險?

  • December 31, 2016

據我了解,通常認為讓任何人提供將儲存在環境變數中的資訊是安全的。shellshock 漏洞在這裡是一個問題,因為它意味著環境變數中函式定義末尾的程式碼將在新的 bash 實例啟動時執行,並且您顯然不希望任何人在您的伺服器上執行任何他們喜歡的程式碼. 函式定義本身顯然不是安全風險,並且是允許的,因為必須顯式呼叫它們才能執行它們的程式碼。

我的問題是為什麼惡意使用者不能簡單地定義一個函式,將他們的惡意程式碼包含為一個通用命令ls,然後希望腳本(或正在執行的任何東西)在某個時候使用這個命令?

我想到的一個例子:

$ export ls='() { echo "doing bad things..."; }'
$ bash -c ls
doing bad things...

這是一個安全風險。這通常就是為什麼在切換到另一個上下文(遠端控制系統、更改使用者等)時無法執行此操作的原因。

如果您能夠創建所需的任何環境變數,那麼您可以通過多種潛在方式執行任意程式碼。

$LD_PRELOAD個例子。如果您有能力設置該變數,您可以替換庫函式,並將您的程式碼粘貼在那裡。您可以設置$DISPLAY變數,並重定向程序連接到的 X 顯示,以便您控制應用程序。

這就是為什麼sudo剝離所有變數的環境之類的事情。sudo只允許少數選擇變數通過。在這些變數中,它會清理它們(它會通過$TERM變數,但如果它包含不尋常的字元則不會)。

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