這篇文章將為工程師詳細分析近期發現的 Linux 核心漏洞 Dirty Frag。對於不熟悉核心開發的開發者來說,這類漏洞通常涉及記憶體管理與權限邊界,理解其原理有助於在系統維運與安全性設定上採取正確的防禦措施。
漏洞背景與定義
Dirty Frag 是一個本地權限提升漏洞,簡稱 LPE(Local Privilege Escalation)。這意味著攻擊者必須已經擁有系統的普通使用者權限(例如透過 SSH 登入或執行一個低權限的 Web 服務),然後利用此漏洞將權限提升至 root(最高管理員權限)。
這個漏洞被視為 Dirty Pipe 與 Copy Fail 漏洞的繼承者。這類漏洞的核心特徵在於能夠在不觸發系統崩潰(Kernel Panic)且不依賴競爭條件(Race Condition)的情況下,穩定地修改核心記憶體。由於它是邏輯錯誤而非時序問題,因此成功率極高且具有決定性。
核心技術原理:Page Cache 寫入漏洞
要理解 Dirty Frag,首先要理解 Page Cache(頁快取)。Linux 為了加速讀寫,會將磁碟上的檔案內容快取在記憶體中,這就是 Page Cache。正常情況下,如果一個普通使用者嘗試修改快取的檔案,核心會執行 Copy-on-Write(COW,寫入時複製)機制,為該使用者建立一份私有副本,而不會影響到原始的快取內容,從而保護系統檔案。
Dirty Frag 的漏洞點在於某些特定的快取路徑跳過了 COW 機制。具體來說,漏洞存在於 ESP-in-UDP 的 MSG_SPLICE_PAGES 快速路徑中。當核心處理某些由 splice(2) 或 sendfile(2) 等系統呼叫傳入的頁面片段(Paged Fragments)時,它會直接在這些外部持有的頁面上進行解密操作。
這導致了一個嚴重的問題:核心在對數據進行解密寫入時,直接修改了 Page Cache 中的內容,而沒有建立副本。如果攻擊者能控制這些頁面,他們就可以將特定的 4 位元組數據寫入到核心快取中。雖然一次只能寫入少量數據,但只要能精準修改關鍵的系統設定或權限標記,就足以奪取 root 權限。
雙路徑攻擊鏈:xfrm-ESP 與 RxRPC
Dirty Frag 並非單一漏洞,而是由兩個相似的漏洞組成,用以覆蓋不同發行版的防禦限制。
第一個路徑是 xfrm-ESP 漏洞,位於 IPSec(網路安全協定)的子系統中。這個漏洞雖然強大,但需要使用者能夠建立 User Namespace(使用者命名空間)。然而,許多安全性較高的發行版(如 Ubuntu)會透過 AppArmor 等安全模組封鎖普通使用者建立命名空間的功能,導致此路徑失效。
第二個路徑是 RxRPC 漏洞。RxRPC 是一種遠端程序呼叫機制。這個漏洞不需要建立命名空間即可觸發,但問題在於許多發行版(如 RHEL)預設不會編譯或載入 rxrpc.ko 模組。有趣的是,Ubuntu 預設載入了這個模組。
這形成了一個互補的攻擊鏈:在允許建立命名空間的系統上使用 ESP 漏洞;在封鎖命名空間但載入 RxRPC 模組的系統(如 Ubuntu)上,則使用 RxRPC 漏洞。
受影響範圍與實務影響
此漏洞影響範圍極廣,涵蓋了大多數主流 Linux 發行版,包括 Ubuntu 24.04.4、RHEL 10.1、Fedora 44、CentOS Stream 10 以及 AlmaLinux 10。
對於維運工程師來說,最危險的是目前的緩解措施可能失效。先前針對 Copy Fail 漏洞的常見對策是將 algif_aead 模組列入黑名單,但 Dirty Frag 並不依賴此模組,因此即便採取了舊的防禦手段,系統依然處於危險之中。
緊急緩解方案
在官方正式補丁發布前,最有效的臨時對策是禁止載入受影響的核心模組。可以透過在 /etc/modprobe.d/ 中建立設定檔,將 esp4、esp6 與 rxrpc 模組強制指向 /bin/false,使其無法被載入。
具體操作為執行以下指令: sudo sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"
來源:thehackernews.com
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。