Black Hat Europe 2025 | Page Phantoms: Zero-IO, In-Memory Tampering Of The Linux Page Cache
三句話摘要
通過繞過頁面緩存管理的監控,在Linux中實現無IO的內存級文件修改攻擊,躲避主機VMM檢測。 頁面緩存內存管理的動態特性與主機VMM監控的靜態基線之間存在根本矛盾,攻擊者可利用MGLRU直接操縱可回收頁面實現內存級文件篡改,其無API、無IO的特性使其難以被檢測。 雙層防禦的盲點 — 主機VMM監控主要聚焦固定區域(.text、.data)和穩定內核對象(inode),但文件數據頁面是動態的、頻繁交換的,外觀與正常內存使用無異,成為攻擊者可利用的缺口。
重點整理
重點- 1
雙層防禦的盲點 — 主機VMM監控主要聚焦固定區域(.text、.data)和穩定內核對象(inode),但文件數據頁面是動態的、頻繁交換的,外觀與正常內存使用無異,成為攻擊者可利用的缺口。
- 2
MGLRU作為偵查工具 — 新型LRU管理器通過世代機制追蹤頁面熱度,熱頁面被保護在內存中更長時間,這讓攻擊者能識別並穩定定位目標文件頁面,提供充足的攻擊窗口。
- 3
智能的三階段隔離方案 — 通過分離"選擇頁面"(短時持鎖)、"解析路徑"(無鎖)、"隔離目標"(單頁面鎖)三個階段,完全規避ABBA死鎖和軟鎖上問題,允許安全定位目標頁面。
- 4
地址空間直接替換,繞過API監控 — 與其修改原有頁面(會觸發API調用),攻擊者直接替換XAS條目、將修改後的頁面放入位置、清除dirty標誌並讓內核背景進程自動寫回,整個過程不產生可監控的API調用。
實用技巧與重點
乾貨- 監控層次
- 主機側:VMM、QEMU、KVM;監控inode結構及哈希變化
- Guest側:EDR、VFS層、頁面緩存API;監控kernel API調用和inode修改
- 目標文件
- /etc/password、/etc/shadow、系統登錄日誌
- 核心數據結構
- MGLRU(多代LRU):GenZero(年輕頁)、Gen1...MaxGen(老頁)
- XAS(地址空間結構):按索引管理文件的所有頁面
- struct page(folio):頁面元數據
- struct address_space:inode的頁面緩存索引
- 技術問題與解決方案
- 死鎖問題:VFS使用dentry lock、IORU使用page lock,順序相反導致ABBA死鎖 → 分離鎖持有時間
- 軟鎖上問題:路徑解析在全局自旋鎖內耗時過長 → 鎖外解析,僅鎖定必要操作
- 緩衝區句柄:新頁面必須預先附加空緩衝區句柄,否則寫回時檔案系統會拒絕
- 七步隔離過程
- 鎖定目標頁面、增加引用計數、標記為protected、解鎖
- 如果其他進程已映射此頁,先解映射
- 修改頁面內容(核心空間或用戶空間映射)
- 從IO列表移除、更新IORU世代/計數器
- 更新VM計數器、清除IORU標誌
- 從頁面緩存樹移除、清除dirty標誌、清除reserved標誌、丟棄引用計數
- 地址空間替換步驟
- 複製新folio的struct address_space、索引、標記
- 設置up-to-date標誌(必須,否則檔案系統拒絕寫回)
- 附加緩衝區句柄(與正常寫回路徑一致)
- 替換XAS條目(新folio取代舊頁面位置)
- 更新MGLRU和VM計數器
- 丟棄舊頁面最後引用
結論
結論“頁面緩存內存管理的動態特性與主機VMM監控的靜態基線之間存在根本矛盾,攻擊者可利用MGLRU直接操縱可回收頁面實現內存級文件篡改,其無API、無IO的特性使其難以被檢測。”
完整解析
詳細演講者Jia是Linux和虛擬化安全領域有25年經驗的研究者。他提出的核心問題是:在當前的雙層防禦體系(主機VMM監控 + Guest EDR防護)中,是否存在主機看不到、Guest EDR也無法檢測的攻擊路徑?
問題背景與防禦現狀 — 傳統的主機VMM防禦主要監控guest GPA內存的完整性和kernel程式碼變化,但這種監控基於靜態信任基線:固定代碼段(.text、.data)、穩定的內核對象(inode、superblock等)。然而,文件數據頁面本質上是動態的、頻繁交換的,系統無法對其建立可靠的信任基線。這是防禦的第一個缺口。
MGLRU與頁面定位 — Linux 6.1版本後引入的多代LRU(MGLRU)是這項研究的關鍵。不同於經典LRU的簡單線性結構,MGLRU將頁面按訪問熱度分組成多個世代(Gen0最年輕,MaxGen最老)。當頁面被訪問時,硬體PTE訪問位會觸發promote邏輯,將熱頁面移回Gen0保持在內存。這看似是內核的優化機制,但恰好成為攻擊者的利器:演講者可以通過掃描MGLRU結構直接定位哪些文件頁面最近被訪問過、停留時間最長,這些頁面提供了穩定的攻擊窗口。
死鎖與軟鎖上的突破 — 要在kernel中安全定位文件頁面,需要遍歷MGLRU(需要頁面鎖)並進行VFS路徑解析(需要dentry鎖)。但Linux VFS的加鎖順序是"先dentry再page",而遍歷MGLRU時反向加鎖會在多核環境中造成ABBA死鎖。更糟的是,路徑解析本身很慢,在全局自旋鎖內執行會導致軟鎖上。演講者巧妙地採用三階段策略:(1)在短時持有全局鎖的情況下快速掃描MGLRU並記錄頁面引用,(2)釋放鎖後在外部進行路徑解析,(3)確認目標頁面後只對該頁面施加單一鎖。這個設計完全避免了死鎖風險,也規避了軟鎖上問題。
六步隔離與四步修改 — 一旦找到目標頁面,攻擊進入隔離階段。通過增加引用計數、標記protected標誌,防止頁面被回收器移除;然後將其從各種系統記帳結構中拔出——從IO列表移除、清除IORU標誌、從頁面緩存樹脫離、清除dirty標誌。這樣做的效果是:頁面仍在內存中,內容完全可控,但對系統而言,它已不存在於任何追蹤機制中。修改階段,攻擊者可以直接在核心空間修改頁面內容,或將其映射到用戶空間進行修改。所有這些操作都不涉及檔案系統API調用,主機VMM的監控點無法觸發。
地址空間直接替換——磁盤IO的繞過 — 第一種攻擊(memory-only)只修改頁面緩存內容但不寫回磁盤。但若要持久化修改(如篡改日誌文件、配置文件),必須寫到磁盤。傳統路徑需要調用頁面緩存API進行標記為dirty、更新metadata、刷新到磁盤,這些都會被監控。演講者的解決方案是XAS條目直接替換:不修改原頁面,而是創建修改後的新頁面放入XAS(地址空間結構),設置必要的metadata標誌(如up-to-date),附加緩衝區句柄以符合檔案系統預期。系統的背景回寫線程會自動發現這個dirty頁面並寫回磁盤,整個過程無需攻擊代碼干預,主機完全看不到API調用。
演示與現實 — 在演講的demo中,攻擊者成功修改/etc/shadow文件中的root密碼哈希。第一種攻擊只改頁面緩存,主機VMM無alert;即使重啟系統(從磁盤重新加載),原始內容依舊,因為沒有持久化。第二種攻擊通過地址空間替換寫回磁盤,系統重啟後修改仍然存在。整個過程中,主機VMM的監控始終無法檢測到任何異常,因為沒有kernel API調用、沒有inode修改、沒有可監控的IO操作。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

