Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
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 1Nastavení 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.
Restartujte cílový systém, aby se změna projevila.
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í.
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:
- Parametr 1: Adresa, ke které se přistupuje neoprávněně.
- Parametr 2: Velikost přístupu k paměti.
- Parametr 3: Adresa volajícího provádějícího neplatný přístup k paměti
- 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:
1Pokud byl přístup zápisem,0pokud 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:
- Parametr 1:
0xFFFFFFFFFFFFABCD - Parametr 2:
0x0000000000000004 - Parametr 3:
0xFFFFFFFF12345678 - 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.