Megosztás:


Kernelcím-fertőtlenítő (KASAN)

A Kernel Address Sanitizer (KASAN) egy Windows kernel meghajtóprogramok által támogatott hibaészlelő technológia, amely lehetővé teszi számos illegális memória-hozzáférési típus, például puffer túlcsordulások és használt tárhely felszabadítás utáni hibák észlelését. Ehhez engedélyeznie kell a KASAN-t a rendszeren, és újra kell fordítania a kernelillesztőt egy adott MSVC fordítójelzővel.

Pre-requisites

A KASAN használatához a következőkre van szüksége:

  • A célrendszer operációsrendszer-verziója, amelyre a rendszermag-illesztőprogram betöltődik:
    • Ügyfél: Windows 11 24H2 vagy újabb.
    • Kiszolgáló: Windows Server 2025 vagy újabb.
  • VisualStudio: 17.11-es vagy újabb verzió.
  • WDK: 10.0.26100.2161-es vagy újabb verzió.

A KASAN csak x64-en támogatott.

A KASAN engedélyezése a kernelillesztőn

  1. Írja be a következő parancssort a célrendszer rendszergazdai parancssori ablakába:

    reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
    

    A beállításkulcs beállítása arra utasítja a Windows kernelt, hogy készüljön fel és fogadja el a KASAN eszközillesztők betöltését. Ha nem állítja be ezt a beállításkulcsot, a Windows kernel elutasítja a KASAN-alapú eszközillesztők betöltését.

  2. Indítsa újra a célrendszert a módosítás érvénybe lépéséhez.

  3. A rendszermag-illesztőprogramot fordítsa újra a KASAN instrumentáció engedélyezésével, egy új kapcsoló megadásával az MSVC fordítónak. Használja az alábbi módszerek egyikét:

    • Grafikus felhasználói felület: a VisualStudio-ban keresse meg a Megoldáskezelőt, kattintson a jobb gombbal a kernelillesztő projektre, és válassza a Tulajdonságok lehetőséget. A tulajdonságlapon navigáljon a Konfigurációs tulajdonságok>>C/C++>>Általános menüpontba, és állítsa a Kernelcím-fertőtlenítő engedélyezése értékét Igen-re. Ezután újraépítheti a megoldást.
    • Parancssor: adja hozzá a /fsanitize=kernel-address paramétert a fordító parancssorához. Ezután építse újra a megoldást.
  4. Töltse be az újrafordított kernelillesztőt a célrendszerbe, és terheléses tesztet végezzen rajta a megszokott módon. A KASAN futásidőben működik, és hibaellenőrzési 0x1F2: KASAN_ILLEGAL_ACCESS keresztül jelenti az illegális memóriaelérési eseményeket.

Regresszió a VisualStudio 17.12-ben

Ha VisualStudio 17.12-et használ, a következő buildelési hibát tapasztalhatja:

error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function

A hiba megkerüléséhez adja hozzá a következő jelzőt a linker parancssorához:

/alternatename:__asan_wrap_wcscat=wcscat

Ezt a regressziót a VisualStudio 17.14.15-ben javítottuk.

Regresszió a VisualStudio 17.14-ről 17.14.14-re

Ha VisualStudio 17.14-et használ, a következő buildelési hibát tapasztalhatja:

error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME

A hiba megkerüléséhez adja hozzá a következő jelzőt a fordító parancssorához:

/fno-sanitize-address-asan-compat-lib

A linker parancssorához a következő flag-eket add:

/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy

Ezt a regressziót a VisualStudio 17.14.15-ben javítottuk.

Annak ellenőrzése, hogy a KASAN engedélyezve van-e a kernelillesztőn

A KASAN használatával lefordított kernelillesztőknek van egy "KASAN" nevű PE-szakasza. Ellenőrizze, hogy a KASAN engedélyezve van-e az illesztőprogramon a következő parancs futtatásával egy fejlesztői parancssorban:

dumpbin /ALL YourDriver.sys

Ha a kimenet tartalmaz egy "KASAN" nevű szakaszt, akkor a KASAN engedélyezve van az illesztőprogramon.

KASAN-jelentések elemzése

Amikor a KASAN illegális memória-hozzáférést észlel az illesztőprogramban, stopkód 0x1F2: KASAN_ILLEGAL_ACCESS hibát ad ki. Ellenőrizze a létrehozott kernel memóriadumpot, és állapítsa meg, hogy az illesztőprogram pontosan hol hajtott végre illegális memóriahozzáférést.

Használja a KASAN-t a célrendszerhez csatlakoztatott kernel-hibakeresővel, hogy a memória dinamikusan vizsgálható legyen, amint a hibaellenőrzés megtörténik, ahelyett, hogy utólagos memóriadump-elemzést végezne.

Hibaellenőrzési paraméterek

A Hibaellenőrzési 0x1F2 paraméterei: KASAN_ILLEGAL_ACCESS a következők:

  1. 1. paraméter: A cím illegálisan lett elérve.
  2. 2. paraméter: A memória-hozzáférés mérete.
  3. 3. paraméter: Az illegális memóriahozzáférést végző hívó címe.
  4. 4. paraméter: További információ a memóriahozzáférésről:
    • Bitek [0:7]: a KASAN árnyékkódja. Lásd az alábbi táblázatot.
    • 8. bit: 1 ha a hozzáférés írás volt, 0 ha olvasás volt.

KASAN árnyékkódok

A KASAN-ban úgy gondoljuk, hogy az összes kernelmemória nyolc bájtos, nyolc bájtos cellák egybefüggő darabjaira van osztva. A KASAN esetében a kernelmemória minden nyolc bájtos celláihoz tartozik egy árnyékkód , amely egy egy bájtos egész szám, amely a cella érvényességét jelzi. Az árnyékkódok kódolása a következő:

Value Meaning
0x00 A cella teljes egészében érvényes: a cella mind a nyolc bájtjának elérése legális.
0x01 –>0x07 A cella részben érvényes: a cella első bájtértéke érvényes, a többi érvénytelen.
0x08 –>0x7F A cella feltételesen érvényes: a cella mind a nyolc bájtjához való hozzáférés adott feltételektől függően jogi vagy illegális lehet.
>= 0x80 A cella teljes egészében érvénytelen: a cella mind a nyolc bájtjához való hozzáférés érvénytelen.

A feltételesen érvényes és teljesen érvénytelen cellákhoz több alkód is használható, amelyek tovább jelzik, hogy a cella milyen típusú memóriához van társítva, és miért lehet illegális a hozzáférése.

Feltételesen érvényes cellák által használt alkódok:

  • 0x09: lapozható memória, amely nem érhető el DISPATCH_LEVEL vagy annál magasabb helyen, de a hozzáférés egyébként legális.

Teljesen érvénytelen cellák által használt alkódok:

  • 0x81: az alloca bal oldali redzone-ja.
  • 0x82: az alloca középső vörös zónája.
  • 0x83: az alloca jobb vörös zónája.
  • 0x84: a globális változónak a jobb oldali vörös zónája.
  • 0x85: általános vörös zóna.
  • 0x86: a tármemória jobb oldali vörös zóna.
  • 0x87: felszabadított készletmemória.
  • 0x8A: az egybefüggő memória bal "redzone"-ja.
  • 0x8B: az egybefüggő memória piros zónája a jobb oldalon.
  • 0x8C: felszabadított lookasidelist memória.
  • 0x8D: a készletmemória bal vörös zónája.
  • 0xF1: a veremváltozó bal oldali vörös zónája.
  • 0xF2: a veremváltozó középső vörös zónája.
  • 0xF3: a veremváltozó jobb oldali redzone-ja.
  • 0xF5: used-after-ret stack változó.
  • 0xF8: hatókörön kívüli veremváltozó.

A KASAN-hibaellenőrzések ismertetése: példa

Tegyük fel, hogy a KASAN hibaellenőrzést adott ki az illesztőprogram végrehajtásakor az alábbi paraméterekkel:

  1. 1. paraméter: 0xFFFFFFFFFFFFABCD
  2. 2. paraméter: 0x0000000000000004
  3. 3. paraméter: 0xFFFFFFFF12345678
  4. 4. paraméter: 0x0000000000000184

Az 1. paraméter azt jelzi, hogy az illesztőprogram megpróbált hozzáférni a címhez 0xFFFFFFFFFFFFABCD , és hogy ez a hozzáférés illegális volt. A 2. paraméter azt jelzi, hogy négy bájtos hozzáférés volt. A 3. paraméter annak az utasításmutatónak a címét adja meg, amelyen az illesztőprogram végrehajtotta az illegális hozzáférést. A 4. paraméter azt jelzi, hogy ez írási hozzáférés volt, és hogy az érintett memória egy globális változó megfelelő vörös zónája volt.

Más szóval az illesztőprogram valószínűleg egy globális változó írási pufferének túlcsordulásával próbálkozott. Ezen információk segítségével megvizsgálhatja és megállapíthatja, hogy hol és hogyan javítható ki ez a hiba az illesztőprogramban.

A KASAN teljesítményre gyakorolt hatása

A KASAN növeli a rendszermag memóriahasználatát, és körülbelül kétszeri lassulást vezet be a KASAN-kompatibilis illesztőprogramokban.

Összehasonlítás a Driver Verifierrel

A KASAN és a Driver Verifier teljesen különálló funkciók, de kölcsönösen kompatibilisek.

A KASAN az illegális memóriahozzáférések észlelésére összpontosít, és hatékonyabb, mint az illesztőprogram-ellenőrző ebben a tartományban, mivel részletesebb megközelítést használ, és több memóriaterületet fed le. A Driver Verifier olyan illesztőprogram-specifikus szabályokkal rendelkezik, amelyek más típusú hibákat keresnek, amelyeket a KASAN nem észlel. További információ : Microsoft: Kernelfertőtlenítők bemutatása a Microsoft-platformokon.

A KASAN és a Driver Verifier együttes használatával maximalizálhatja az illesztőprogram hibáinak észlelését.

Resources