
CVE-2026-41089 PoC — переполнение буфера стека Netlogon CLDAP (CVSS 9.8 КРИТИЧЕСКИЙ)
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Удалённое выполнение кода через Netlogon в Windows из-за переполнения стекового буфера CLDAP
Один сформированный UDP-пакет на порт 389 переполняет 528-байтный стековый буфер внутри LSASS на любом незапатченном контроллере домена Windows. Процесс падает. Контроллер домена перезагружается примерно через 60 секунд. Аутентификация не требуется.
| Вектор атаки | UDP 389 (CLDAP), до аутентификации, без учётных данных |
| Воздействие | Сбой LSASS, перезагрузка DC, возможное 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
Три фазы: обычный ping для подтверждения, что DC жив, 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-байтный стековый буфер
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // путаница байт/WCHAR
python3 poc.py <target_ip> <domain_name> [options]
| Флаг | Описание | По умолчанию |
|---|---|---|
-l | Длина имени пользователя в символах | 130 |
-t | Таймаут приёма UDP (сек) | 5 |
-d | Задержка между переполнением и проверкой работоспособности (сек) | 3 |
# Тест соединения (короткое имя, без переполнения)
python3 poc.py 10.0.50.21 corp.local
# Попытка переполнения по умолчанию
python3 poc.py 10.0.50.21 corp.local -l 130
# Более крупная нагрузка, больший таймаут для медленных сетей
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Требуется Python 3.8+. Сторонние пакеты не нужны.
Переполнение вызывает отказ в обслуживании (сбой LSASS, перезагрузка DC). Теоретически возможно RCE через повреждение стека. Данный PoC не пытается выполнить код.
Сеть. Анализируйте трафик CLDAP на предмет поисковых запросов, где атрибут фильтра "User" превышает 20–30 символов. Обычные ping локатора DC используют имена учётных записей служб (короткие строки).
Хост. Отслеживайте сбои LSASS, связанные с netlogon.dll (ID события 1000). Включите отладочное логирование Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 для уменьшения максимальной длины имени пользователя вдвое).Правовая информация. Этот код существует для авторизованных исследований в области безопасности и обучения. Тестируйте только на системах, которые вам принадлежат или на которые у вас есть письменное разрешение. Несанкционированный доступ к компьютерным системам нарушает CFAA и аналогичные законы в большинстве юрисдикций.