Почему драйверы — критическая точка атаки
Драйвер в Windows выполняется в режиме ядра (Ring 0). Это означает полный доступ к физической памяти, таблицам страниц, структурам ядра и аппаратным прерываниям. Если злоумышленник получает возможность загрузить произвольный драйвер, он фактически контролирует всю систему: может скрывать процессы, файлы, сетевые соединения и перехватывать системные вызовы.
Исторически Windows не требовала подписи для драйверов в 32-битных версиях. С переходом на 64-битную архитектуру Microsoft ввела обязательную проверку подписи — Driver Signature Enforcement (DSE). Однако атакующие нашли обходные пути, и сегодня основная угроза связана не с загрузкой неподписанного кода напрямую, а с эксплуатацией легитимных, но уязвимых драйверов.
Механизм DSE и его ограничения
Driver Signature Enforcement — это политика, при которой ядро Windows отказывается загружать драйвер, если он не подписан доверенным сертификатом. Для получения подписи разработчик должен:
- Зарегистрироваться в программе Windows Hardware Compatibility Program.
- Пройти проверку кода через Microsoft.
- Оплатить сертификат (стоимость начинается от ~150 долларов).
DSE активна по умолчанию на 64-битных системах. Её можно отключить через:
- Загрузку в режиме Test Signing (
bcdedit /set testsigning on).
- Загрузку с отключённой проверкой подписи (через меню дополнительных параметров загрузки).
- Эксплуатацию уязвимостей в уже подписанных драйверах.
Первые два варианта требуют физического доступа или прав администратора и оставляют видимые следы (водяной знак на рабочем столе, записи в журнале загрузки). Третий путь — основной вектор для rootkit-операторов.
Атака BYOVD: Bring Your Own Vulnerable Driver
BYOVD — техника, при которой атакующий загружает легитимный подписанный драйвер, содержащий известную уязвимость. Поскольку драйвер подписан, DSE не блокирует его загрузку. После загрузки уязвимость эксплуатируется для получения произвольного доступа к памяти ядра или MSR-регистрам.
Механика атаки выглядит так:
- Атакующий выбирает драйвер из списка известных уязвимых модулей.
- Драйвер загружается стандартным способом (через
CreateService+StartServiceили через утилиту загрузки драйверов), поскольку подпись валидна.
- Через IOCTL-запросы к уязвимому драйверу атакующий получает примитив произвольного чтения/записи в физическую или виртуальную память ядра.
- С помощью этого примитива загружается целевой rootkit-модуль — либо путём отключения DSE и загрузки неподписанного драйвера, либо путём внедрения кода в уже загруженный модуль ядра.
Типичные уязвимости в драйверах, используемых для BYOVD:
| Тип уязвимости | Что даёт атакующему |
|---|---|
| Произвольная запись в физическую память | Перезапись структур ядра, отключение DSE, внедрение кода |
| Произвольное чтение физической памяти | Извлечение секретов, обход ASLR |
| Доступ к MSR-регистрам | Модификация LSTAR, перехват системных вызовов |
| Доступ к портам ввода-вывода | Прямое взаимодействие с оборудованием в обход защиты |
Известные примеры драйверов, которые использовались в BYOVD-атаках:
RTCore64.sys (MSI Afterburner), DBUtil_2_3.sys (Dell), gdrv.sys (Gigabyte), AsIO64.sys (ASUS). Microsoft ведёт список заблокированных уязвимых драйверов и обновляет его через Windows Update.Что делает rootkit после загрузки в ядро
Получив выполнение в Ring 0, rootkit может реализовать набор функций, которые крайне сложно обнаружить из пользовательского режима:
- Скрытие процессов. Удаление или модификация записей в списке активных процессов (
EPROCESS), перехватNtQuerySystemInformation.
- Скрытие файлов. Перехват IRP-запросов к файловой системе, фильтрация результатов
NtQueryDirectoryFile.
- Скрытие сетевых соединений. Перехват запросов к стеку TCP/IP, удаление записей из таблиц соединений.
- Защита собственных компонентов. Установка kernel callbacks (
ObRegisterCallbacks,PsSetCreateProcessNotifyRoutine) для блокировки попыток завершения процессов или удаления файлов.
- Перехват системных вызовов. Модификация SSDT (System Service Descriptor Table) или MSR
LSTARдля перенаправления вызовов.
- Манипуляция kernel callbacks. Удаление или подмена зарегистрированных callback-функций, которые используют антивирусы и EDR-решения.
- Модификация PP/PPL. Изменение уровня защиты процесса (Protected Process / Protected Process Light), что позволяет rootkit-процессу получить привилегии, недоступные обычным процессам, или снять защиту с системных процессов.
Защитные механизмы Windows
Secure Boot
Secure Boot проверяет цепочку доверия от UEFI-прошивки до загрузчика Windows. Если загрузчик или ядро модифицированы, система откажется загружаться. Secure Boot не защищает от BYOVD напрямую, но предотвращает замену загрузчика и ядра на раннем этапе.
HVCI (Hypervisor-protected Code Integrity)
HVCI использует гипервизор для проверки целостности кода ядра. Даже если атакующий получил выполнение в Ring 0, он не сможет загрузить неподписанный код в ядро без прохождения проверки через гипервизор. HVCI значительно усложняет BYOVD, но не делает его невозможным: если уязвимый драйвер уже подписан и не заблокирован, он может быть загружен.
Kernel Patch Protection (PatchGuard)
PatchGuard защищает критические структуры ядра от модификации: SSDT, IDT, GDT, MSR-регистры, списки callback-функций. Если rootkit пытается модифицировать эти структуры, PatchGuard вызывает BSOD. Это не предотвращает загрузку rootkit, но ограничивает его возможности по перехвату системных вызовов.
Windows Defender Application Control (WDAC)
WDAC позволяет создать политику, разрешающую загрузку только драйверов из доверенного списка. Это наиболее эффективная мера против BYOVD: даже подписанный, но не включённый в политику драйвер не будет загружен.
Блокировка уязвимых драйверов
Microsoft поддерживает список заблокированных драйверов (Microsoft Vulnerable Driver Blocklist). Он обновляется через Windows Update и может быть включён через групповую политику или WDAC. При включении HVCI этот список применяется автоматически.
Диагностика: как обнаружить подозрительный драйвер
Проверка подписи
Код:
Get-WindowsDriver -Online | ForEach-Object {
$sig = Get-AuthenticodeSignature $_.OriginalFileName -ErrorAction SilentlyContinue
if ($sig.Status -ne 'Valid') {
[PSCustomObject]@{
Driver = $_.Driver
File = $_.OriginalFileName
Status = $sig.Status
}
}
}
Эта команда выводит драйверы с невалидной или отсутствующей подписью. На продакшн-системах таких быть не должно.
Анализ загруженных модулей ядра
Код:
driverquery /v /fo csv | ConvertFrom-Csv | Select-Object "Display Name", "Start Mode", "Path" | Format-Table -AutoSize
Обращайте внимание на:
- Драйверы, загруженные из нестандартных путей (не
C:\Windows\System32\drivers\).
- Драйверы без описания или с подозрительным именем.
- Драйверы, загруженные в режиме
SystemилиBoot, которые не относятся к известному оборудованию.
Проверка через Sysinternals
Утилита
Sigcheck из пакета Sysinternals позволяет проверить подпись конкретного файла:
Bash:
sigcheck -i C:\Windows\System32\drivers\suspicious.sys
Флаг
-i выводит подробную информацию о сертификате и цепочке доверия.Мониторинг загрузки драйверов
Для обнаружения попыток загрузки уязвимых драйверов в реальном времени можно использовать:
- Sysmon (Event ID 6 — драйвер загружен). Настройте правило для логирования всех загружаемых драйверов и сверяйте хеши с базой известных уязвимых модулей.
- EDR-решения с функцией мониторинга загрузки драйверов.
Пример правила Sysmon для логирования загрузки драйверов:
XML:
<Sysmon schemaversion="4.90">
<EventFiltering>
<DriverLoad onmatch="include">
<Hashes condition="contains">SHA256=</Hashes>
</DriverLoad>
</EventFiltering>
</Sysmon>
На практике чаще используют режим логирования всех загрузок драйверов с последующей фильтрацией по хешам из Microsoft Vulnerable Driver Blocklist.
Практические меры защиты
| Мера | Эффективность против BYOVD | Сложность внедрения |
|---|---|---|
| Включение HVCI | Высокая | Средняя (требует совместимости оборудования) |
| WDAC с whitelist-политикой | Очень высокая | Высокая (требует аудита всех драйверов) |
| Microsoft Vulnerable Driver Blocklist | Средняя | Низкая |
| Secure Boot | Низкая (защищает только цепочку загрузки) | Низкая |
| Отключение загрузки неподписанных драйверов через GPO | Средняя | Низкая |
Рекомендуемый минимум
- Убедитесь, что Secure Boot активен (
Confirm-SecureBootUEFIв PowerShell).
- Включите HVCI через групповую политику:
Computer Configuration → Administrative Templates → System → Device Guard → Turn On Virtualization Based Security.
- Активируйте Microsoft Vulnerable Driver Blocklist. При включённой HVCI он применяется автоматически.
- Для критичных серверов разверните WDAC-политику, разрешающую только драйверы из утверждённого списка.
- Настройте Sysmon на логирование Event ID 6 и создайте правило алертинга для драйверов с неизвестным хешем.
Ограничения защиты
Ни один механизм не даёт абсолютной гарантии:
- HVCI может быть обойдена через уязвимости в самом гипервизоре или через DMA-атаки (если не включена защита IOMMU).
- WDAC требует постоянного обновления whitelist при добавлении нового оборудования или ПО.
- PatchGuard защищает структуры ядра, но не предотвращает загрузку вредоносного драйвера как такового.
- Атакующий с физическим доступом может обойти Secure Boot через модификацию UEFI-прошивки (при отсутствии аппаратной защиты прошивки).
- Microsoft Vulnerable Driver Blocklist покрывает только известные уязвимые драйверы. Новые уязвимости в подписанных драйверах появляются регулярно, и между публикацией уязвимости и добавлением в блок-лист проходит время.
Защита строится слоями: каждый механизм закрывает определённый вектор, и только их комбинация существенно повышает порог для атакующего.
