Sdílet prostřednictvím


Sanitizer adresa jádra (KASAN)

Sanitizér adresy jádra (KASAN) je technologie detekce chyb podporovaná pro ovladače jádra Windows, která umožňuje detekci několika typů nelegálních přístupů k paměti, jako jsou přetečení vyrovnávací paměti a use-after-free události. Vyžaduje, abyste v systému povolili KASAN a znovu zkompiloval ovladač jádra s konkrétním příznakem kompilátoru MSVC.

Pre-requisites

K použití KASAN potřebujete:

  • Verze operačního systému cílového systému, na které se načte ovladač jádra:
    • Klient: Windows 11 24H2 nebo novější.
    • Server: Windows Server 2025 nebo novější.
  • VisualStudio: verze 17.11 nebo vyšší.
  • WDK: verze 10.0.26100.2161 nebo vyšší.

KASAN se podporuje jenom na platformě x64.

Jak povolit KASAN na ovladači jádra

  1. Do okna příkazového řádku správce v cílovém systému zadejte následující příkazový řádek:

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

    Nastavení tohoto klíče registru dává jádru Windows pokyn k přípravě a přijetí načítání instrumentovaných ovladačů KASAN. Nenastavování tohoto klíče registru způsobí, že jádro Windows odmítne načítání instrumentovaných ovladačů KASAN.

  2. Restartujte cílový systém, aby se změna projevila.

  3. Překompilujte ovladač jádra s povolenou instrumentací KASAN tak, že předáte nový příznak kompilátoru MSVC. Použijte některou z následujících metod:

    • Grafické uživatelské rozhraní: V sadě VisualStudio přejděte do Průzkumníka řešení, klikněte pravým tlačítkem na projekt ovladače jádra a vyberte Vlastnosti. Na stránce vlastností přejděte na Vlastnosti konfigurace>>C/C++>>Obecné a nastavte Enable Kernel Address Sanitizer na Ano. Pak znovu sestavte řešení.
    • Příkazový řádek: Přidejte parametr /fsanitize=kernel-address do příkazového řádku kompilátoru. Pak znovu sestavte řešení.
  4. Načtěte rekompilovaný ovladač jádra do cílového systému a zátěžově otestujte ho, jak byste to obvykle chtěli. KASAN pracuje za běhu a hlásí události neplatného přístupu k paměti prostřednictvím 0x1F2 kontroly chyb: KASAN_ILLEGAL_ACCESS.

Regrese ve Visual Studio 17.12

Pokud používáte VisualStudio 17.12, může dojít k následující chybě sestavení:

error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function

Tuto chybu můžete obejít tak, že do příkazového řádku linkeru přidáte následující příznak:

/alternatename:__asan_wrap_wcscat=wcscat

Tato softwarová regrese byla opravena v nástroji VisualStudio 17.14.15.

Regrese v sadě Visual Studio 17.14 až 17.14.14

Pokud používáte VisualStudio 17.14, může dojít k následující chybě sestavení:

error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME

Tuto chybu můžete obejít přidáním následujícího příznaku do příkazového řádku kompilátoru:

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

A následující příznaky příkazového řádku linkeru:

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

Tato regresní chyba byla opravena ve Visual Studio 17.14.15.

Jak ověřit, jestli je na ovladači jádra povolený KASAN

Ovladače jádra zkompilované pomocí KASAN mají oddíl PE s názvem "KASAN". Spuštěním následujícího příkazu v příkazovém řádku pro vývojáře ověřte, že je na ovladači povolený KASAN:

dumpbin /ALL YourDriver.sys

Pokud výstup obsahuje oddíl s názvem "KASAN", je na ovladači povolený KASAN.

Jak analyzovat sestavy KASAN

Když KASAN zjistí v ovladači neplatný přístup k paměti, vydá kontrolu chyb 0x1F2: KASAN_ILLEGAL_ACCESS. Zkontrolujte vygenerovaný výpis paměti jádra a zjistěte, kde přesně váš ovladač provedl neplatný přístup k paměti.

Použijte KASAN s ladicím programem jádra připojeným k cílovému systému, aby bylo možné paměť dynamicky kontrolovat, jakmile dojde ke kontrole chyb, a ne až po havárii s výpisem paměti.

Parametry kontroly chyb

Parametry kontroly chyb 0x1F2: KASAN_ILLEGAL_ACCESS jsou:

  1. Parametr 1: Adresa, ke které se přistupuje neoprávněně.
  2. Parametr 2: Velikost přístupu k paměti.
  3. Parametr 3: Adresa volajícího provádějícího neplatný přístup k paměti
  4. Parametr 4: Dodatečné informace o přístupu k paměti:
    • Bit [0:7]: KASAN stínový kód. Podívejte se na následující tabulku.
    • Bit 8: 1 Pokud byl přístup zápisem, 0 pokud se jednalo o čtení.

Stínové kódy KASAN

V KASAN se domníváme, že veškerá paměť jádra je rozdělena do souvislých bloků osmibajtových buněk, které jsou zarovnané na osm bajtů. U KASAN má každá osmibajtová buňka v paměti jádra přidružený stínový kód, což je jednobajtové celé číslo, které označuje platnost buňky. Kódování stínových kódů je následující:

Value Meaning
0x00 Buňka je zcela platná: přístup ke všem osmi bajtům v buňce je legální.
0x01 –>0x07 Buňka je částečně platná: první bajty v buňce jsou platné, ale zbytek je neplatný.
0x08 –>0x7F Buňka je podmíněně platná: přístup ke všem osmi bajtům v buňce může být v závislosti na konkrétních podmínkách právní nebo nelegální.
>= 0x80 Buňka je zcela neplatná: Přístup ke všem osmi bajtům v buňce je neplatný.

Pro podmíněně platné a zcela neplatné buňky se používá několik dílčích kódů, které dále označují, k jakému typu paměti je buňka přidružena, a proč může být přístup k ní neplatný.

Podprogramy používané podmíněně platnými buňkami:

  • 0x09: stránkovatelná paměť, která je nepovolená pro přístup na DISPATCH_LEVEL nebo vyšší, ale jinak je přístup povolen.

Subkódy používané zcela neplatnými buňkami:

  • 0x81: levé červené pásmo alloca.
  • 0x82: prostřední červené pásmo alloca.
  • 0x83: pravé červené pásmo alloca.
  • 0x84: pravá červená zóna globální proměnné.
  • 0x85: obecná červená zóna.
  • 0x86: pravá červená zóna paměti poolu.
  • 0x87: uvolněná paměť paměťového fondu.
  • 0x8A: levá červená zóna souvislé paměti.
  • 0x8B: pravé červené pásmo souvislé paměti.
  • 0x8C: uvolněná paměť lookasidelist.
  • 0x8D: levé červené pásmo paměti fondu.
  • 0xF1: levé červené pásmo proměnné zásobníku.
  • 0xF2: střední část červené zóny proměnné zásobníku.
  • 0xF3: pravé červené pásmo proměnné zásobníku.
  • 0xF5: proměnná zásobníku použitá po návratu.
  • 0xF8: Proměnná zásobníku mimo rozsah.

Vysvětlení kontrol chyb KASAN: příklad

Předpokládejme, že KASAN vydal kontrolu chyb při spuštění ovladače s těmito parametry:

  1. Parametr 1: 0xFFFFFFFFFFFFABCD
  2. Parametr 2: 0x0000000000000004
  3. Parametr 3: 0xFFFFFFFF12345678
  4. Parametr 4: 0x0000000000000184

Parametr 1 vám říká, že se ovladač pokusil o přístup k adrese 0xFFFFFFFFFFFFABCD a že tento přístup byl neplatný. Parametr 2 vám říká, že se jedná o přístup skrze čtyř bajty. Parametr 3 poskytuje adresu instrukčního ukazatele, ve kterém bodě váš ovladač provedl neplatný přístup. Parametr 4 vám říká, že se jedná o přístup k zápisu a že se dotýká paměti v pravém červeném pásmu globální proměnné.

Jinými slovy, váš ovladač se pravděpodobně pokusil provést přetečení zápisového bufferu na globální proměnné. Pomocí těchto informací můžete prozkoumat a určit, kde a jak tuto chybu opravit v ovladači.

Dopad na výkon KASAN

KASAN zvyšuje spotřebu paměti jádra a zavádí přibližné dvounásobné zpomalení ovladačů zkompilovaných s povoleným KASANem.

Porovnání s ověřovatelem ovladačů

KASAN a Driver Verifier jsou zcela samostatné funkce, ale jsou vzájemně kompatibilní.

KASAN se zaměřuje na detekci nelegálních přístupů k paměti a je efektivnější než nástroj Driver Verifier v této doméně, protože používá jemněji odstupňovaný přístup a pokrývá více oblastí paměti. Driver Verifier má pravidla specifická pro ovladače, která mají za cíl najít jiné typy chyb, které KASAN nezjistí. Další informace naleznete v tématu Microsoft: Představujeme sanitizátory jádra na platformách Microsoftu.

Pomocí KASAN ve spojení s nástrojem Driver Verifier maximalizujte detekci chyb v ovladači.

Resources