Pkexec中本地權(quán)限升級(jí)漏洞的技術(shù)細(xì)節(jié)分析
Qualys研究團(tuán)隊(duì)在polkit的pkexec中發(fā)現(xiàn)了一個(gè)內(nèi)存破壞漏洞,pkexec是一個(gè)SUID-root程序,默認(rèn)安裝在每個(gè)主要的Linux發(fā)行版上。這個(gè)容易被利用的漏洞允許任何沒有相關(guān)權(quán)限的用戶通過利用默認(rèn)配置中的這個(gè)漏洞獲得脆弱主機(jī)上的完全根權(quán)限。
關(guān)于Polkit pkexec for Linux
Polkit(以前是PolicyKit)是一個(gè)用于控制類unix操作系統(tǒng)中的系統(tǒng)權(quán)限的組件。它為非權(quán)限進(jìn)程提供了一種有組織的方式來與權(quán)限進(jìn)程進(jìn)行通信。還可以使用polkit來執(zhí)行具有更高權(quán)限的命令,使用命令pkexec,后面跟著要執(zhí)行的命令(具有根權(quán)限)。
PwnKit漏洞的潛在影響
如果有人成功利用該漏洞,任何非權(quán)限用戶都可以獲得該漏洞主機(jī)上的root權(quán)限。Qualys的安全研究人員已經(jīng)能夠獨(dú)立驗(yàn)證該漏洞,并利用該漏洞,進(jìn)而獲得Ubuntu、Debian、Fedora和CentOS默認(rèn)安裝的全部root權(quán)限。其他 Linux 發(fā)行版可能容易受到攻擊并且可能被利用。這個(gè)漏洞已經(jīng)隱藏了 12 年多,并影響自 2009 年 5 月第一個(gè)版本以來的所有 pkexec 版本(commit c8c3d83, “Add a pkexec(1) command”)。
在我們的研究團(tuán)隊(duì)確認(rèn)該漏洞后,Qualys負(fù)責(zé)漏洞的披露,并與供應(yīng)商和開源發(fā)行方協(xié)調(diào),公布了該漏洞。
潛在漏洞利用路徑的視頻可以點(diǎn)此查看。(https://player.vimeo.com/video/669715589)
另外可以查看本視頻(https://player.vimeo.com/video/670582239),了解如何使用Qualys VMDR查看PwnKit漏洞。
PwnKit漏洞的技術(shù)細(xì)節(jié)介紹
pkexec的main()函數(shù)的開頭處理命令行參數(shù)(第534-568行),如果它的路徑不是絕對(duì)的,則在path環(huán)境變量的目錄中搜索要執(zhí)行的程序(第610-640行):

不幸的是,如果命令行參數(shù)argc的數(shù)量是0,這意味著如果我們傳遞給execve()的參數(shù)列表argv是空的,即{NULL},那么argv[0]就是NULL。這是參數(shù)列表的終止符。所以:
在第534行,整數(shù)n被永久地設(shè)置為1;
在第610行,從argv[1]越界讀取指針路徑;
在第639行,指針s被越界寫入argv[1];
但是,這個(gè)越界的argv[1]到底要讀寫什么呢?
要回答這個(gè)問題,我們必須稍微離題一下。當(dāng)execve()一個(gè)新程序時(shí),內(nèi)核將我們的參數(shù)、環(huán)境字符串和指針(argv和envp)復(fù)制到新程序堆棧的末尾,例如:

顯然,因?yàn)閍rgv和envp指針在內(nèi)存中是連續(xù)的,如果argc是0,那么越界的argv[1]實(shí)際上是envp[0],指向我們的第一個(gè)環(huán)境變量value的指針。結(jié)果:
在第 610 行,要執(zhí)行的程序的路徑從 argv[1](即 envp[0])越界讀取,并指向“value”;
在第 632 行,這個(gè)路徑“value”被傳遞給 g_find_program_in_path()(因?yàn)椤皏alue”在第629行不是以斜杠開頭的);
然后,g_find_program_in_path() 在我們的 PATH 環(huán)境變量的目錄中搜索一個(gè)名為“value”的可執(zhí)行文件;
如果找到這樣的可執(zhí)行文件,則將其完整路徑返回給 pkexec 的 main() 函數(shù)(在第 632 行);
最后,在第 639 行,這個(gè)完整路徑被越界寫入 argv[1](即 envp[0]),從而覆蓋了我們的第一個(gè)環(huán)境變量。
所以,更準(zhǔn)確地說:
如果我們的PATH環(huán)境變量是" PATH=name ",并且目錄" name "存在(在當(dāng)前工作目錄中)并且包含一個(gè)名為" value "的可執(zhí)行文件,那么一個(gè)指向字符串" name/value "的指針將被寫入envp[0]。
如果我們的 PATH 是“PATH=name=.”,并且目錄是“name=.”存在并包含一個(gè)名為“value”的可執(zhí)行文件,然后將指向字符串“name=./value”的指針越界寫入 envp[0]。
換句話說,這種越界寫入允許我們將“不安全的”環(huán)境變量(例如,LD_PRELOAD)重新引入到pkexec的環(huán)境中。在調(diào)用main()函數(shù)之前,這些“不安全的”變量通常會(huì)(通過ld.so)從SUID程序的環(huán)境中刪除。我們將在下一節(jié)中使用這個(gè)強(qiáng)大的原語。
不過要注意的是,polkit也支持非linux操作系統(tǒng),如Solaris和*BSD,但我們尚未調(diào)查它們的可利用性。然而,我們注意到OpenBSD是不可利用的,因?yàn)槿绻鸻rgc為0,它的內(nèi)核拒絕execve()一個(gè)程序。
如何修復(fù)PwnKit漏洞
考慮到該漏洞在Linux和非Linux操作系統(tǒng)中的攻擊范圍,Qualys建議用戶立即更新此應(yīng)用。
目前Qualys客戶可以搜索CVE-2021-4034的相關(guān)新聞,以識(shí)別該漏洞的所有QID 和設(shè)備。
現(xiàn)在可以開始免費(fèi)的 Qualys VMDR 試用,以獲得對(duì) CVE-2021-4034 的 QID(檢測(cè))的完全訪問權(quán)限,其中可以識(shí)別所有易受攻擊的設(shè)備。
Qualys研究團(tuán)隊(duì)在polkit的pkexec中發(fā)現(xiàn)了一個(gè)內(nèi)存破壞漏洞,pkexec是一個(gè)SUID-root程序,默認(rèn)安裝在每個(gè)主要的Linux發(fā)行版上。這個(gè)容易被利用的漏洞允許任何沒有權(quán)限的用戶通過利用默認(rèn)配置中的這個(gè)漏洞獲得脆弱主機(jī)上的完全根權(quán)限。
關(guān)于Linux的Polkit pkexec
Qualys QID 覆蓋范圍
Qualys 將發(fā)布下表中的 QID,因?yàn)樗鼈儚?vulnsigs 版本 VULNSIGS-2.5.387-2 和 Linux 云代理清單版本 lx_manifest-2.5.387.2-1 開始可用。

使用 Qualys VMDR 發(fā)現(xiàn)易受攻擊的 Linux 服務(wù)器
識(shí)別運(yùn)行 Linux 內(nèi)核的設(shè)備
接下來會(huì)介紹當(dāng)前 Qualys 客戶如何在他們的環(huán)境中檢測(cè) PwnKit。
管理這一關(guān)鍵漏洞和降低風(fēng)險(xiǎn)的第一步是識(shí)別運(yùn)行Linux操作系統(tǒng)的所有設(shè)備。Qualys VMDR使得識(shí)別此類設(shè)備變得很容易。
Query: operatingSystem.category1:`Linux`

一旦主機(jī)被識(shí)別出來,就可以將它們與“動(dòng)態(tài)標(biāo)簽”組合在一起,比如說:“Linux 服務(wù)器”。這有助于自動(dòng)對(duì)具有上述漏洞的現(xiàn)有主機(jī)以及在你的環(huán)境中啟動(dòng)的任何新 Linux 設(shè)備進(jìn)行分組。標(biāo)簽使得這些分組設(shè)備可以在整個(gè)Qualys云平臺(tái)上進(jìn)行查詢、報(bào)告和管理。
基于 RTI 的優(yōu)先級(jí)
使用 Qualys VMDR,可以使用以下實(shí)時(shí)威脅指標(biāo) (RTI) 確定 PwnKit 漏洞的優(yōu)先級(jí):
- Predicted_High_Risk
 - Privilege_Escalation
 - Easy_Exploit
 - High_Lateral_Movement
 

使用Qualys VMDR修復(fù)
我們預(yù)計(jì)供應(yīng)商將在短期內(nèi)發(fā)布針對(duì)該漏洞的修復(fù)。當(dāng)修復(fù)可用時(shí),Qualys Patch Management可用于將這些修復(fù)部署到易受攻擊的設(shè)備中。
使用基于上述 RTI 方法的相同優(yōu)先級(jí),客戶可以使用漏洞右側(cè)的“立即修復(fù)”按鈕將 PwnKit 添加到修復(fù)作業(yè)中。一旦修復(fù)發(fā)布,Qualys將找到該漏洞的相關(guān)修復(fù),并自動(dòng)將這些修復(fù)添加到修復(fù)作業(yè)中。這將允許客戶將這些修復(fù)部署到易受攻擊的設(shè)備上,所有這些修復(fù)都來自Qualys云平臺(tái)。
使用威脅防護(hù)檢測(cè)受影響的設(shè)備
VMDR還允許你使用威脅保護(hù)自動(dòng)映射易受PwnKit漏洞攻擊的設(shè)備。

使用 VMDR 儀表板跟蹤漏洞
使用 VMDR 儀表板,你可以實(shí)時(shí)跟蹤此漏洞、受影響的主機(jī)、狀態(tài)和整體管理。為儀表板小部件啟用趨勢(shì)分析后,你可以使用“PwnKit”儀表板跟蹤環(huán)境中的這些漏洞發(fā)展趨勢(shì)。
利用 Qualys XDR 識(shí)別漏洞利用嘗試
Qualys XDR 客戶可以使用標(biāo)題為“T1068 – Linux:檢測(cè)到 Polkit pkexec 本地特權(quán)升級(jí)漏洞 (CVE-2021-4034)”的規(guī)則名稱來檢測(cè)受影響系統(tǒng)上的利用后活動(dòng)。啟用后,客戶還可以使用以下 QQL 查詢搜索易受攻擊的系統(tǒng):
- eventName:” The value for the SHELL variable was not found the /etc/shells file“ or “contains suspicious content“
 
客戶將能夠看到類似以下截圖的輸出:

常見問題
哪些版本易受攻擊?
從2009年開始的所有Polkit版本都很脆弱。
Qualys研究團(tuán)隊(duì)是否會(huì)發(fā)布此漏洞的利用代碼?
不會(huì)。但鑒于利用該漏洞非常容易,我們預(yù)計(jì)在本博客發(fā)布日期后的幾天內(nèi),公開的漏洞利用將變得可用。
是否有緩解措施?
如果你的操作系統(tǒng)沒有可用的補(bǔ)丁,你可以從 pkexec 中刪除 SUID 位作為臨時(shí)緩解措施;例如:
# chmod 0755 /usr/bin/pkexec
這個(gè)漏洞可以遠(yuǎn)程利用嗎?
不可以,但是如果攻擊者可以以任何非特權(quán)用戶身份登錄,則可以快速利用該漏洞來獲得 root 特權(quán)。
能不能查到被攻擊的證據(jù)?
是的,這種利用技術(shù)會(huì)在日志中留下痕跡,比如“在/etc/ SHELL文件中找不到SHELL變量的值”或者“環(huán)境變量的值[……]包含可疑內(nèi)容”。但是,請(qǐng)注意,這個(gè)漏洞也可以被利用,不會(huì)在日志中留下任何痕跡。
本文翻譯自:https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034















 
 
 







 
 
 
 