在bash shell下執行以下**:
env x='() ; echo vulnerable' bash -c "echo this is a test"
如果輸出:
vulnerable
this is a test
表示存在漏洞。打了補丁會輸出以下錯誤:
bash: 警告: x: ignoring function definition attempt
bash: `x' 函式定義匯入錯誤
this is a test
shell裡可以定義變數,poc中定義了乙個命名為x的變數,內容是乙個字串:
() ; echo vulnerable
而根據漏洞資訊得知,這個漏洞產生於shell在處理函式定義時,執行了函式體之後的命令。但這裡x的值是個字串,它是怎麼轉變成函式的呢。
實際這個和bash實現有關,在bash中定義乙個函式,格式為:
function function_name()
當bash在初始化環境變數時,語法解析器發現小括號和大括號的時候,就認為它是乙個函式定義:
[lu4nx@lx-pc ~]$ say_hello='() '
[lu4nx@lx-pc ~]$ export say_hello
[lu4nx@lx-pc ~]$ bash -c 'say_hello'
hello world
上面**在新的bash程序中,say_hello
成了新環境中的乙個函式,它的演變過程如下:
1、新的bash在初始時,掃瞄到環境變數say_hello
出現小括號和大括號,認定它是乙個函式定義
2、bash把say_hello
作為函式名,其值作為函式體
typeset命令可以列出當前環境中所有變數和函式定義,我們用typeset看看這個字串怎麼變成函式的。繼續上面定義的say_hello
函式:
[lu4nx@lx-pc ~]$ bash -c 'typeset' | fgrep -a 10 say_hello
say_hello ()
這裡新啟動了個bash程序,然後執行了typeset,typeset會返回當前環境(新的環境)中所有定義,這裡清楚看到say_hello被變成函式了。
而這個漏洞在於,bash把函式體解析完了之後,去執行了函式定義後面的語句,為啥會這樣呢。
通過結合補丁,我對bash的原始碼簡單分析了下,bash初始化時呼叫了builtins/evalstring.c
裡的parse_and_execute
函式。是的,就等於bash初始化環境時呼叫了類似其他高階語言中的eval
函式,它負責解析字串輸入並執行。
繼續看parse_and_execute
的原始碼,關鍵點在這裡:
218 else if (command = global_command)
219
declare -fx say_hello
declare
命令是bash內建的,用來限定變數的屬性,-f表示say_hello
是乙個函式,-x引數表示say_hello
被export成乙個環境變數,所以這句話的意思是讓say_hello
成了全域性有效的函式。
其實bash本身其實是想在啟動時初始環境變數以及定義一些函式,而初始的方式就是去把變數名=值
這樣的賦值語句用eval去執行一次,如果出現了函式定義,就把它轉變成函式,除此之外就不想讓它幹其他的了,可偏偏它在掃瞄到函式定義時,把它轉變成函式的過程中不小心執行了後面的命令,這其實不是eval的錯,這是做語法解析時沒考慮嚴格,所以補丁加了這麼一句話來判斷函式體合法性:
if另外,很多人疑惑poc裡((flags
&;seval_funcdef)&
amp;&
amp;
command
->
;type
!=cm_function_def
)
這句中的冒號和分號,分號作為結束符,而冒號的意思是什麼也不做,類似python裡的pass
,具體看bash官方文件。 Bash漏洞利用!
環境 伺服器centos 192.168.195.130 攻擊機bt5 192.168.195.130 1 找到漏洞利用程式 必須web伺服器支援cgi 這裡是測試的bug.sh bin bash 第一行要特別注意!echo content type text html echo echo echo...
Bash遠端解析命令執行漏洞測試方法
bash漏洞為什麼能夠執行 bash漏洞的原理 bash除了可以將shell變數匯出為環境變數,還可以將shell函式匯出為環境變數!當前版本的bash通過以函式名作為環境變數名,以 為結束,而是一直執行其後的shell命令。簡單地說就是,bash指令碼在解析某些特殊字串時出現邏輯錯誤導致可以執行後...
Bash漏洞分析溯源
漏洞編號 cve 2014 6271 漏洞名稱 linux bash遠端可執行漏洞 漏洞影響範圍 所有安裝gnu bash 版本小於或者等於4.3的linux作業系統 漏洞檢測 使用以下命令檢測是否存在此漏洞 env x echo vulnerable bash c echo this is a t...