Санитизатор адресов ядра (KASAN)
Санитизатор адресов ядра (KASAN) — это технология обнаружения ошибок, поддерживаемая в драйверах ядра Windows, которая позволяет обнаруживать несколько классов незаконного доступа к памяти, таких как переполнение буфера и события после использования. Для этого необходимо включить KASAN в системе и перекомпилировать драйвер ядра с определенным флагом компилятора MSVC.
Предварительные требования
Чтобы использовать KASAN, вам потребуется:
- Версия ос целевой системы, в которой будет загружен драйвер ядра:
- Клиент: Windows 11 24H2 или более поздней версии.
- Сервер: Windows Server 2025 или более поздней версии.
- VisualStudio: версия 17.11 или более поздней.
- WDK: версия 10.0.26100.2161 или более поздней.
KASAN поддерживается только в x64.
Включение KASAN в драйвере ядра
Введите следующую командную строку в окне командной строки администратора в целевой системе:
reg add "HKLM\System\CurrentControlSet\Control\Session Manager\Kernel" /v KasanEnabled /t REG_DWORD /d 1
Перезагрузите целевую систему, чтобы изменения вступили в силу.
Перекомпилируйте драйвер ядра с включенным инструментированием KASAN, передав новый флаг компилятору MSVC. Для этого можно использовать один из следующих методов:
- GUI: в VisualStudio перейдите к Обозреватель решений, щелкните правой кнопкой мыши проект драйвера ядра и выберите "Свойства". На странице свойств перейдите в раздел "Свойства>>конфигурации" C/C++>>General и установите для параметра "Включить санитизатор адресов ядра" значение "Да". Затем перестройте решение.
- Командная строка: добавьте параметр /fsanitize=kernel-address в командную строку компилятора. Затем перестройте решение.
Загрузите перекомпилируемый драйвер ядра в целевой системе и проверьте его, как правило. 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. Доступ к адресу осуществляется незаконно.
- Параметр 2. Размер доступа к памяти.
- Параметр 3. Адрес вызывающего объекта, выполняющего незаконный доступ к памяти.
- Параметр 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.
0xFFFFFFFFFFFFABCD
- Параметр 2.
0x0000000000000004
- Параметр 3.
0xFFFFFFFF12345678
- Параметр 4.
0x0000000000000184
Параметр 1 сообщает, что драйвер пытался получить доступ к адресу 0xFFFFFFFFFFFFABCD
и что этот доступ был незаконным. Параметр 2 указывает, что это был четырехбайтовый доступ. Параметр 3 предоставляет адрес указателя инструкции, на который драйвер выполнил незаконный доступ. Параметр 4 сообщает, что это был доступ на запись, и что память, касаемаяся, была правой красной поясом глобальной переменной.
Другими словами, драйвер, скорее всего, пытался выполнить переполнение буфера записи в глобальной переменной. Используйте эти сведения для изучения и определения того, где и как устранить эту ошибку в драйвере.
Влияние на производительность KASAN
KASAN увеличивает потребление памяти ядра и приводит к примерному двухкратному замедлению в драйверах, скомпилированных с включенным KASAN.
Сравнение с проверятелем драйверов
KASAN и Driver Verifier являются полностью отдельными функциями, но совместимы друг с другом.
KASAN сосредоточен на обнаружении незаконного доступа к памяти и более эффективно, чем средство проверки драйверов в этом домене, так как он использует более точный подход и охватывает больше областей памяти. Средство проверки драйверов имеет правила, относящиеся к драйверу, которые стремятся найти другие типы ошибок, что KASAN не обнаруживает. Дополнительные сведения см. в статье Майкрософт. Знакомство с средствами очистки ядра на платформах Майкрософт.
Используйте KASAN в сочетании с средство проверки драйверов, чтобы максимально увеличить обнаружение ошибок в драйвере.