最近,BASH爆出來一個遠程代碼執行的漏洞CVE-2014-6271。
BASH除了可以將shell變量導出為環境變量,還可以將shell函數導出為環境變量!當前版本的bash通過以函數名作為環境變量名,以“(){”開頭的字串作為環境變量的值來將函數定義導出為環境變量。
此次爆出的漏洞在于BASH處理這樣的“函數環境變量”的時候,并沒有以函數結尾“}”為結束,而是一直執行其后的shell命令!例如
目前,接受HTTP命令的CGI Shell腳本是最主要的被攻擊對象。一個常見的HTTP請求是這樣:
GET /path?query-param-name=query-param-value HTTP/1.1
Host: www.example.com
Custom: custom-header-value
CGI標準將http請求的所有部分都映射到了環境變量。例如對于Apache的Httpd,字串(){可以出現在以下這些地方:
* Host (“www.example.com”, as REMOTE_HOST)
* Header value (“custom-header-value”, as HTTP_CUSTOM in this example)
* Server protocol (“HTTP/1.1”, as SERVER_PROTOCOL)
通過自定義這些參數的值為“函數環境變量”的形式,就可以遠程執行命令!!!例如:
curl -H User-Agent: () { :;}; echo fuck you! http://xxxxx/victim.sh
此外,OpenSSH也因其AcceptEnv、TERM、SSH_ORIGINAL_COMMAND等環境變量受此漏洞影響。目前還有更多的受影響程序和利用方式正在不斷地被發掘出來!