Pkexec中本地權(quán)限升級漏洞的技術(shù)細(xì)節(jié)分析
Qualys研究團(tuán)隊在polkit的pkexec中發(fā)現(xiàn)了一個內(nèi)存破壞漏洞,pkexec是一個SUID-root程序,默認(rèn)安裝在每個主要的Linux發(fā)行版上。這個容易被利用的漏洞允許任何沒有相關(guān)權(quán)限的用戶通過利用默認(rèn)配置中的這個漏洞獲得脆弱主機(jī)上的完全根權(quán)限。
關(guān)于Polkit pkexec for Linux
Polkit(以前是PolicyKit)是一個用于控制類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)能夠獨立驗證該漏洞,并利用該漏洞,進(jìn)而獲得Ubuntu、Debian、Fedora和CentOS默認(rèn)安裝的全部root權(quán)限。其他 Linux 發(fā)行版可能容易受到攻擊并且可能被利用。這個漏洞已經(jīng)隱藏了 12 年多,并影響自 2009 年 5 月第一個版本以來的所有 pkexec 版本(commit c8c3d83, “Add a pkexec(1) command”)。
在我們的研究團(tuán)隊確認(rèn)該漏洞后,Qualys負(fù)責(zé)漏洞的披露,并與供應(yīng)商和開源發(fā)行方協(xié)調(diào),公布了該漏洞。
潛在漏洞利用路徑的視頻可以點此查看。(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行),如果它的路徑不是絕對的,則在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];
但是,這個越界的argv[1]到底要讀寫什么呢?
要回答這個問題,我們必須稍微離題一下。當(dāng)execve()一個新程序時,內(nèi)核將我們的參數(shù)、環(huán)境字符串和指針(argv和envp)復(fù)制到新程序堆棧的末尾,例如:
顯然,因為argv和envp指針在內(nèi)存中是連續(xù)的,如果argc是0,那么越界的argv[1]實際上是envp[0],指向我們的第一個環(huán)境變量value的指針。結(jié)果:
在第 610 行,要執(zhí)行的程序的路徑從 argv[1](即 envp[0])越界讀取,并指向“value”;
在第 632 行,這個路徑“value”被傳遞給 g_find_program_in_path()(因為“value”在第629行不是以斜杠開頭的);
然后,g_find_program_in_path() 在我們的 PATH 環(huán)境變量的目錄中搜索一個名為“value”的可執(zhí)行文件;
如果找到這樣的可執(zhí)行文件,則將其完整路徑返回給 pkexec 的 main() 函數(shù)(在第 632 行);
最后,在第 639 行,這個完整路徑被越界寫入 argv[1](即 envp[0]),從而覆蓋了我們的第一個環(huán)境變量。
所以,更準(zhǔn)確地說:
如果我們的PATH環(huán)境變量是" PATH=name ",并且目錄" name "存在(在當(dāng)前工作目錄中)并且包含一個名為" value "的可執(zhí)行文件,那么一個指向字符串" name/value "的指針將被寫入envp[0]。
如果我們的 PATH 是“PATH=name=.”,并且目錄是“name=.”存在并包含一個名為“value”的可執(zhí)行文件,然后將指向字符串“name=./value”的指針越界寫入 envp[0]。
換句話說,這種越界寫入允許我們將“不安全的”環(huán)境變量(例如,LD_PRELOAD)重新引入到pkexec的環(huán)境中。在調(diào)用main()函數(shù)之前,這些“不安全的”變量通常會(通過ld.so)從SUID程序的環(huán)境中刪除。我們將在下一節(jié)中使用這個強(qiáng)大的原語。
不過要注意的是,polkit也支持非linux操作系統(tǒng),如Solaris和*BSD,但我們尚未調(diào)查它們的可利用性。然而,我們注意到OpenBSD是不可利用的,因為如果argc為0,它的內(nèi)核拒絕execve()一個程序。
如何修復(fù)PwnKit漏洞
考慮到該漏洞在Linux和非Linux操作系統(tǒng)中的攻擊范圍,Qualys建議用戶立即更新此應(yīng)用。
目前Qualys客戶可以搜索CVE-2021-4034的相關(guān)新聞,以識別該漏洞的所有QID 和設(shè)備。
現(xiàn)在可以開始免費的 Qualys VMDR 試用,以獲得對 CVE-2021-4034 的 QID(檢測)的完全訪問權(quán)限,其中可以識別所有易受攻擊的設(shè)備。
Qualys研究團(tuán)隊在polkit的pkexec中發(fā)現(xiàn)了一個內(nèi)存破壞漏洞,pkexec是一個SUID-root程序,默認(rèn)安裝在每個主要的Linux發(fā)行版上。這個容易被利用的漏洞允許任何沒有權(quán)限的用戶通過利用默認(rèn)配置中的這個漏洞獲得脆弱主機(jī)上的完全根權(quán)限。
關(guān)于Linux的Polkit pkexec
Qualys QID 覆蓋范圍
Qualys 將發(fā)布下表中的 QID,因為它們從 vulnsigs 版本 VULNSIGS-2.5.387-2 和 Linux 云代理清單版本 lx_manifest-2.5.387.2-1 開始可用。
使用 Qualys VMDR 發(fā)現(xiàn)易受攻擊的 Linux 服務(wù)器
識別運行 Linux 內(nèi)核的設(shè)備
接下來會介紹當(dāng)前 Qualys 客戶如何在他們的環(huán)境中檢測 PwnKit。
管理這一關(guān)鍵漏洞和降低風(fēng)險的第一步是識別運行Linux操作系統(tǒng)的所有設(shè)備。Qualys VMDR使得識別此類設(shè)備變得很容易。
Query: operatingSystem.category1:`Linux`
一旦主機(jī)被識別出來,就可以將它們與“動態(tài)標(biāo)簽”組合在一起,比如說:“Linux 服務(wù)器”。這有助于自動對具有上述漏洞的現(xiàn)有主機(jī)以及在你的環(huán)境中啟動的任何新 Linux 設(shè)備進(jìn)行分組。標(biāo)簽使得這些分組設(shè)備可以在整個Qualys云平臺上進(jìn)行查詢、報告和管理。
基于 RTI 的優(yōu)先級
使用 Qualys VMDR,可以使用以下實時威脅指標(biāo) (RTI) 確定 PwnKit 漏洞的優(yōu)先級:
- Predicted_High_Risk
- Privilege_Escalation
- Easy_Exploit
- High_Lateral_Movement
使用Qualys VMDR修復(fù)
我們預(yù)計供應(yīng)商將在短期內(nèi)發(fā)布針對該漏洞的修復(fù)。當(dāng)修復(fù)可用時,Qualys Patch Management可用于將這些修復(fù)部署到易受攻擊的設(shè)備中。
使用基于上述 RTI 方法的相同優(yōu)先級,客戶可以使用漏洞右側(cè)的“立即修復(fù)”按鈕將 PwnKit 添加到修復(fù)作業(yè)中。一旦修復(fù)發(fā)布,Qualys將找到該漏洞的相關(guān)修復(fù),并自動將這些修復(fù)添加到修復(fù)作業(yè)中。這將允許客戶將這些修復(fù)部署到易受攻擊的設(shè)備上,所有這些修復(fù)都來自Qualys云平臺。
使用威脅防護(hù)檢測受影響的設(shè)備
VMDR還允許你使用威脅保護(hù)自動映射易受PwnKit漏洞攻擊的設(shè)備。
使用 VMDR 儀表板跟蹤漏洞
使用 VMDR 儀表板,你可以實時跟蹤此漏洞、受影響的主機(jī)、狀態(tài)和整體管理。為儀表板小部件啟用趨勢分析后,你可以使用“PwnKit”儀表板跟蹤環(huán)境中的這些漏洞發(fā)展趨勢。
利用 Qualys XDR 識別漏洞利用嘗試
Qualys XDR 客戶可以使用標(biāo)題為“T1068 – Linux:檢測到 Polkit pkexec 本地特權(quán)升級漏洞 (CVE-2021-4034)”的規(guī)則名稱來檢測受影響系統(tǒ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)隊是否會發(fā)布此漏洞的利用代碼?
不會。但鑒于利用該漏洞非常容易,我們預(yù)計在本博客發(fā)布日期后的幾天內(nèi),公開的漏洞利用將變得可用。
是否有緩解措施?
如果你的操作系統(tǒng)沒有可用的補(bǔ)丁,你可以從 pkexec 中刪除 SUID 位作為臨時緩解措施;例如:
# chmod 0755 /usr/bin/pkexec
這個漏洞可以遠(yuǎn)程利用嗎?
不可以,但是如果攻擊者可以以任何非特權(quán)用戶身份登錄,則可以快速利用該漏洞來獲得 root 特權(quán)。
能不能查到被攻擊的證據(jù)?
是的,這種利用技術(shù)會在日志中留下痕跡,比如“在/etc/ SHELL文件中找不到SHELL變量的值”或者“環(huán)境變量的值[……]包含可疑內(nèi)容”。但是,請注意,這個漏洞也可以被利用,不會在日志中留下任何痕跡。
本文翻譯自:https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034