Security

針對 CVE-2014-7169 的更新後的 Shellshock 漏洞測試如何工作?

  • September 26, 2014

我了解 CVE-2014-6271 的原始測試,即:

$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

但我對 CVE-2014-7169 的更新測試和相應輸出感到困惑:

$ env X='() { (a)=>\' sh -c "echo date"; cat echo
sh: X: line 1: syntax error near unexpected token `='
sh: X: line 1: `'
sh: error importing function definition for `X'
Thu 25 Sep 2014 08:50:18 BST

有人可以簡要解釋一下這裡發生了什麼以及它如何繞過 CVE-2014-6271 的更新檔嗎?

自從我第一次發布這個問題以來,我一直在網上搜尋。

根據漏洞的原始發現者,在 CVE-2014-6271 更新檔之前的 bash 導入了一個函式,例如:

foo=() {
 code
}

通過用空格替換等號並解釋它……這意味著解釋超出函式定義是可能的。

CVE-2014-6271的更新檔引入了 parse_and_execute() 函式的特殊模式,以限制對函式定義的評估,而不是超出它。

但是,正如該執行緒中所解釋的,CVE-2014-7169 漏洞測試的特製環境變數旨在 1) 將解析器混淆至死 2) 在緩衝區中留下碎片 3) 完全改變原始 bash 命令在它與緩衝區中已經存在的廢料相結合。

所以要剖析環境變數:

X='() { (a)=>\'

  • 解析器將分析() { (a)=>\. 請注意,這\是字元串的一部分;它沒有轉義尾隨單引號。

() {

  • 解析器將此標識為函式定義。

(a)=

  • 這會使解析器感到困惑。

>\

  • 解析器將最後兩個字元留在緩衝區中。

>\[NEWLINE]

  • sh命令執行之前的某個時刻,緩衝區中會放置一個換行符。

>\[NEWLINE]echo date

  • sh被呼叫時(在這種情況下可能是 bash 的符號連結),它會將其命令參數 , 添加echo date到緩衝區中已經存在的字元中。

>echo date

  • 由於換行符被轉義,bash 會將緩衝區解析為>echo date,其效果與date > echo. 創建一個名為的文件echo,並將命令的標準輸出date重定向到其中。

; cat echo

  • 第二個命令只是顯示新創建文件的內容。

引用自:https://serverfault.com/questions/631312