Windows Defender (Microsoft Defender Antivirus) остаётся базовым слоем защиты на большинстве корпоративных рабочих станций. Атакующие активно развивают техники обхода его детекта, но каждая такая техника оставляет наблюдаемые артефакты. Эта статья разбирает основные категории обхода с позиции защитника: какие сигналы генерируются, где их искать и как усилить детект.
Стандартный путь вызова ядра на Windows проходит через
Техника прямых системных вызовов (direct syscalls) обходит этот слой: вредоносный код самостоятельно формирует инструкцию
Код извлекает
Прямой системный вызов сам по себе не является аномалией — легитимное ПО тоже может его использовать. Однако комбинация признаков создаёт детектируемый паттерн:
Классическая инъекция через
Преимущество для атакующего: нет вызовов
Вместо прямого вызова
Типичная реализация использует Jenkins One-at-a-Time hash с начальным значением (seed). В рассмотренном примере seed равен 8, а макрос
Прямое отключение — грубая, но всё ещё встречающаяся техника:
Windows Defender генерирует события при изменении собственной конфигурации:
Критически важно: если Defender отключён и не сгенерировал событие — это само по себе индикатор компрометации. Настройка аудита должна включать мониторинг состояния службы
Ни один отдельный сигнал не даёт полной картины. Эффективная защита строится на корреляции:
ETW-провайдеры ядра (
Sysmon с правильно настроенной конфигурацией фиксирует:
Отдельные события могут быть легитимными. Детект строится на цепочках:
Такая последовательность в рамках одного процесса-источника с высокой вероятностью означает инъекцию.
Защита от обхода Defender — это не одна настройка, а процесс построения многослойной телеметрии, где каждый слой компенсирует слепые зоны предыдущего.
Прямые системные вызовы: почему они обходят userland-хуки
Стандартный путь вызова ядра на Windows проходит через
ntdll.dll, где каждая функция-заглушка выполняет последовательность mov r10, rcx → mov eax, <syscall_number> → syscall. EDR-продукты часто ставят inline-хуки на эти заглушки, перехватывая вызовы до их ухода в ядро.Техника прямых системных вызовов (direct syscalls) обходит этот слой: вредоносный код самостоятельно формирует инструкцию
syscall с нужным номером, минуя ntdll.dll полностью. Вариант Hell's Gate динамически извлекает номера системных вызовов из экспортируемых функций ntdll.dll на этапе выполнения, парся байтовый паттерн заглушки:
Код:
; Типичная заглушка в ntdll.dll (x64):
; 4C 8B D1 mov r10, rcx
; B8 XX XX 00 00 mov eax, <syscall_number>
; ...
; 0F 05 syscall
Код извлекает
XX XX — номер системного вызова — и сохраняет его в таблицу (VX_TABLE), после чего выполняет syscall напрямую из собственного ассемблерного модуля.Что видит защитник
Прямой системный вызов сам по себе не является аномалией — легитимное ПО тоже может его использовать. Однако комбинация признаков создаёт детектируемый паттерн:
- Процесс выполняет
syscallиз региона памяти, не принадлежащегоntdll.dll. ETW-провайдерMicrosoft-Windows-Kernel-Audit-API-Callsи ядро фиксируют адрес возврата вызова.
- Последовательность вызовов нетипична для процесса. Например,
notepad.exeвызываетNtCreateSection+NtMapViewOfSection+NtCreateThreadEx— это аномальная цепочка.
- Отсутствие стека вызовов через
ntdll.dll. При анализе стека потока в момент системного вызова фрейм возврата указывает не на заглушкуntdll, а на произвольный адрес.
Инъекция через section mapping без VirtualAllocEx
Классическая инъекция через
VirtualAllocEx + WriteProcessMemory + CreateRemoteThread хорошо детектируется. Альтернатива — использование объектов раздела (section):NtCreateSectionсоздаёт раздел с правамиPAGE_EXECUTE_READWRITE.
NtMapViewOfSectionпроецирует его в локальный процесс (для записи payload).
- Тот же раздел проецируется в целевой процесс с правами на исполнение.
NtCreateThreadExзапускает поток по адресу спроецированного кода.
Преимущество для атакующего: нет вызовов
VirtualAllocEx и WriteProcessMemory, которые традиционно мониторятся. Память появляется в целевом процессе как результат проекции раздела — механизма, который активно используется легитимным ПО (DLL-загрузчик, shared memory).Сигналы для детекта
| Наблюдение | Источник телеметрии | Почему аномально |
|---|---|---|
Раздел создан с PAGE_EXECUTE_READWRITE | ETW Microsoft-Windows-Kernel-Memory | Легитимные разделы редко требуют одновременной записи и исполнения |
| Раздел спроецирован в чужой процесс | Sysmon Event ID 10 (ProcessAccess) с SECTION_MAP_WRITE + SECTION_MAP_EXECUTE | Нетипичная комбинация прав для межпроцессного взаимодействия |
| Поток создан в удалённом процессе с адресом из спроецированного раздела | Sysmon Event ID 8 (CreateRemoteThread) | Прямой индикатор инъекции |
| Раздел не имеет backing file | Ядро, NtQuerySection | Legitimate shared memory обычно привязан к файлу или именован |
Хеширование имён API: зачем и как детектировать
Вместо прямого вызова
GetProcAddress по строковому имени функции, вредоносный код хеширует имена на этапе компиляции и сравнивает хеши при обходе таблицы экспорта. Это позволяет избежать строковых сигнатур в бинарнике.Типичная реализация использует Jenkins One-at-a-Time hash с начальным значением (seed). В рассмотренном примере seed равен 8, а макрос
HASHA(API) вычисляет хеш на этапе компиляции.Что это даёт защитнику
- Статический анализ: обход таблицы экспорта (чтение
AddressOfNames,AddressOfFunctions,AddressOfNameOrdinals) с последующим сравнением хешей — характерный паттерн. Дизассемблирование выявляет циклы с арифметическими операциямиadd,xor,shr,shl, типичными для хеш-функций.
- Поведенческий анализ: процесс читает PE-заголовок и экспортную таблицу
ntdll.dllвручную, без использованияGetProcAddressилиLdrGetProcedureAddress. Это фиксируется через мониторинг доступа к памяти другого модуля.
- YARA-правила: можно написать правила на характерные константы (seed, начальные значения хешей) и последовательности инструкций, если известен конкретный инструмент.
Отключение и ослепление Defender
Прямое отключение — грубая, но всё ещё встречающаяся техника:
- Через WMI:
Set-MpPreference -DisableRealtimeMonitoring $true(требует прав администратора).
- Через реестр: запись в
HKLM\SOFTWARE\Policies\Microsoft\Windows Defender.
- Через службу: остановка
WinDefendчерезsc stopили манипуляцию сService Control Manager.
- Через WMI-класс
MSFT_MpPreference: вызов методов WMI-провайдера Defender.
Телеметрия отключения
Windows Defender генерирует события при изменении собственной конфигурации:
- Event ID 5007 (Microsoft-Windows-Windows Defender/Operational): изменение конфигурации.
- Event ID 5001: отключение сканирования в реальном времени.
- Event ID 1011: удаление исключения (если атакующий сначала добавляет исключение, потом удаляет следы).
- Sysmon Event ID 13 (RegistryEvent): запись в ключи политик Defender.
Критически важно: если Defender отключён и не сгенерировал событие — это само по себе индикатор компрометации. Настройка аудита должна включать мониторинг состояния службы
WinDefend через внешний watchdog.Многослойная модель детекта
Ни один отдельный сигнал не даёт полной картины. Эффективная защита строится на корреляции:
Уровень 1: ETW и ядро
ETW-провайдеры ядра (
Microsoft-Windows-Kernel-Process, Microsoft-Windows-Kernel-Memory, Microsoft-Windows-Kernel-Audit-API-Calls) дают низкоуровневую телеметрию, которую сложно подавить из user mode. Однако атакующий может попытаться отключить ETW-сессию через NtTraceControl — это тоже наблюдаемое событие.Уровень 2: Sysmon и EDR
Sysmon с правильно настроенной конфигурацией фиксирует:
- Создание потоков в удалённых процессах (Event ID 8).
- Доступ к процессам с подозрительными правами (Event ID 10).
- Загрузку образов из нестандартных путей (Event ID 7).
- Изменение реестра в ключах безопасности (Event ID 13).
Уровень 3: Поведенческая корреляция
Отдельные события могут быть легитимными. Детект строится на цепочках:
Код:
NtCreateSection(EXECUTE_READWRITE)
→ NtMapViewOfSection(в чужой процесс)
→ NtCreateThreadEx(адрес из раздела)
Такая последовательность в рамках одного процесса-источника с высокой вероятностью означает инъекцию.
Практические шаги укрепления
- Включить Attack Surface Reduction (ASR) правила. Правило «Block process creations originating from PSExec and WMI commands» и «Block executable files from running unless they meet a prevalence, age, or trusted criterion» закрывают часть векторов.
- Настроить Sysmon на минимально необходимый набор Event ID. Event ID 8, 10, 7, 13 — базовый минимум для детекта инъекций и манипуляций с Defender.
- Мониторить состояние службы
WinDefend. Внешний watchdog (через Task Scheduler, SCCM или отдельный агент) должен алертить при остановке или изменении конфигурации службы.
- Использовать Credential Guard и HVCI. Виртуализация безопасности усложняет инъекцию в защищённые процессы и ограничивает доступ к LSASS.
- Коррелировать события из разных источников. Один Sysmon не даст полной картины. Комбинация ETW + Sysmon + Windows Event Log позволяет выявлять цепочки, которые по отдельности выглядят безобидно.
- Проверять целостность конфигурации Defender. Регулярный аудит
Get-MpPreferenceна соответствие baseline: отсутствие несанкционированных исключений, включённый realtime monitoring, актуальные сигнатуры.
Ограничения защитника
- Прямые системные вызовы невозможно заблокировать на уровне ядра без нарушения совместимости — ядро не различает, кто выполняет
syscall.
- ETW-телеметрию можно подавить из kernel mode (драйвер с правами администратора может остановить сессию).
- Если атакующий получил
SYSTEMи может загружать драйверы, большинство userland-детектов обходятся.
- Defender не является EDR: его поведенческий анализ ограничен по сравнению с полноценными EDR-решениями, которые коррелируют события в облаке.
Защита от обхода Defender — это не одна настройка, а процесс построения многослойной телеметрии, где каждый слой компенсирует слепые зоны предыдущего.
