Linux 內核中可篡改只讀文件的漏洞

Linux 核心中已發現一個漏洞 (CVE-2022-0847),該漏洞允許任何檔案的頁面快取內容被覆蓋,包括處於唯讀模式、使用 O_RDONLY 標誌開啟或位於檔案系統上的檔案以唯讀模式安裝。 實際上,該漏洞可用於將程式碼注入任意進程或損壞開啟檔案中的資料。 例如,您可以變更 sshd 進程的authorized_keys 檔案的內容。 此漏洞利用的原型可供測試。

這個問題的代號為 Dirty Pipe,類似於 2016 年發現的嚴重漏洞 Dirty COW。 值得注意的是,就危險程度而言,Dirty Pipe 與 Dirty COW 處於同一級別,但操作起來要容易得多。 該漏洞是在分析有關從日誌伺服器下載壓縮檔案的系統中透過網路下載的檔案定期損壞的投訴時發現的(載入的系統在37 個月內出現3 次損壞),其準備過程使用了splice()操作和無名管道。

該漏洞從 5.8 年 2020 月發布的 Linux 核心 11 開始出現,即存在於 Debian 20.04 中,但不影響 Ubuntu 8 LTS 中的基本核心。 RHEL 15.x 和 openSUSE/SUSE 5.16.11 核心最初是基於舊分支,但導致問題的變更可能已向後移植到其中(尚無確切資料)。 您可以在以下頁面上追蹤發行版中軟體包更新的發布:Debian、SUSE、Ubuntu、RHEL、Fedora、Gentoo、Arch Linux。 版本 5.15.25、5.10.102 和 XNUMX 中提出了對此漏洞的修復。 該修復程式也包含在 Android 平台使用的核心中。

這個漏洞是由於函數copy_page_to_iter_pipe()和push_pipe()的程式碼中缺乏「buf->flags」值的初始化而引起的,儘管在分配結構時和某些操作期間內存並未被清除。無名管道,來自另一個操作的值。 使用此功能,非特權本地用戶可以實現標誌中 PIPE_BUF_FLAG_CAN_MERGE 值的出現,這允許您透過簡單地將新資料寫入專門準備的未命名管道來組織頁面快取中的資料覆蓋。

對於攻擊,目標檔案必須是可讀的,並且由於寫入管道時不會檢查存取權限,因此也可以對位於唯讀安裝分割區中的檔案(例如,對於檔案 c CD-只讀記憶體)。 替換頁面快取中的信息後,當從文件中讀取數據時,進程將接收到的不是實際數據,而是替換後的數據。

操作歸結為創建一個未命名通道並用任意資料填充它,以確保在與其關聯的所有環結構中設定 PIPE_BUF_FLAG_CAN_MERGE 標誌。 接下來,從通道讀取數據,但在 pipeline_inode_info 環結構中的所有 pipeline_buffer 結構實例中仍保留設定該標誌。 然後呼叫 splice() 將目標檔案中的資料讀取到未命名管道中,從所需的偏移量開始。 當寫入資料到這個無名管道時,由於PIPE_BUF_FLAG_CAN_MERGE標誌被設置,頁面快取中的資料將被覆蓋,而不是創建pipe_buffer結構的新實例。

來源: opennet.ru

添加評論