newsence

Linux 核心機制:探究 /proc/self/mem 如何寫入唯讀記憶體

Hacker News·28 天前

本文探討了 Linux 核心如何透過 /proc/self/mem 偽檔案繞過 MMU 限制,實現對唯讀記憶體分頁進行寫入的技術實作細節。

背景

在 Linux 系統中,/proc/*/mem 是一個特殊的虛擬檔案,允許外部或自身進程直接存取虛擬記憶體。這篇文章探討了一個鮮為人知的特性:透過此檔案進行寫入時,即使目標記憶體分頁被標記為唯讀(如 libc 的程式碼段),寫入依然會成功。這種「穿透」語義並非漏洞,而是被 Julia JIT 編譯器與 rr 除錯器等工具廣泛利用的設計,其背後涉及核心如何繞過硬體 MMU 限制的深層機制。

社群觀點

針對核心為何能擁有如此大的權限,社群討論首先聚焦於核心與硬體之間的權力關係。有觀點直言,核心作為分頁表的擁有者,理論上總能找到存取記憶體的路徑。然而,隨著現代硬體安全技術的演進,這種「核心即上帝」的觀念正受到挑戰。部分討論者指出,在雲端運算環境中,透過 IOMMU、MK-TME 記憶體加密以及 TPM 平台認證,超大型雲端服務商(如 Amazon)能承諾即便主機核心遭到入侵,虛擬機的記憶體依然無法被非法竄改。雖然有人質疑攻擊者若具備實體存取權或在重新開機時注入惡意程式碼,這些保護仍可能失效,但支持者反駁,透過安全啟動與硬體證明機制,任何對啟動鏈的改動都會破壞信任鏈結,使攻擊難以隱藏。

關於核心如何實現這種「穿透」寫入,社群進一步釐清了技術細節。核心並非真的完全繞過虛擬記憶體機制,而是透過軟體模擬硬體 MMU 的行為。當使用者寫入 /proc/self/mem 時,核心會手動走訪分頁表,並在 get_user_pages 函式中使用 FOLL_FORCE 標誌。這個標誌會指示核心忽略分頁表的寫入保護限制,甚至在必要時觸發寫入時複製(Copy-on-Write)機制。這意味著核心實際上是在自己的可寫入位址空間內操作,而非直接對抗硬體的寫入保護位元。

此外,資深開發者也補充了當前硬體架構中更複雜的限制因素。除了文章提到的 CR0.WP 和 SMAP 外,現代 CPU 還引入了記憶體保護金鑰(MPK)、巢狀分頁表(NPT/EPT)以及如 TDX 模組的範圍暫存器。這些技術在虛擬化或機密運算場景下,能進一步限制核心對特定實體位址的存取。有趣的是,有開發者提到,當初核心維護者 Linus Torvalds 曾試圖修改這種行為,但因為這項特性在除錯與即時編譯領域過於重要且被廣泛依賴,最終仍維持現狀。這顯示了 Linux 核心在安全性邊界與開發便利性之間,存在著一種務實的權衡。

延伸閱讀

在討論過程中,有參與者分享了針對可信執行環境(TEE)安全性的研究網站 tee.fail,該網站探討了即便有硬體保護,在面對具備實體存取權的攻擊者時,記憶體安全性仍可能面臨挑戰。

https://offlinemark.com/an-obscure-quirk-of-proc/