2015年5月,在Red Hat Enterprise Linux多個(gè)版本的DHCP客戶端軟件包所包含的NetworkManager集成腳本中發(fā)現(xiàn)了命令注入漏洞(CVE-2018-1111),該漏洞目前已經(jīng)進(jìn)行了修補(bǔ)。攻擊者可以通過本地網(wǎng)絡(luò)上的惡意DHCP服務(wù)器或使用惡意的虛假DHCP響應(yīng)來利用此漏洞進(jìn)行攻擊,一旦攻擊成功,則可以在配置了DHCP的NetworkManager的系統(tǒng)上以root權(quán)限執(zhí)行任意命令。
此漏洞可對(duì)運(yùn)行了帶有它的Red Hat Enterprise Linux6、7版本的個(gè)人或組織構(gòu)成嚴(yán)重威脅,受到威脅著應(yīng)立即使用補(bǔ)丁。
本文通過提供此漏洞的概述來幫助您進(jìn)行風(fēng)險(xiǎn)評(píng)估和了解漏洞,并提供讀者如何進(jìn)行防護(hù)等詳細(xì)信息。
NetworkManager是一個(gè)Linux程序,用于在配置DHCP網(wǎng)絡(luò)模式時(shí)管理系統(tǒng)網(wǎng)絡(luò),在這種情況下,NetworkManager將啟動(dòng)dhclient來發(fā)送DHCP請(qǐng)求,如圖1所示。
圖1.通過NetworkManager運(yùn)行的dhclient進(jìn)程
在上面的示例中,你可能會(huì)注意到另一個(gè)配置文件(/var/lib/NetworkManager/dhclient-eth0.conf)被從NetworkManager傳遞給了dhclient。正如下圖,dhclient默認(rèn)配置為請(qǐng)求多個(gè)DHCP數(shù)據(jù)包,其中包括了WPAD。
圖2.傳遞給dhclient的配置文件
當(dāng)dhclient發(fā)送DHCP服務(wù)器的初始化請(qǐng)求時(shí),它被配置為在請(qǐng)求中包含此WPAD(代碼252)選項(xiàng),如下圖中所示:
圖3.初始數(shù)據(jù)包中的DHCP請(qǐng)求WPAD選項(xiàng)
有了CVE-2018-1111漏洞,攻擊者可以通過錯(cuò)誤格式的響應(yīng)對(duì)此DHCP請(qǐng)求進(jìn)行響應(yīng)。例如,攻擊者可能會(huì)使用以下數(shù)據(jù)進(jìn)行響應(yīng),如圖4所示:
xxx '&touch /tmp/test #
圖4.攻擊者在DHCP響應(yīng)中使用惡意格式的WPAD選項(xiàng)進(jìn)行響應(yīng)
收到此響應(yīng)后,默認(rèn)的11-dhclient腳本最終會(huì)將此數(shù)據(jù)傳遞給eval()語句,這就會(huì)導(dǎo)致通過touch命令來創(chuàng)建/tmp/test。
在受害者的系統(tǒng)收到惡意格式的DHCP響應(yīng)再創(chuàng)建/tmp/test之前,還會(huì)發(fā)生許多其他的事情。首先,dhclient調(diào)用client_option_envadd()函數(shù)將值保存到變量中,這可以在下圖的源代碼中看到,它通過client_envadd()函數(shù)在3154行特意執(zhí)行。
圖5.證明如何處理DHCP數(shù)據(jù)包選項(xiàng)的dhclient源碼
在上面的源碼中,在設(shè)置變量之前調(diào)用了pretty_print_option()函數(shù),通過在特殊字符之前添加反斜杠(’‘)來清理值。舉個(gè)例子:
'
字符將轉(zhuǎn)換為了'
&
字符將轉(zhuǎn)換為了&
在我們的示例中,發(fā)送的初始數(shù)據(jù)如下:
然后將轉(zhuǎn)換為以下內(nèi)容:
下圖中顯示了此函數(shù)轉(zhuǎn)換了收到的數(shù)據(jù):
圖6.由pretty_print函數(shù)修改的WPAD選項(xiàng)的示例
進(jìn)行轉(zhuǎn)換后,它會(huì)繼續(xù)調(diào)用check_option_values()函數(shù),然后將值存儲(chǔ)到變量中,并檢查以確認(rèn)在給定某些選項(xiàng)的情況下它是否包含特殊字符。此類選項(xiàng)的示例包括提供HOST_NAME或DOMAIN_NAME時(shí),如圖8和圖9所示。
圖8.檢查是否提供了特定選項(xiàng)的源碼
圖9.在提供NETBIOS_SCOPE選項(xiàng)的情況下執(zhí)行的代碼
從代碼中可以看出,未選中WPAD選項(xiàng)。因此,它沒有經(jīng)過額外的檢查,這就使我們能夠通過修改DHCP響應(yīng)中的此選項(xiàng)提供任何數(shù)據(jù)。
接下來,dhclient將通過設(shè)置通過參數(shù)傳遞的參數(shù)來啟動(dòng)/usr/libexec/nm-dhcp-helper進(jìn)程。然后將這些變量保存到dbus服務(wù)中。
另一個(gè)名為nm-dispatcher的兄弟進(jìn)程由NetworkManager啟動(dòng),然后從dbus服務(wù)中讀取變量。它會(huì)將WPAD DHCP選項(xiàng)的值保存到環(huán)境變量名DHCP4_WPAD,然后繼續(xù)啟動(dòng)位于/etc/NetworkManager/dispatcher.d/中的11-dhclient腳本。
看一下這個(gè)11-dhclient腳本:
圖10. 11-dhclient腳本的內(nèi)容
讓我們深入了解這個(gè)腳本中發(fā)生了什么。
在eval()語句中,以“declare”命令開頭,這個(gè)“declare”命令將輸出系統(tǒng)上的所有環(huán)境變量,讀者可能更熟悉“env”命令,它的方式運(yùn)行類似,但雖然輸出相似,結(jié)果仍存在一些關(guān)鍵差異,如下圖11所示。
圖11. declare和env命令之間的差異
正如您在上面所看到的,“declare”命令會(huì)執(zhí)行另外兩項(xiàng)操作:
'
。'
轉(zhuǎn)換為'''
**(將一個(gè)字符轉(zhuǎn)換為四個(gè)字符)。由于變量的值為xxx’&touch /tmp/test #
,因此“declare”的輸出將變?yōu)?code>'‘xxx’”&touch /tmp/test #’。
運(yùn)行“declare”命令后,腳本將僅搜索以“DHCP4_”開頭的環(huán)境變量,然后是“read”命令,如果未提供參數(shù),則此命令將讀取轉(zhuǎn)義字符。換句話說,'
將變?yōu)?code>' 。
回到我們?cè)贒HCP響應(yīng)中的WPAD選項(xiàng)提供的數(shù)據(jù),‘xxx’”&touch /tmp/test #’
將變?yōu)?code>‘xxx”’&touch /tmp/test #’。換句話說,由于使用了沒有任何參數(shù)的“read”命令,以前轉(zhuǎn)義的字符就不會(huì)被轉(zhuǎn)義。
其余命令將解析的環(huán)境變量數(shù)據(jù)設(shè)置為一系列變量。但是,最后一個(gè)命令包含可能被利用的代碼。有問題的一行如下:
echo "export $optname=$optvalue"
使用我們的示例響應(yīng),將在系統(tǒng)上執(zhí)行以下代碼:
eval "$(echo "export new_wpad='xxx'''&touch /tmp/test #' ")"
圖12中進(jìn)行了演示:
圖12.示例基于WPAD DHCP選項(xiàng)提供的代碼執(zhí)行的結(jié)果
因?yàn)橐脹]有被轉(zhuǎn)義,并且因?yàn)樗蟾艘粋€(gè)&
符號(hào),所以它允許我們向這個(gè)eval()語句附加一個(gè)額外的命令,在我們的示例中,我們輸入了touch /tmp/test
的輔助命令,這導(dǎo)致我們?cè)?code>/tmp/目錄中創(chuàng)建一個(gè)名為test
的空文件。
如果引號(hào)字符和&符號(hào)被轉(zhuǎn)義,我們的攻擊就將失敗,如下所示:
圖13.嘗試使用轉(zhuǎn)義的cahracters執(zhí)行相同的命令
重要的是要注意其他字符也可能被用于執(zhí)行此攻擊,例如|
或;
。
在這個(gè)特定情況下,修復(fù)非常簡單,只需在“read”命令中添加“-r”選項(xiàng)即可防止各種字符不被轉(zhuǎn)義,就像下圖的修復(fù)補(bǔ)丁里所示的一樣:
圖14. CVE-2018-1111的補(bǔ)丁
根據(jù)“read”命令的文檔描述,“-r”選項(xiàng)可防止命令將反斜杠作為轉(zhuǎn)義字符讀取。換句話說,它將保留提供給它的數(shù)據(jù)中的所有反斜杠,這樣就可以防御命令注入攻擊。
在漏洞被發(fā)現(xiàn)后不久,POC代碼就于2018年5月16日通過Twitter被發(fā)布到網(wǎng)絡(luò)中:
圖15.推特CVE-2018-111 PoC演示
此外,也可以在GitHub中配置代碼以測(cè)試是否存在此漏洞:
https://github.com/knqyf263/CVE-2018-1111
考慮到NetworkManager使用十分廣泛,并且這個(gè)漏洞很容易被攻擊者利用,它應(yīng)該被視為一個(gè)高危的漏洞。目前此漏洞威脅的風(fēng)險(xiǎn)情況會(huì)更具利用此漏洞的攻擊數(shù)量增加而提升。
如果還沒有被攻擊,讀者應(yīng)該盡快修補(bǔ)他們的系統(tǒng)。