bash執行漏洞

2021-07-01 23:44:27 字數 2295 閱讀 9761

在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

((flags

&;seval_funcdef)&

amp;&

amp;

command

->

;type

!=cm_function_def

)

另外,很多人疑惑poc裡這句中的冒號和分號,分號作為結束符,而冒號的意思是什麼也不做,類似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...