2014-09-27 50 views
1

有兩件事情我不明白對彈震漏洞:Shellshock - 爲什麼允許注入環境變量?

  1. 爲什麼環境變量的注射允許未經驗證的連接?這有什麼好處?

  2. 什麼實際的服務提供了注入變量的能力?

任何想法?

+0

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。這一對問題(或兩部分問題)確實有點寬泛。此外,第二個答案很容易在網上找到。你當然應該閱讀這個問題和答案[Bash中記錄的Shell Shock漏洞背後的行爲是否記錄在案或者是否有意?](http://stackoverflow.com/questions/26022248/) – 2014-09-28 00:00:11

+0

請看:http:/ /unix.stackexchange.com/a/157495/74329 – Cyrus 2014-09-28 00:16:11

+0

一個觀察(反問題):shell如何知道連接是否被驗證? – 2014-09-28 00:16:32

回答

-1

1)該漏洞是一個執行漏洞。從不受信任的源向環境變量注入指令並不是故意允許的 - 這就是爲什麼它是一個錯誤。

2)請參閱http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html#.VCNyvfmSx8E瞭解如何利用此漏洞的一個很好的示例。

+0

問題不是環境變量本身;它是一個環境變量的值是''eval'ed假設它只包含一個函數聲明,而不驗證這個假設。 – chepner 2014-09-28 02:50:17

+0

好點。我編輯了我的答案。 – mti2935 2014-09-28 10:55:26

1

環境變量是一種很常見的與子進程通信的方式。你也可以問「爲什麼它允許將參數傳遞給子進程?」當然,對於環境變量來說,需要更多的預防措施,因爲一些環境變量(例如PATH)會影響某些系統調用的語義。所以通常的約定是將可以從不可信輸入設置的環境變量限制爲一組已知名稱。

例如,CGI協議(使用環境變量傳遞有關HTTP請求的信息)將自身限制爲一組環境變量名稱,這些名稱可能大致描述爲the CGI standard,以及任意環境變量,其名稱以字符HTTP_開頭。

雖然CGI有可能是用戶輸入環境變量的最大庫存,但這種技術很常見。一個成熟的例子是使用TERM來定義遠程終端的終端類型,但還有很多。

環境變量,如命令行參數,需要小心處理,有時需要屏障。例如,/bin/env實用程序提供了一種清理給予可執行文件的環境的機制;如果環境不可靠並且如果可執行文件以提升的特權運行時是必不可少的,那就很有用。

除了特定情況(如PATH),沒有應用程序應該依賴於一個環境變量是乾淨的。在沒有首先檢查其有效性的情況下根據環境變量的值做些事情與使用用戶提供的任何其他未經驗證的數據一樣是一個錯誤。 (q.v. SQL注入攻擊)。這就是我們在這裏所得到的:一個錯誤,簡單明瞭。這些事情發生。我們並不完美。 (這個錯誤已經存在了二十多年,顯然沒有任何人注意到這一事實,至少有趣。)