Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sanitizer adresów jądra (KASAN) to technologia wykrywania błędów obsługiwana w sterownikach jądra systemu Windows, która umożliwia wykrywanie kilku klas nielegalnego dostępu do pamięci, takich jak przepełnienie buforu i zdarzenia użycia po wolnym użyciu. Wymaga to włączenia usługi KASAN w systemie i ponownego skompilowania sterownika jądra za pomocą określonej flagi kompilatora MSVC.
Pre-requisites
Aby można było korzystać z usługi KASAN, potrzebne są następujące elementy:
- Wersja systemu operacyjnego systemu docelowego, na którym zostanie załadowany sterownik jądra:
- Klient: Windows 11 24H2 lub nowszy.
- Serwer: Windows Server 2025 lub nowszy.
- VisualStudio: wersja 17.11 lub nowsza.
- WDK: wersja 10.0.26100.2161 lub nowsza.
Usługa KASAN jest obsługiwana tylko w przypadku platformy x64.
Jak włączyć usługę KASAN w sterowniku jądra
Wprowadź następujący wiersz polecenia w oknie wiersza polecenia administratora w systemie docelowym:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1Ustawienie tego klucza rejestru powoduje, że jądro systemu Windows przygotuje się do i zaakceptuje ładowanie instrumentowanych sterowników KASAN. Nieustawienie tego klucza rejestru powoduje, że jądro systemu Windows odmawia ładowania sterowników z instrumentacją KASAN.
Uruchom ponownie system docelowy, aby zmiany zaczęły obowiązywać.
Ponownie skompiluj sterownik jądra z włączoną instrumentacją KASAN, przekazując nową flagę do kompilatora MSVC. Użyj jednej z następujących metod:
- Graficzny interfejs użytkownika: w programie VisualStudio przejdź do Eksploratora rozwiązań, kliknij prawym przyciskiem myszy projekt sterownika jądra i wybierz polecenie Właściwości. Na stronie właściwości przejdź do Właściwości konfiguracji>>C/C++>>General i ustaw opcję Włącz oczyszczanie adresów jądra na Tak. Następnie ponownie skompiluj rozwiązanie.
- Wiersz polecenia: dodaj /fsanitize=kernel-address parametr do wiersza polecenia kompilatora. Następnie ponownie skompiluj rozwiązanie.
Załaduj ponownie skompilowany sterownik jądra w systemie docelowym i przetestuj go tak, jak zwykle. Usługa KASAN działa w czasie wykonywania i zgłasza zdarzenia nielegalnego dostępu do pamięci za pomocą Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS.
Regresja w programie VisualStudio 17.12
Jeśli używasz programu VisualStudio 17.12, może wystąpić następujący błąd kompilacji:
error LNK2019: unresolved external symbol __asan_wrap_wcscat referenced in function
Ten błąd można obejść, dodając następującą flagę do wiersza polecenia linkera:
/alternatename:__asan_wrap_wcscat=wcscat
Ta regresja została naprawiona w programie VisualStudio 17.14.15.
Regresja w programie VisualStudio 17.14 do 17.14.14
Jeśli używasz programu VisualStudio 17.14, może wystąpić następujący błąd kompilacji:
error LNK2001: unresolved external symbol __LINK_WITH_asan_compat.lib_TO_USE_NEW_COMPILER_WITH_OLDER_ASAN_RUNTIME
Ten błąd można obejść, dodając następującą flagę do wiersza polecenia kompilatora:
/fno-sanitize-address-asan-compat-lib
Dodaj następujące flagi do linii poleceń konsolidatora:
/alternatename:__asan_wrap_wcscat=wcscat
/alternatename:__asan_wrap_wcscpy=wcscpy
/alternatename:__asan_wrap_wcsncpy=wcsncpy
Ta regresja została naprawiona w programie VisualStudio 17.14.15.
Jak sprawdzić, czy usługa KASAN jest włączona w sterowniku jądra
Sterowniki jądra skompilowane za pomocą KASAN mają sekcję PE o nazwie "KASAN". Sprawdź, czy usługa KASAN jest włączona w sterowniku, uruchamiając następujące polecenie w wierszu polecenia dewelopera:
dumpbin /ALL YourDriver.sys
Jeśli dane wyjściowe zawierają sekcję o nazwie "KASAN", usługa KASAN jest włączona w sterowniku.
Jak analizować raporty KASAN
Gdy mechanizm KASAN wykryje nielegalny dostęp do pamięci w sterowniku, wydaje komunikat o błędzie 0x1F2: KASAN_ILLEGAL_ACCESS. Sprawdź wygenerowany zrzut pamięci jądra, aby określić, gdzie dokładnie sterownik wykonał nielegalny dostęp do pamięci.
Użyj KASAN z debugerem jądra dołączonym do systemu docelowego, aby pamięć mogła być sprawdzana dynamicznie natychmiast po wystąpieniu sprawdzania błędów, zamiast post-mortem przy użyciu zrzutu pamięci.
Parametry sprawdzania błędów
Parametry Bug Check 0x1F2: KASAN_ILLEGAL_ACCESS są:
- Parametr 1. Adres, do których uzyskuje się dostęp nielegalnie.
- Parametr 2: rozmiar dostępu do pamięci.
- Parametr 3. Adres obiektu wywołującego wykonującego nielegalny dostęp do pamięci.
- Parametr 4. Dodatkowe informacje dotyczące dostępu do pamięci:
- Bity [0:7]: kod cieniowy KASAN. Zapoznaj się z poniższą tabelą.
- Bit 8:
1jeśli dostęp był zapisem,0jeśli był odczytem.
Kody cieni KASAN
W KASAN uważamy, że cała pamięć jądra jest podzielona w ciągłych fragmentach ośmiu bajtów wyrównanych, osiem bajtów komórek. W przypadku KASAN każda ośmiobajtowa komórka w pamięci jądra ma skojarzony kod cieniowy, który jest jednobajtową liczbą całkowitą wskazującą ważność komórki. Kodowanie kodów cienia jest następujące:
| Value | Meaning |
|---|---|
0x00 |
Komórka jest całkowicie prawidłowa: dostęp do wszystkich ośmiu bajtów komórki jest legalny. |
0x01 —>0x07 |
Komórka jest częściowo prawidłowa: pierwsze bajty wartości w komórce są prawidłowe, ale pozostałe są nieprawidłowe. |
0x08 —>0x7F |
Komórka jest warunkowo prawidłowa: dostęp do wszystkich ośmiu bajtów komórki może być legalny lub nielegalny w zależności od określonych warunków. |
>= 0x80 |
Komórka jest całkowicie nieważna: dostęp do wszystkich ośmiu bajtów komórki jest niedozwolony. |
Kilka podkodów jest używanych dla warunkowo prawidłowych i całkowicie nieprawidłowych komórek, aby dodatkowo wskazać typ pamięci, z jaką jest skojarzona komórka i dlaczego dostęp do niej może być nielegalny.
Kody podrzędne używane przez warunkowo prawidłowe komórki:
-
0x09: pamięć stronicowa, do której dostęp jest nielegalny na poziomie DISPATCH_LEVEL lub wyższym, ale legalny w innych przypadkach.
Kody podrzędne używane przez całkowicie nieprawidłowe komórki:
-
0x81: lewa czerwona strefa obszaru alokacji. -
0x82: środkowa czerwona strefa alloca. -
0x83: czerwona strefa po prawej alloca. -
0x84: czerwone pole ostrzegawcze zmiennej globalnej. -
0x85: ogólna strefa zagrożenia. -
0x86: prawa strefa ochronna pamięci puli. -
0x87: zwolniona pamięć puli. -
0x8A: lewa czerwona strefa ciągłej pamięci. -
0x8B: prawa czerwona strefa ciągłej pamięci. -
0x8C: zwolniona pamięć lookasidelist. -
0x8D: lewa strefa krytyczna pamięci puli. -
0xF1: lewa czerwona strefa zmiennej stosu. -
0xF2: czerwona strefa środkowa zmiennej stosu. -
0xF3: prawa czerwona strefa zmiennej stosu. -
0xF5: używana zmienna stosu after-ret. -
0xF8: zmienna stosu poza zakresem.
Omówienie kontroli usterek KASAN: przykład
Załóżmy, że narzędzie KASAN zainicjowało test błędu podczas działania sterownika z następującymi parametrami:
- Parametr 1:
0xFFFFFFFFFFFFABCD - Parametr 2:
0x0000000000000004 - Parametr 3:
0xFFFFFFFF12345678 - Parametr 4:
0x0000000000000184
Parametr 1 informuje, że sterownik próbował uzyskać dostęp do adresu 0xFFFFFFFFFFFFABCD i że ten dostęp był nielegalny.
Parametr 2 informuje o tym, że był to dostęp cztero bajtowy.
Parametr 3 zawiera adres wskaźnika instrukcji, na którym sterownik wykonał nielegalny dostęp.
Parametr 4 informuje o tym, że był to dostęp do zapisu i że dotykana pamięć znajdowała się w prawej czerwonej strefie zmiennej globalnej.
Innymi słowy, sterownik prawdopodobnie próbował przepełnić bufor zapisu w zmiennej globalnej. Skorzystaj z tych informacji, aby zbadać i określić, gdzie i gdzie naprawić tę usterkę w sterowniku.
Wpływ KASAN na wydajność
KASAN zwiększa zużycie pamięci jądra i wprowadza przybliżone dwukrotne spowolnienie w sterownikach skompilowanych z włączonym KASAN.
Porównanie z weryfikatorem sterowników
KasAN i Weryfikator sterowników są całkowicie oddzielnymi funkcjami, ale są wzajemnie zgodne.
KasAN koncentruje się na wykrywaniu nielegalnego dostępu do pamięci i jest bardziej wydajny niż weryfikator sterowników w tej domenie, ponieważ używa bardziej szczegółowego podejścia i obejmuje więcej regionów pamięci. Weryfikator sterowników ma reguły specyficzne dla sterownika, które mają na celu znalezienie innych typów usterek, które KASAN nie wykrywa. Aby uzyskać więcej informacji, zobacz Microsoft: Introducing kernel sanitizers on Microsoft platforms (Microsoft: wprowadzenie do urządzeń czyszczących jądra na platformach firmy Microsoft).
Użyj usługi KASAN w połączeniu z weryfikatorem sterowników, aby zmaksymalizować wykrywanie usterek w sterowniku.