
CVE-2026-41089 checker: unauthenticated, non-destructive detection for the Netlogon CLDAP stack buffer overflow (CVSS 9.8). Reports whether a domain controller's domain is long enough to crash, without sending the overflow. The binary-verified analysis the public PoCs got wrong.
LongLogon — это неаутентифицированная, неразрушающая проверка предусловия для CVE-2026-41089, столового переполнения буфера до аутентификации в службе Windows Netlogon. Без учетных данных и без отправки переполнения он сообщает, достаточно ли длинно DNS-доменное имя контроллера домена, чтобы ошибка вызвала его сбой.

На нормально названном контроллере домена нет. Публичные эксплойт-PoC для этой CVE
(самый звёздный и его копии) заявляют, что вызывают сбой контроллера домена, отправляя длинное имя пользователя.
Они не вызывают сбой незапатченного контроллера домена в обычном домене по двум причинам,
подтверждённым сравнением пред- и пост-патч-версий netlogon.dll и воспроизведением сбоя в лаборатории:
0x16), что направляет к
безопасному по границам BuildSamLogonResponseEx. Уязвимая устаревшая BuildSamLogonResponse
достигается только при сброшенном этом бите. LongLogon использует 0x02.User
ограничено 130 широкими символами бинарником, что намного меньше 528-байтового буфера. Байты,
которые перемещают курсор на стековую защиту, являются собственными длинными DNS-именами сервера,
которые не изменяются длиной полезной нагрузки.Таким образом, популярный эксплойт не срабатывает в обычном домене, а тайм-аут recv (который один
потерянный UDP-пакет вызывает на здоровом контроллере домена) ошибочно принимается за сбой. LongLogon —
это не один из таких эксплойтов: это исправленный, подтверждённый бинарным анализом инструмент,
поставляемый как неразрушающий проверяющий, который никогда не отправляет переполнение. Лабораторно
подтверждённый порог сбоя и полный механизм приведены ниже.
Стековое переполнение буфера (CWE-121, CVSS 9.8) в пути Netlogon DC-locator
NlGetLocalPingResponse → BuildSamLogonResponse → NetpLogonPutUnicodeString.
Отвечая на CLDAP- или MAILSLOT-пинг, контроллер домена сериализует свои собственные имена леса, домена и хоста,
а также небольшую управляемую атакующим строку в фиксированный 528-байтовый стековый буфер
(ushort local_258[264]), при этом стековая защита находится сразу после него. Когда собственные DNS-имена
сервера достаточно длинны, кумулятивная запись достигает конца буфера, завершающий L'\0' переполняет
защиту, срабатывает __report_gsfailure, и lsass.exe завершается с STATUS_STACK_BUFFER_OVERRUN
(0xc0000409). Контроллер домена перезагружается. Без аутентификации, один UDP-пакет.
Там, где Zerologon (CVE-2020-1472) злоупотреблял нулевым вызовом, LongLogon злоупотребляет патологически длинным именем домена.
longlogon.py является неразрушающим. Он отправляет безвредные CLDAP-пинги с минимальным
полем User, измеряет ответ устаревшего сборщика и сообщает, выполняется ли предусловие переполнения:
достаточно ли длинно доменное имя этого контроллера домена, чтобы незапатченный контроллер домена
вызвал сбой.
Он не:
Знание того, какие из ваших контроллеров домена действительно запатчены, требует аутентифицированной (административной) проверки версии по всему парку. Именно это ADscan автоматизирует в рамках пентеста (см. ниже).
Единственные управляемые атакующим байты, которые достигают буфера, поступают из CLDAP-фильтра User,
ограниченного 130 широкими символами, что намного меньше 528-байтового буфера самих по себе. Байты,
которые перемещают курсор на защиту, являются собственными именами сервера, которыми атакующий не
управляет. Нормально названный контроллер домена (corp.local) не может быть разрушен. Поэтому
Microsoft оценивает это как "Эксплуатация менее вероятна." В лаборатории минимальная длина DNS-домена
для сбоя Windows Server 2016 (с именем хоста из 7 символов) составила 98 символов.
С uv — нулевая настройка. Зависимости объявлены встроенно (PEP 723),
поэтому это автоматически установит rich во временное окружение:
uv run longlogon.py <dc-ip> <dc-dns-domain>
Или с помощью pip:
pip install rich
python3 longlogon.py <dc-ip> <dc-dns-domain>
DNS-домен должен совпадать с тем, который обслуживает контроллер домена. Он не секретен: rootDSE, обратный DNS и сам CLDAP — всё это его раскрывает. Результат — вердикт о предусловии плюс расчёт заполнения буфера по полям.
Маршрутизация NtVer имеет значение. Уязвимая устаревшая BuildSamLogonResponse достигается только
тогда, когда (NtVer & 0xc) == 0 и (NtVer & 0x2) != 0. Публичные попытки эксплойта, отправляющие
NtVer=0x16 или 0x06, устанавливают бит 2 (0x4) и попадают в безопасный по границам
BuildSamLogonResponseEx, поэтому они никогда не вызывают ошибку. LongLogon использует 0x02.
Незапатченные контроллеры домена Windows Server, 2012 R2–2025. Первые исправленные сборки:
Только для авторизованных исследований безопасности и защитной проверки. Этот репозиторий поставляет неразрушающий проверяющий предусловия, а не вооружённый разрушитель, для активно эксплуатируемой, червеподобной CVE. Запатчите свои контроллеры домена.
Исследование: Yeray Martín Domínguez · ADscan · CVE-2026-41089 · Netlogon · Active Directory · контроллер домена · стековое переполнение буфера · CLDAP · неаутентифицированный · до аутентификации · доказательство концепции
| Windows Server | Первая исправленная сборка |
|---|
| 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 |