CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность

Драйвер глубже Windows: как забытая утилита резервного копирования открывает доступ на уровне UEFI

Разбираем техническую механику уязвимости в драйвере старой программы для бэкапа — от разведки до закрепления кода ниже операционной системы, и что с этим делать бизнесу.

Разбор CIOlogia
Драйвер глубже Windows: как забытая утилита резервного копирования открывает доступ на уровне UEFI

В коротком посте я рассказал о находке на сервере оптовой компании: старая, давно забытая программа для резервного копирования и клонирования дисков продолжала жить в системе через свой драйвер — с правами уровня ядра. Здесь разберу техническую сторону подробнее: как именно такие драйверы эксплуатируются, почему антивирус здесь бессилен и что конкретно нужно сделать, чтобы закрыть этот класс уязвимостей, а не одну конкретную программу.

Суть проблемы: driver, а не приложение

Программы для клонирования и бэкапа дисков работают с носителем на низком уровне — им нужен прямой доступ к секторам диска, к физической памяти, иногда к прошивке. Для этого производитель ставит в систему kernel-mode драйвер: он подписан (WHQL/EV-подпись), поэтому Windows Driver Signature Enforcement и Secure Boot ему доверяют по умолчанию. Проблема в том, что такой драйвер часто открывает интерфейс IOCTL, доступный любому процессу в системе, без проверки, кто и с какими правами к нему обращается.

Это классический сценарий BYOVD — Bring Your Own Vulnerable Driver. Атакующему не нужно писать свой драйвер и подписывать его — он использует уже установленный и легитимно подписанный, но уязвимый драйвер третьей стороны как отмычку в ядро.

Как это эксплуатируется

Ниже — типичная последовательность действий для такого класса уязвимостей, без привязки к конкретной жертве.

1. Разведка окружения

Первым делом атакующий (либо пентестер) собирает список загруженных драйверов и служб — вручную или через легитимные утилиты, что не вызывает подозрений у EDR:

driverquery /v /fo table

Имя модуля  Отображаемое имя         Тип драйвера  Путь к драйверу
----------  -----------------------  ------------  ----------------------------------------
aomdrv      AOMEI Image Deploy Drv   Ядро          C:\Windows\System32\drivers\aomdrv.sys

Дальше — проверка через Sysinternals Autoruns или sigcheck, чтобы убедиться, что драйвер подписан и стартует автоматически при загрузке (Boot/System start), а не по требованию:

sigcheck64.exe -a C:\Windows\System32\drivers\aomdrv.sys

Verified:       Signed
Signing date:   ...
Publisher:      AOMEI Tech Co., Ltd.
Start Type:     BOOT_START

Hash драйвера сверяется с публичной базой известных уязвимых драйверов (проект loldrivers.io) — если он там уже есть, эксплойт скорее всего публичный и стабильный.

2. Поиск и подтверждение уязвимого IOCTL-интерфейса

Драйвер общается с userspace через DeviceIoControl. Исследователь фаззит доступные IOCTL-коды и смотрит, какие из них дают чтение/запись физической памяти без проверки привилегий вызывающего процесса — типовой паттерн через MmMapIoSpace или прямой доступ к \\Device\\PhysicalMemory:

PS C:\> .\ioctlfuzz.exe --device \\.\aomdrv --range 0x9C402000-0x9C402FFF

[+] IOCTL 0x9C402010 accepted, no ACL check
[+] Response indicates raw physical memory write primitive

Если DACL устройства разрешает доступ группе Everyone (а не только SYSTEM/Administrators), любой процесс без прав администратора и без запроса UAC получает примитив чтения/записи произвольной физической памяти — а значит, и памяти ядра.

3. Эскалация до кода в ядре и обход Secure Boot

Имея arbitrary read/write в память ядра, атакующий может подделать структуры токенов процесса (token stealing, классика для LPE), либо пойти дальше — записать код в область, из которой он выполнится ещё до старта Windows: в NVRAM UEFI-переменные или в EFI System Partition.

# Монтирование скрытого EFI-раздела
mountvol S: /S
dir S:\EFI\Microsoft\Boot\

bootmgfw.efi
bootx64.efi

Для прямого доступа к SPI-флешу материнской платы и NVRAM в таких сценариях используются инструменты вроде RWEverything или CHIPSEC (фреймворк для аудита прошивки от Intel), которые как раз и опираются на подобные легитимные, но уязвимые драйверы как на транспорт:

chipsec_main.py -m tools.uefi.decode -a spi_efi.bin

[CHIPSEC] Reading SPI flash region... OK
[CHIPSEC] Found UEFI DXE driver volume at offset 0x00A12000

Дальше — модификация загрузочного драйвера/DXE-модуля или подмена bootmgfw.efi на модифицированный. Код исполняется на этапе, когда операционной системы физически ещё нет — ни антивирус, ни EDR, ни Defender не запущены в принципе.

Что и почему сработало бы дальше

  • Персистентность вне диска с ОС. Переустановка Windows не помогает — заражённая область находится в SPI-флеше или в NVRAM материнской платы, а не на системном разделе.
  • Невидимость для средств защиты. Antivirus/EDR стартуют вместе с ОС, то есть заведомо позже точки закрепления кода. Это тот же класс угроз, что и известные UEFI-буткиты (BlackLotus, MosaicRegressor, LogoFAIL) — все они держались именно на предзагрузочном уровне.
  • Готовая платформа для шифровальщика или шпиона. Из закреплённого на этом уровне кода можно на каждой загрузке подгружать полезную нагрузку — например, дроппер шифровальщика, который срабатывает уже внутри свежепереустановленной, «чистой» Windows.
  • Масштаб на весь парк техники. Если уязвимая утилита ставилась централизованно (что типично для бэкап- и клонирующего ПО в компаниях), под угрозой не один компьютер, а весь парк — десятки машин одновременно.

Полутехнические пруфы: на что смотреть

  • Путь и тип старта: драйверы такого класса лежат в C:\Windows\System32\drivers\*.sys и часто прописаны как BOOT_START или SYSTEM_START в реестре — HKLM\SYSTEM\