Qualys 在發行版中使用的 Polkit(以前稱為 PolicyKit)系統元件中發現了一個漏洞 (CVE-2021-4034),該漏洞允許非特權使用者執行需要提升存取權限的操作。 該漏洞允許非特權本地用戶將其權限升級為 root 並獲得對系統的完全控制。 這個問題的代號為 PwnKit,值得注意的是,它產生了一個在大多數 Linux 發行版的預設配置下運行的有效漏洞。
該問題存在於 PolKit 的 pkexec 實用程式中,該實用程式帶有 SUID root 標誌,旨在根據指定的 PolKit 規則以另一個使用者的權限執行命令。 由於對傳遞給 pkexec 的命令列參數的處理不正確,非特權使用者可能會繞過身份驗證並導致其程式碼以 root 身份運行,而不管存取規則設定如何。 對於攻擊來說,在 PolKit 中指定什麼設定和限制並不重要,只要使用 pkexec 公用程式為執行檔設定 SUID 根屬性就足夠了。
Pkexec 不檢查啟動進程時傳遞的命令列參數計數 (argc) 的有效性。 pkexec 的開發人員假設 argv 陣列中的第一個條目始終包含進程的名稱 (pkexec),第二個條目要么是 NULL 值,要么是透過 pkexec 啟動的命令的名稱。 由於參數計數沒有根據數組的實際內容進行檢查,並且被假定為始終大於 1,因此如果向進程傳遞空 argv 數組(如 Linux execve 函數允許的那樣),pkexec 會將 NULL 視為第一個參數(進程名稱)和下一個在緩衝記憶體之外,就像陣列的後續內容一樣。 |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | argv[0] .... | argv[argc] | argv[argc] | 環境[1] | 環境[XNUMX] | .... | 環境變數[環境變數] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV“程式”“-選項”NULL“值”“PATH=名稱”NULL
問題是,在 argv 數組之後,記憶體中有一個包含環境變數的 envp 數組。 因此,如果argv 數組為空,pkexec 從帶有環境變數的數組的第一個元素中提取有關以提升的權限運行的命令的資料(argv[1] 與envp[0] 相同),其中的內容可以控制由攻擊者。
收到 argv[1] 的值後,pkexec 嘗試考慮 PATH 中的檔案路徑來確定可執行檔的完整路徑,並將一個指向具有完整路徑的字串的指標寫回 argv[1],這導致覆蓋第一個環境變數的值,因為argv[1] 與envp[0] 相同。 透過操縱第一個環境變數的名稱,攻擊者可以在pkexec中取代另一個環境變量,例如取代suid程式中不允許的「LD_PRELOAD」環境變量,並安排其共用程式庫載入到過程。
有效利用涉及替換 GCONV_PATH 變量,該變量用於確定符號轉碼庫的路徑,在調用 g_printerr() 函數時動態加載,該函數的程式碼使用 iconv_open()。 透過重新定義 GCONV_PATH 中的路徑,攻擊者可以確保載入的不是標準 iconv 函式庫,而是它自己的函式庫,當 pkexec 仍在執行時顯示錯誤訊息時,將從該函式庫執行處理程序root 權限和啟動前權限都會被檢查。
值得注意的是,儘管該問題是由記憶體損壞引起的,但無論使用何種硬體架構,都可以可靠且可重複地利用該問題。 準備好的漏洞已在 Ubuntu、Debian、Fedora 和 CentOS 上成功測試,但也可以在其他發行版上使用。 原始漏洞尚未公開,這表明它很簡單,並且其他研究人員可以輕鬆重新創建,因此在多用戶系統上盡快安裝修補程式更新非常重要。 Polkit 也可用於 BSD 系統和 Solaris,但尚未研究在它們上的使用。 已知的是,該攻擊無法在 OpenBSD 上進行,因為 OpenBSD 核心不允許在呼叫 execve() 時傳遞 null argc 值。
該問題自 2009 年 6 月新增 pkexec 命令以來一直存在。 PolKit 漏洞的修復目前以修補程式形式提供(尚未發布修補程式版本),但由於發行版開發人員提前收到了該問題的通知,因此大多數發行版在披露漏洞資訊的同時發布了更新。 該問題已在 RHEL 7/8/0755、Debian、Ubuntu、openSUSE、SUSE、Fedora、ALT Linux、ROSA、Gentoo、Void Linux、Arch Linux 和 Manjaro 中修復。 作為阻止漏洞的臨時措施,您可以從 /usr/bin/pkexec 程式中刪除 SUID root 標誌(“chmod XNUMX /usr/bin/pkexec”)。
來源: opennet.ru