網(wǎng)安 | Linux Polkit 權(quán)限提升漏洞(CVE-2021-4034)
一、漏洞簡介
2021年,Qualys研究團(tuán)隊(duì)公開披露了在Polkit的pkexec 中發(fā)現(xiàn)的一個權(quán)限提升漏洞,也被稱為PwnKit。該漏洞是由于pkexec 沒有正確處理調(diào)用參數(shù),導(dǎo)致將環(huán)境變量作為命令執(zhí)行,攻擊者可以通過構(gòu)造環(huán)境變量的方式,誘使pkexec執(zhí)行任意代碼使得非特權(quán)本地用戶獲取到root的權(quán)限。
影響范圍(受影響的主流Linux發(fā)行版本):Ubuntu 21.10 (Impish Indri) policykit-1 < 0.105-31ubuntu0.1 Ubuntu 21.04 (Hirsute Hippo) policykit-1 Ignored (reached end-of-life) Ubuntu 20.04 LTS (Focal Fossa) policykit-1 < Released (0.105-26ubuntu1.2) Ubuntu 18.04 LTS (Bionic Beaver) policykit-1 < Released (0.105-20ubuntu0.18.04.6) Ubuntu 16.04 ESM (Xenial Xerus) policykit-1 < Released (0.105-14.1ubuntu0.5+esm1) Ubuntu 14.04 ESM (Trusty Tahr) policykit-1 < Released (0.105-4ubuntu3.14.04.6+esm1) CentOS 6 polkit < polkit-0.96-11.el6_10.2 CentOS 7 polkit < polkit-0.112-26.el7_9.1 CentOS 8.0 polkit < polkit-0.115-13.el8_5.1 CentOS 8.2 polkit < polkit-0.115-11.el8_2.2 CentOS 8.4 polkit < polkit-0.115-11.el8_4.2 Debain stretch policykit-1 < 0.105-18+deb9u2 Debain buster policykit-1 < 0.105-25+deb10u1 Debain bookworm, bullseye policykit-1 < 0.105-31.1
二、漏洞原理
2.1 Polkit
Polkit(PolicyKit)是類Unix系統(tǒng)中一個應(yīng)用程序級別的工具集,通過定義和審核權(quán)限規(guī)則,實(shí)現(xiàn)不同優(yōu)先級進(jìn)程間的通訊。pkexec是Polkit開源應(yīng)用框架的一部分,可以使授權(quán)非特權(quán)用戶根據(jù)定義的策略以特權(quán)用戶的身份執(zhí)行命令。
2.2 原理分析
該漏洞主要是使用pkexec加載惡意的so文件來進(jìn)行提權(quán),這里使用的是polkit-0.120的源碼進(jìn)行分析。下載地址為:https://www.freedesktop.org/software/polkit/releases/polkit-0.120.tar.gz?。src/programs/pkexec.c的部分代碼如下:
435行:main函數(shù),兩個參數(shù)含義如下:
argc (argument count):表示傳入main函數(shù)中參數(shù)的個數(shù),包括這個程序本身。
argv(argument vector):表示傳入main函數(shù)中的參數(shù)列表,其中argv[0]是這個函數(shù)的名稱。
534-568行:main函數(shù)處理命令行參數(shù)。
610-640 行:在 PATH 環(huán)境變量的目錄中搜索要執(zhí)行的程序,如果其路徑不是絕對路徑(path[0] != '/'),則argv[n] = path = s。
若我們讓argc為0,即傳入的參數(shù)為空,則會出現(xiàn)以下情況:
第534行:n被賦值為1。
第610行:argv[n] (此時為argv[1])將會越界讀取指針路徑。
第639行:指針s被越界寫入argv[1]的內(nèi)容。
而要知道這個越界的argv[1]讀寫的什么內(nèi)容,我們就必須得了解execve函數(shù),其原型如下:
當(dāng)使用execve()函數(shù)啟動一個新程序時,內(nèi)核將參數(shù)、環(huán)境變量字符串以及指針(argv與envp)復(fù)制到新程序堆棧的末尾。如使用其啟動pkexec,則execve("/usr/bin/pkexec",{"program","-option",...},{"value","PATH=name",...})的內(nèi)存布局如下圖:

由上圖可知,argv和envp指針在內(nèi)存中是連續(xù)的,若argc為0,則argv[1]指向的就是envp[0],就是第一個環(huán)境變量“value”。繼續(xù)前面的分析:
第610行:將要執(zhí)行的程序的路徑從argv[1](即envp[0])中越界讀取,并指向“value”。
第632行:這個路徑“value”被傳遞給 g_find_program_in_path函數(shù),在 PATH 環(huán)境變量的目錄中搜索一個名為“value”的可執(zhí)行文件;如果找到這樣的可執(zhí)行文件,則將其完整路徑返回給pkexec第 632 行的指針s;
第639行:這個完整路徑被越界寫入argv[1](即envp[0]),從而覆蓋了我們的第一個環(huán)境變量。
但是在670行對環(huán)境變量進(jìn)行了校驗(yàn),防止引入危險的環(huán)境變量。

該validate_environment_variable() 函數(shù)部分代碼如下:

其中使用了g_printerr()函數(shù)打印錯誤消息,該函數(shù)調(diào)用了glibc的函數(shù)iconv_open()函數(shù)。iconv_open()函數(shù)使用時首先會找到系統(tǒng)提供的gconv-modules文件(這個文件中包含了各個字符集的相關(guān)信息存儲的路徑,每個字符集的相關(guān)信息存儲在一個.so文件中,即gconv-modules文件提供了各個字符集的.so文件所在位置)。然后再根據(jù)gconv-modules文件的指示去鏈接參數(shù)對應(yīng)的.so文件。
而GCONV_PATH這個環(huán)境變量可以修改指向gconv-modules的位置,也就是說如果攻擊者控制了GCONV_PATH就可以讓iconv_open找到攻擊者構(gòu)造的gconv-modules,讓其執(zhí)行指定的.so文件內(nèi)的特定函數(shù)來進(jìn)行提權(quán)。
三、漏洞復(fù)現(xiàn)
3.1 實(shí)驗(yàn)環(huán)境
操作系統(tǒng):Centos7.9(鏡像地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso)
普通用戶:zhangsan
漏洞利用工具:https://github.com/berdav/CVE-2021-4034
3.2 復(fù)現(xiàn)過程
下載漏洞利用工具,這里現(xiàn)將工具壓縮包下載值kali,在kali上用python開啟web服務(wù),來讓被攻擊主機(jī)下載。
壓縮,編譯,利用。

提權(quán)成功。
四、修復(fù)建議
更新官方補(bǔ)丁,下載地址:https://gitlab.freedesktop.org/polkit/polkit/-/commit/a2bf5c9c83b6ae46cbd5c779d3055bff81ded683
根據(jù)不同廠商的修復(fù)建議或安全通告進(jìn)行防護(hù)。
Redhat:https://access.redhat.com/security/cve/CVE-2021-4034
Ubuntu:https://ubuntu.com/security/CVE-2021-4034
Debian:https://security-tracker.debian.org/tracker/CVE-2021-4034
臨時防護(hù)可以移除 pkexec 的 suid位。
五、參考文章
CVE-2021-4034 Linux Polkit 權(quán)限提升漏洞挖掘思路解讀(https://cloud.tencent.com/developer/article/1940677)。
SUID提權(quán):CVE-2021-4034漏洞全解析(https://www.cnblogs.com/northeast-coder/p/15925463.html)。
CVE-2021-0434 詳解 exp編寫 復(fù)現(xiàn)(https://www.cnblogs.com/ash-33/p/16118713.html)。
CVE-2021-4034:Linux Polkit 權(quán)限提升漏洞復(fù)現(xiàn)及修復(fù)(https://blog.csdn.net/laobanjiull/article/details/122715651)。
PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034) (https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034)。