頁表檢查¶
介紹¶
頁表檢查允許透過確保防止某些型別的記憶體損壞來加強核心。
頁表檢查在新的頁面透過將它們的頁表項(PTE,PMD 等)新增到表中而可以從使用者空間訪問時執行額外的驗證。
在檢測到大多數損壞的情況下,核心會崩潰。頁表檢查會帶來很小的效能和記憶體開銷。因此,預設情況下它是停用的,但可以在額外加固勝過效能成本的系統上選擇性地啟用它。此外,由於頁表檢查是同步的,因此它可以透過在錯誤對映發生時崩潰核心,而不是像記憶體損壞錯誤那樣在稍後崩潰來幫助除錯雙重對映記憶體損壞問題。
它也可以用於對各種標誌執行頁表項檢查,並在檢測到非法條目標誌組合時轉儲警告。目前,userfaultfd 是唯一的此類使用者,用於針對任何可寫標誌進行健全性檢查 wr-protect 位。在這種情況下,非法標誌組合不會直接導致資料立即損壞,但這將導致只讀資料變為可寫,從而在以後修改頁面內容時導致損壞。
雙重對映檢測邏輯¶
當前對映 |
新對映 |
許可權 |
規則 |
|---|---|---|---|
匿名 |
匿名 |
讀 |
允許 |
匿名 |
匿名 |
讀/寫 |
禁止 |
匿名 |
命名 |
任何 |
禁止 |
命名 |
匿名 |
任何 |
禁止 |
命名 |
命名 |
任何 |
允許 |
啟用頁表檢查¶
使用以下選項構建核心
PAGE_TABLE_CHECK=y 注意,它只能在 ARCH_SUPPORTS_PAGE_TABLE_CHECK 可用的平臺上啟用。
使用“page_table_check=on”核心引數啟動。
可以選擇使用 PAGE_TABLE_CHECK_ENFORCED 構建核心,以便在沒有額外核心引數的情況下支援頁表。
實現說明¶
我們專門決定不使用 VMA 資訊,以避免依賴於 MM 狀態(除了有限的“struct page”資訊)。頁表檢查是獨立於 Linux-MM 狀態機的,它驗證使用者可訪問的頁面沒有被錯誤地共享。
PAGE_TABLE_CHECK 依賴於 EXCLUSIVE_SYSTEM_RAM。原因是如果沒有 EXCLUSIVE_SYSTEM_RAM,使用者可以透過 /dev/mem 將任意物理記憶體區域對映到使用者空間。同時,頁面可能會改變其屬性(例如,從匿名頁面到命名頁面),而它們仍在使用者空間中對映,從而導致頁表檢查檢測到“損壞”。
即使使用 EXCLUSIVE_SYSTEM_RAM,仍然可以透過 /dev/mem 對映 I/O 頁面。但是,這些頁面始終被視為命名頁面,因此它們不會破壞頁表檢查中使用的邏輯。