基本介紹
- 中文名:核心頁表隔離
- 外文名:Kernel page-table isolation
- 縮寫:KPTI
- 領域:計算機
前身,Meltdown漏洞與KPTI,實現,用戶空間,地址空間配置隨機載入,
前身
KPTI補丁基於KAISER,它是一個用於緩解不太重要問題的早期補丁,當時業界還未了解到Meltdown的存在。
如果沒有KPTI,每當執行用戶空間代碼(應用程式)時,Linux會在其分頁表中保留整個核心記憶體的映射,並保護其訪問。這樣做的優點是當應用程式向核心傳送系統調用或收到中斷時,核心頁表始終存在,可以避免絕大多數上下文交換相關的開銷(TLB刷新、頁表交換等)。
2005年,Linux核心採用了地址空間配置隨機載入(KASLR)隱匿用戶空間中的相關核心地址,增加了利用其他核心漏洞的難度。儘管阻止了對這些核心映射的訪問,但在此後發現,現有的英特爾x86處理器(截至2017年12月)還存在著多處可能泄露這些記憶體位置的旁路攻擊,可能繞過KASLR。AMD稱其處理器不受這些攻擊的影響,所以不需要KPTI作為緩解措施。
Meltdown漏洞與KPTI
實現
KPTI通過完全分離用戶空間與核心空間頁表來解決頁表泄露。支持進程上下文標識符(PCID)特性的x86處理器可以用它來避免TLB刷新,但即便如此,它依然有很高的性能成本。據KAISER原作者稱,其開銷為0.28%;一名Linux開發者稱大多數工作負載下測得約為5%,但即便有PCID最佳化,在某些情況下開銷高達30%。
KPTI在2018年早期被合併到Linux核心4.15版,並被反向移植到Linux核心4.14.11。Windows和macOS也發布了類似的更新。
使用核心啟動選項“pti=off”可以部分禁用核心頁表隔離。依規定也可對已修復漏洞的新款處理器禁用核心頁表隔離。
用戶空間
這是存儲器保護機制中的一環。核心、核心擴充(kernel extensions)、以及驅動程式,運行在核心空間上。而其他的應用程式,則運行在用戶空間上。所有運行在用戶空間的應用程式,都被統稱為用戶級(userland)。