Уязвимость реализации протокола MS-EVEN в Windows
Уязвимость реализации протокола MS-EVEN в Windows
Категория: Программы Теги: Уязвимости Опубликовано: 1 апреля 2026

Уязвимость BDU:2025-05597 (CVE-2025-29969) Windows MS-EVEN

Уязвимость BDU:2025-05597 (CVE-2025-29969) затрагивает реализацию протокола MS-EVEN (EventLog Remoting Protocol) в операционных системах Windows. Ошибка синхронизации при использовании общего ресурса («ситуация гонки») позволяет злоумышленнику, уже имеющему низкопривилегированный доступ к системе выполнить произвольный код.

Анализ уязвимости

Уровень опасности: 7.5 (HIGH)
Вектор атаки: AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H

  • AV:N (Вектор атаки: сетевой) – уязвимость может быть использована удалённо, без физического доступа к устройству.

  • AC:H (Сложность атаки: высокая) – успешная эксплуатация требует выиграть в «гонке» (race condition), что повышает сложность реализации.

  • PR:L (Необходимые привилегии: низкие) – атакующему достаточно иметь низкопривилегированные учётные данные (например, обычного доменного пользователя).

  • UI:N (Взаимодействие с пользователем: не требуется) – атака не требует действий со стороны легитимного пользователя.

  • S:U (Влияние на другие компоненты: не оказывает) – компрометация системы не выходит за её пределы.

  • C:H/I:H/A:H (Конфиденциальность/Целостность/Доступность: полное нарушение) – успешная эксплуатация даёт злоумышленнику полный контроль над целевой системой.

Условия эксплуатации

Для успешной атаки злоумышленник должен:

  • находиться во внутренней сети (или иметь возможность взаимодействия с целевым хостом по протоколам SMB/RPC);

  • обладать низкопривилегированными учётными данными (логин/пароль) на целевой системе (например, обычный доменный пользователь);

  • иметь возможность поднять SMB-сервер для доставки полезной нагрузки (эксплойт использует SMB-шару, контролируемую атакующим);

  • преодолеть «гонку» между проверкой прав доступа и фактической записью файла (условие, усложняющее атаку).

Технический анализ уязвимости

Уязвимость кроется в реализации протокола MS-EVEN, используемого службой журналов событий Windows для удалённого управления логами. Функция резервного копирования (hElfrBackupELFW) не обеспечивает атомарность проверки прав доступа и последующей записи файла. Это приводит к состоянию гонки: злоумышленник может заменить содержимое файла, который будет скопирован, в промежутке между открытием источника и выполнением копирования.

В эксплойте используется следующая последовательность:

  1. Через RPC-вызов hElfrOpenBELW открывается файл-источник (EVTX-лог), расположенный на SMB-шаре атакующего.

  2. Атакующий получает дескриптор и тут же (до фактического копирования) перезаписывает этот файл своими данными.

  3. Вызов hElfrBackupELFW инициирует копирование, но из-за гонки на диск целевой системы попадает уже подменённое содержимое (произвольный файл), а не оригинальный EVTX.

  4. Запись может быть выполнена в любое место, доступное для записи процессом службы (как правило, SYSTEM), что позволяет злоумышленнику разместить, например, исполняемый скрипт в папке автозагрузки.

Дополнительно, функция hElfrOpenBELW возвращает различные коды ошибок в зависимости от существования файла и его типа, что даёт возможность низкопривилегированному пользователю проводить разведку файловой системы удалённой машины.

Анализ кода эксплойта

Рассмотрим код эксплойта для понимания вектора атаки с использованием уязвимости BDU:2025-05597 (CVE-2025-29969). Эксплойт предоставлен в виде двух скриптов на Python, использующих библиотеку Impacket для взаимодействия с RPC.

1. Установка соединения и аутентификация

Класс Attacker инициализирует транспорт ncacn_np:{ip}[\pipe\eventlog] – это именованный канал (named pipe) службы EventLog. Через DCERPCTransportFactory устанавливается соединение, а затем производится аутентификация с помощью переданных учётных данных.

self.connection = DCERPCTransportFactory(self.EVENT_LOG_NCACN.format(ip=ip))
self.connection.set_credentials(username, password)
self.connection.connect()
self.dce = self.connection.get_dce_rpc()
self.dce.set_auth_level(self.RPC_C_AUTHN_LEVEL_PKT_INTEGRITY)
self.dce.connect()
self.dce.bind(even.MSRPC_UUID_EVEN)

Особенность реализации – установка уровня аутентификации RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, что обеспечивает проверку целостности пакетов, но не шифрование. Это стандартный подход для клиентских подключений к службе EventLog.

2. Работа с UNICODE-строками

В протоколе MS-EVEN пути к файлам передаются как структуры RPC_UNICODE_STRING. В коде присутствует модификация этой структуры:

def create_rpc_unicode_string(self, regular_string):
    crafted_unicode_string = RPC_UNICODE_STRING()
    crafted_unicode_string['Data'] = regular_string
    crafted_unicode_string.fields['MaximumLength'] += 1
    return crafted_unicode_string

Добавление единицы к MaximumLength необходимо из-за особенности реализации службы. Без этого некоторые вызовы могут завершаться ошибкой.

3. Механизм записи произвольного файла

Главная функция upload_file реализует следующий алгоритм:

  • Создаётся временная копия легитимного EVTX-файла.

  • Путь к этому файлу преобразуется в UNC-путь SMB-шары (например, \\smb_server_ip\Share\Temp_Sample.evtx).

  • Открывается дескриптор этого файла через hElfrOpenBELW.

  • Ключевой момент: после открытия, но до вызова hElfrBackupELFW, временный файл перезаписывается данными из local_file_path (полезная нагрузка).

  • Вызывается hElfrBackupELFW с дескриптором открытого файла и целевым путём на удалённой системе.

with open(temp_valid_evtx_file, "rb+") as valid_evtx_file:
    handle = even.hElfrOpenBELW(self.dce, unicode_valid_evtx_share_path)
    valid_evtx_file.seek(0)
    valid_evtx_file.write(local_file_path_data + b"\x00")
    valid_evtx_file.flush()
    even.hElfrBackupELFW(self.dce, handle["LogHandle"], unicode_remote_path)

Использование seek(0) и перезапись данных гарантирует, что к моменту вызова BackupELFW файл уже содержит произвольное содержимое. В результате служба EventLog копирует на удалённую машину не EVTX, а подготовленный злоумышленником файл.

4. Разведка файловой системы

Скрипт check_if_exists.py использует ту же технику открытия файла, но анализирует возвращаемые ошибки. Возможные коды:

  • 0xc0000034 – файл не существует.

  • 0xc00000ba – путь указывает на существующую директорию.

  • 0xc000018e – файл существует (и не является директорией).

Это позволяет низкопривилегированному пользователю проверять наличие файлов в местах, где обычно доступ на чтение ограничен, но RPC-служба EventLog всё равно возвращает информацию о существовании. Например, так можно определить, установлено ли определённое программное обеспечение (C:\Program Files\Wireshark), что даёт ценную информацию для дальнейшей атаки.

Методы защиты

1. Установка обновлений безопасности

Microsoft выпустила исправления для всех уязвимых версий Windows. Обновления распространяются через Центр обновлений Windows и представлены в виде отдельных KB для каждой платформы. Приоритет – немедленное применение патчей.

2. Сетевая сегментация и межсетевое экранирование

Поскольку атака требует доступа к портам RPC (135, 139, 445, 49152-65535) и SMB, следует:

  • Ограничить доступ к этим портам только для доверенных хостов (например, серверов управления).

  • В правилах брандмауэра разрешить подключения к службе EventLog только с конкретных IP-адресов администраторов.

  • Размещать критически важные системы в отдельных сегментах сети с изоляцией от рядовых пользовательских рабочих станций.

3. Обнаружение и предотвращение атак (IPS/EDR)

Использование системы предотвращения вторжений (IPS) на сетевом уровне или EDR на хосте позволяет детектировать характерные для данной атаки действия.

Где размещать IPS?

Для защиты внутренней инфраструктуры IPS целесообразно размещать:

  • На сетевом периметре (между сегментами) – для обнаружения попыток эксплуатации между разными подсетями.

  • На хосте (Host IPS / EDR) – для анализа RPC-вызовов и файловых операций непосредственно на целевой системе.

В случае с данной уязвимостью наиболее эффективен хост-уровень, так как сетевой трафик MS-EVEN может быть зашифрован или смешан с легитимными операциями.

Правила для Suricata (пример)

Ниже представлен пример правила для Suricata, которое срабатывает на попытку резервного копирования EventLog с использованием SMB-шары в качестве источника. Правило анализирует RPC-вызовы и проверяет, что целевой путь выходит за пределы стандартных каталогов логов. Важно: имена файлов могут быть изменены, поэтому сигнатура ориентируется на комбинацию операций и аномальные пути.

alert tcp $HOME_NET any -> $EXTERNAL_NET 445 (msg:"MS-EVEN BackupELFW with external SMB source"; flow:to_server,established; dcerpc.interface:0x82273fdc-e32a-18c3-3f78-827929dc23ea; dcerpc.opnum:5; content:"\\|5c|"; depth:2; pcre:"/\\\\([^\\]+)\\\\Share\\\\.*\.evtx/"; sid:202529969); rev:1;)

Описание: правило срабатывает при вызове RPC-операции с номером 5 (hElfrBackupELFW) через интерфейс EventLog, если в аргументе (пути к источнику) встречается UNC-путь к внешнему SMB-ресурсу. Такая комбинация не характерна для легитимной работы службы и с высокой вероятностью указывает на атаку.

Более точное обнаружение возможно с помощью EDR-решений, которые отслеживают:

  • запуск процесса svchost.exe -k EventLog с нестандартными аргументами;

  • создание файлов в необычных местах (например, в автозагрузке) процессами, имеющими права SYSTEM;

  • обращение к SMB-шарам из контекста службы EventLog.

4. Принцип наименьших привилегий

  • Отключите службу удалённого управления журналами событий (Windows Remote Management – WinRM, связанный с EventLog) на тех системах, где это не требуется.

  • Используйте групповые политики для ограничения доступа к службе EventLog: разрешайте удалённые подключения только учётным записям из групп администраторов.

  • Если возможно, настройте аудит доступа к SMB-портам и журналируйте попытки подключения к именованному каналу \pipe\eventlog.

5. Мониторинг SMB-соединений

Так как атака требует SMB-сервера злоумышленника, полезно отслеживать исходящие SMB-соединения (порт 445) от серверов и рабочих станций к незнакомым или внешним хостам. Настроить алерты на такие подключения, особенно если они инициированы процессом svchost.exe с параметрами EventLog.

Алексей Черемных Алексей Черемных
60