Udostępnij przez


Sanitizer adresów jądra (KASAN)

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

  1. 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 1
    

    Ustawienie 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.

  2. Uruchom ponownie system docelowy, aby zmiany zaczęły obowiązywać.

  3. 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.
  4. 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ą:

  1. Parametr 1. Adres, do których uzyskuje się dostęp nielegalnie.
  2. Parametr 2: rozmiar dostępu do pamięci.
  3. Parametr 3. Adres obiektu wywołującego wykonującego nielegalny dostęp do pamięci.
  4. 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: 1 jeśli dostęp był zapisem, 0 jeś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:

  1. Parametr 1: 0xFFFFFFFFFFFFABCD
  2. Parametr 2: 0x0000000000000004
  3. Parametr 3: 0xFFFFFFFF12345678
  4. 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.

Resources