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