
Pre-auth PoC для CVE-2026-41089 — переполнение стека Netlogon CLDAP через UDP/389, вызывающее сбой LSASS/перезагрузку DC. Включает скрипт эксплойта, анализ первопричины, обнаружение и рекомендации по смягчению последствий.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Удалённое выполнение кода в Windows Netlogon через переполнение стекового буфера в CLDAP
Один специально сформированный UDP-пакет на порт 389 переполняет 528-байтовый стековый буфер внутри LSASS на любом незапатченном контроллере домена Windows. LSASS падает. Контроллер домена перезагружается примерно через 60 секунд. Учётные данные не требуются.
| Вектор атаки | UDP 389 (CLDAP), до аутентификации, без учётных данных |
| Воздействие | падение LSASS, перезагрузка контроллера домена, возможный RCE |
| CWE | CWE-121 (переполнение буфера на стеке) |
| Вектор CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Опубликовано | 12 мая 2026 г., Microsoft |
python3 poc.py 10.0.50.21 corp.local
PoC отправляет обычный ping, затем ping с переполнением и именем пользователя длиной 130 символов, после чего проверяет, выжил ли контроллер домена. Всего около 10 секунд.
Версии Windows Server, работающие в роли контроллеров домена:
| Версия сервера | Исправление в |
|---|---|
| 2012 / 2012 R2 | только патчи ESU |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
NlGetLocalPingResponse выделяет 528-байтовый буфер в стеке и передаёт его в BuildSamLogonResponse. Эта функция вызывает NetpLogonPutUnicodeString для записи в буфер имени сервера, имени домена, GUID и управляемого атакующим имени пользователя.
Ошибка: NetpLogonPutUnicodeString получает максимальную длину в байтах, но интерпретирует её как количество WCHAR. Каждая строка, записываемая через этот путь, занимает вдвое больше места, чем ожидалось. Поле «User» в CLDAP-фильтре (до 130 WCHAR, 260 байт в сети) выводит суммарную запись за пределы 528-байтовой границы.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| Флаг | Описание | По умолчанию |
|---|---|---|
-l | Длина имени пользователя в символах | 130 |
-t | Таймаут UDP recv (секунды) | 5 |
-d | Задержка между переполнением и проверкой работоспособности (секунды) | 3 |
# Connectivity test (short username, no overflow)
python3 poc.py 10.0.50.21 corp.local
# Default overflow attempt
python3 poc.py 10.0.50.21 corp.local -l 130
# Larger payload, longer timeout for slow networks
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Требуется Python 3.8+. Сторонние пакеты не нужны.
Переполнение вызывает отказ в обслуживании (падение LSASS, перезагрузка контроллера домена). Порча стека может привести к RCE, но этот PoC ограничивается DoS.
Сеть. Ищите CLDAP-запросы поиска с атрибутом фильтра «User» длиннее 20–30 символов. Обычные ping-запросы DC Locator используют короткие имена служебных учётных записей.
Хост. Следите за падениями LSASS, связанными с netlogon.dll (Event ID 1000). Включите отладочное журналирование Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 уменьшает максимальную длину имени пользователя вдвое).Правовая информация. Этот код существует для авторизованных исследований в области безопасности и образования. Тестируйте только системы, которые принадлежат вам или на тестирование которых вы получили письменное разрешение. Несанкционированный доступ к компьютерным системам нарушает CFAA и аналогичные законы в большинстве юрисдикций.