核心位址清理工具 (KASAN)
核心位址清理程式 (KASAN) 是 Windows 核心驅動程式上支援的 Bug 偵測技術,可讓您偵測數個不合法的記憶體存取類別,例如緩衝區溢位和無用事件。 它要求您在系統上啟用 KASAN,並使用特定的 MSVC 編譯程式旗標重新編譯核心驅動程式。
必要條件
若要使用 KASAN,您需要:
- 將載入核心驅動程式的目標系統的 OS 版本:
- 用戶端:Windows 11 24H2 或更新版本。
- 伺服器:Windows Server 2025 或更新版本。
- VisualStudio:17.11 版或更新版本。
- WDK:10.0.26100.2161 版或更新版本。
只有在 x64 上才支援 KASAN。
如何在核心驅動程式上啟用 KASAN
在目標系統上的系統管理員 命令提示 字元視窗中,輸入下列命令列:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
重新啟動目標系統,變更才會生效。
將新的旗標傳遞至 MSVC 編譯程式,以啟用 KASAN 檢測來重新編譯核心驅動程式。 請使用下列其中一個方法:
- GUI:在 VisualStudio 中,流覽至 方案總管,以滑鼠右鍵按兩下核心驅動程式專案,然後選取 [屬性]。 在屬性頁面中,流覽至 [組態屬性>>C/C++>>][一般],並將 [啟用核心位址清理器] 設定為 [是]。 然後重建您的解決方案。
- 命令提示字元:將 /fsanitize=kernel-address 參數新增至編譯程式命令行。 然後,重建您的解決方案。
在目標系統上載入您重新編譯的核心驅動程式,並像平常一樣對它進行壓力測試。 KASAN 會在運行時間運作,並透過 錯誤檢查0x1F2報告不合法的記憶體存取事件:KASAN_ILLEGAL_ACCESS。
如何確認核心驅動程式上已啟用 KASAN
使用 KASAN 編譯的核心驅動程式具有名為 「KASAN
的 PE 區段。 在開發人員命令提示字元中執行下列命令,確認您的驅動程式已啟用 KASAN:
dumpbin /ALL YourDriver.sys
如果輸出包含名為 「KASAN
的區段,則會在驅動程式上啟用 KASAN。
如何分析 KASAN 報告
當 KASAN 偵測到驅動程式中的非法記憶體存取時,它會發出 錯誤檢查0x1F2:KASAN_ILLEGAL_ACCESS。 檢查產生的核心記憶體轉儲,以判斷驅動程式執行非法記憶體存取的位置。
使用 KASAN 搭配連結至目標系統的核心調試程式,以便在發出錯誤檢查時動態檢查記憶體,而不是使用記憶體轉儲進行驗屍。
錯誤檢查參數
錯誤檢查0x1F2的參數 :KASAN_ILLEGAL_ACCESS 為:
- 參數 1:非法存取的位址。
- 參數 2:記憶體存取的大小。
- 參數 3:執行非法記憶體存取的呼叫端位址。
- 參數 4:記憶體存取的額外資訊:
- 位 [0:7]:KASAN 陰影程序代碼。 請參閱下表。
- 位 8:
1
如果存取是寫入,0
則為讀取。
KASAN 陰影代碼
在 KASAN 中,我們認為所有核心記憶體會以連續的八位元組對齊、八位元組 儲存格區塊來分割。 使用 KASAN 時,核心記憶體中的每個八位元組數據格都有與其 相關聯的陰影程式代碼 ,這是一個字節整數,表示數據格的有效性。 陰影代碼的編碼方式如下:
值 | 意義 |
---|---|
0x00 |
單元格完全有效:存取單元格的所有八個字節都是合法的。 |
0x01 ->0x07 |
單元格部分有效:單元格中的第一個 值 位元組有效,但其餘的則無效。 |
>= 0x80 |
單元格完全無效:存取儲存格的所有八個字節都是非法的。 |
數個子程式代碼會用於完全無效的儲存格,以進一步指出儲存格相關聯的記憶體類型,以及其無效的原因:
0x81
:alloca 的左紅分區。0x82
:alloca 的中間紅區。0x83
:alloca 的右紅區域。0x84
:全域變數的右紅色區域。0x85
:泛型 redzone。0x86
:集區內存的右紅區域。0x87
:釋放記憶體。0x8A
:連續記憶體的左紅區域。0x8B
:連續記憶體的右紅色區域。0x8C
:釋放 lookasidelist 記憶體。0x8D
:集區內存的左紅區域。0xF1
:堆疊變數的左紅區域。0xF2
:堆疊變數的中間紅色區域。0xF3
:堆疊變數的右紅色區域。0xF5
:used-after-ret 堆棧變數。0xF8
:範圍外堆棧變數。
瞭解 KASAN 錯誤檢查:範例
假設 KASAN 在驅動程式執行時發出錯誤檢查,並具有下列參數:
- 參數 1:
0xFFFFFFFFFFFFABCD
- 參數 2:
0x0000000000000004
- 參數 3:
0xFFFFFFFF12345678
- 參數 4:
0x0000000000000184
參數 1 告訴您驅動程式嘗試存取位址 0xFFFFFFFFFFFFABCD
,而且此存取是非法的。 參數 2 會告訴您這是一個四位元組的存取權。 參數 3 提供您驅動程式執行非法存取的指令指標位址。 參數 4 會告訴您這是寫入存取權,而所觸碰的記憶體是全域變數的右紅區域。
換句話說,您的驅動程式可能嘗試在全域變數上執行寫入緩衝區溢位。 使用這項資訊來調查及判斷驅動程式中修正此錯誤的位置和方式。
KASAN 的效能影響
KASAN 會增加核心記憶體耗用量,並在啟用 KASAN 編譯的驅動程式中引入大約兩倍的速度變慢。
與驅動程式驗證器比較
KASAN 和驅動程式驗證器是完全獨立的功能,但相互相容。
KASAN 著重於偵測不合法的記憶體存取,而且比該網域中的驅動程序驗證器更有效率,因為它使用更精細的方法並涵蓋更多的記憶體區域。 驅動程式驗證器有驅動程式特定的規則,旨在尋找其他類型的 Bug,KASAN 不會偵測到。 如需詳細資訊,請參閱 Microsoft:Microsoft 平臺上的核心清理工具簡介。
搭配驅動程式驗證器使用 KASAN,將驅動程式中的 Bug 偵測最大化。