Поделиться через


Санитизатор адресов ядра (KASAN)

Санитизатор адресов ядра (KASAN) — это технология обнаружения ошибок, поддерживаемая в драйверах ядра Windows, которая позволяет обнаруживать несколько классов незаконного доступа к памяти, таких как переполнение буфера и события после использования. Для этого необходимо включить KASAN в системе и перекомпилировать драйвер ядра с определенным флагом компилятора MSVC.

Предварительные требования

Чтобы использовать KASAN, вам потребуется:

  • Версия ос целевой системы, в которой будет загружен драйвер ядра:
    • Клиент: Windows 11 24H2 или более поздней версии.
    • Сервер: Windows Server 2025 или более поздней версии.
  • VisualStudio: версия 17.11 или более поздней.
  • WDK: версия 10.0.26100.2161 или более поздней.

KASAN поддерживается только в x64.

Включение KASAN в драйвере ядра

  1. Введите следующую командную строку в окне командной строки администратора в целевой системе:

    reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
    
  2. Перезагрузите целевую систему, чтобы изменения вступили в силу.

  3. Перекомпилируйте драйвер ядра с включенным инструментированием KASAN, передав новый флаг компилятору MSVC. Для этого можно использовать один из следующих методов:

    • GUI: в VisualStudio перейдите к Обозреватель решений, щелкните правой кнопкой мыши проект драйвера ядра и выберите "Свойства". На странице свойств перейдите в раздел "Свойства>>конфигурации" C/C++>>General и установите для параметра "Включить санитизатор адресов ядра" значение "Да". Затем перестройте решение.
    • Командная строка: добавьте параметр /fsanitize=kernel-address в командную строку компилятора. Затем перестройте решение.
  4. Загрузите перекомпилируемый драйвер ядра в целевой системе и проверьте его, как правило. KASAN работает во время выполнения и сообщает о событиях незаконного доступа к памяти с помощью проверки ошибок 0x1F2: KASAN_ILLEGAL_ACCESS.

Как проверить, включен ли KASAN в драйвере ядра

Драйверы ядра, скомпилированные с помощью KASAN, имеют раздел PE с именем "KASAN". Убедитесь, что KASAN включен в драйвере, выполнив следующую команду в командной строке разработчика:

dumpbin /ALL YourDriver.sys

Если выходные данные содержат раздел "KASAN", в драйвере включен KASAN.

Как анализировать отчеты KASAN

Когда KASAN обнаруживает незаконный доступ к памяти в драйвере, он выдает 0x1F2 проверки ошибок: KASAN_ILLEGAL_ACCESS. Проверьте созданный дамп памяти ядра, чтобы определить, где именно ваш драйвер выполнил незаконный доступ к памяти.

Используйте KASAN с отладчиком ядра, подключенным к целевой системе, чтобы память можно было динамически проверять сразу после выдачи проверки ошибок, а не после отправки дампа памяти.

Параметры проверки ошибок

Параметры проверки ошибок 0x1F2: KASAN_ILLEGAL_ACCESS :

  1. Параметр 1. Доступ к адресу осуществляется незаконно.
  2. Параметр 2. Размер доступа к памяти.
  3. Параметр 3. Адрес вызывающего объекта, выполняющего незаконный доступ к памяти.
  4. Параметр 4. Дополнительные сведения о доступе к памяти:
    • Биты [0:7]: теневой код KASAN. См. таблицу ниже.
    • Бит 8: 1 если доступ был записью, 0 если он был чтением.

Теневые коды KASAN

В KASAN мы считаем, что все памяти ядра разделены на смежные блоки из восьмибайтовых ячеек, выровненных из восьмибайтовых, восьмибайтовых ячеек. При использовании KASAN каждая восьмибайтовая ячейка в памяти ядра имеет теневой код , связанный с ним, который представляет собой однобайтовое целое число, указывающее допустимость ячейки. Кодирование теневых кодов выполняется следующим образом:

Значение Значение
0x00 Ячейка является полностью допустимой: доступ ко всем восьми байтам ячейки является законным.
0x01 ->0x07 Ячейка является частично допустимой: первые байты значений в ячейке допустимы, но остальные недопустимы.
>= 0x80 Ячейка полностью недопустима: доступ ко всем восьми байтам ячейки является незаконным.

Несколько вложенных кодов используются для полностью недопустимых ячеек, чтобы дополнительно указать тип памяти, с которой связана ячейка, и почему она является недопустимой:

  • 0x81: левая красная зона alloca.
  • 0x82: средняя красная зона alloca.
  • 0x83: правая красная зона alloca.
  • 0x84: правая красная зона глобальной переменной.
  • 0x85: универсальная красная зона.
  • 0x86: правая красная зона памяти пула.
  • 0x87: освобожденная память.
  • 0x8A: левая красная зона непрерывной памяти.
  • 0x8B: правая красная зона непрерывной памяти.
  • 0x8C: освобожденная память lookasidelist.
  • 0x8D: левая красная зона памяти пула.
  • 0xF1: левая красная зона переменной стека.
  • 0xF2: средняя красная зона переменной стека.
  • 0xF3: правая красная зона переменной стека.
  • 0xF5: используемая переменная стека после повторных попыток.
  • 0xF8: переменная стека вне области.

Общие сведения об ошибках KASAN: пример

Предположим, что KASAN выдал ошибку при выполнении драйвера с этими параметрами:

  1. Параметр 1. 0xFFFFFFFFFFFFABCD
  2. Параметр 2. 0x0000000000000004
  3. Параметр 3. 0xFFFFFFFF12345678
  4. Параметр 4. 0x0000000000000184

Параметр 1 сообщает, что драйвер пытался получить доступ к адресу 0xFFFFFFFFFFFFABCD и что этот доступ был незаконным. Параметр 2 указывает, что это был четырехбайтовый доступ. Параметр 3 предоставляет адрес указателя инструкции, на который драйвер выполнил незаконный доступ. Параметр 4 сообщает, что это был доступ на запись, и что память, касаемаяся, была правой красной поясом глобальной переменной.

Другими словами, драйвер, скорее всего, пытался выполнить переполнение буфера записи в глобальной переменной. Используйте эти сведения для изучения и определения того, где и как устранить эту ошибку в драйвере.

Влияние на производительность KASAN

KASAN увеличивает потребление памяти ядра и приводит к примерному двухкратному замедлению в драйверах, скомпилированных с включенным KASAN.

Сравнение с проверятелем драйверов

KASAN и Driver Verifier являются полностью отдельными функциями, но совместимы друг с другом.

KASAN сосредоточен на обнаружении незаконного доступа к памяти и более эффективно, чем средство проверки драйверов в этом домене, так как он использует более точный подход и охватывает больше областей памяти. Средство проверки драйверов имеет правила, относящиеся к драйверу, которые стремятся найти другие типы ошибок, что KASAN не обнаруживает. Дополнительные сведения см. в статье Майкрософт. Знакомство с средствами очистки ядра на платформах Майкрософт.

Используйте KASAN в сочетании с средство проверки драйверов, чтобы максимально увеличить обнаружение ошибок в драйвере.

Ресурсы