
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 es un verificador de precondiciones no autenticado y no destructivo para CVE-2026-41089, un desbordamiento de búfer en la pila sin autenticación en el servicio Netlogon de Windows. Sin credenciales y sin enviar el desbordamiento, informa si el nombre de dominio DNS de un controlador de dominio es lo suficientemente largo para que el bug lo bloquee.

En un controlador de dominio con nombre normal, no. Los PoC públicos de exploit para este CVE
(el más destacado y las copias que lo siguieron) afirman bloquear un controlador de dominio
enviando un nombre de usuario largo. No bloquean un DC sin parche en un dominio
ordinario, por dos razones confirmadas al diff de netlogon.dll anterior y posterior al parche
y al reproducir el bloqueo en un laboratorio:
0x16), lo que enruta a la
BuildSamLogonResponseEx con límites seguros. La vulnerable BuildSamLogonResponse
heredada solo se alcanza con ese bit despejado. LongLogon usa 0x02.User controlado por el atacante
está limitado a 130 caracteres anchos por el binario, muy por debajo del búfer de 528 bytes. Los
bytes que llevan la escritura sobre la cookie de pila son los propios nombres DNS largos del servidor,
que ninguna longitud de payload cambia.Por lo tanto, el exploit popular falla en un dominio ordinario, y un tiempo de espera de recv (que un solo
paquete UDP perdido provoca en un DC sano) se malinterpreta como un bloqueo. LongLogon no es
uno de esos exploits: es el análisis corregido y verificado binariamente, distribuido como un
verificador no destructivo que nunca envía el desbordamiento. El umbral de bloqueo confirmado en laboratorio
y el mecanismo completo se muestran a continuación.
Un desbordamiento de búfer en la pila (CWE-121, CVSS 9.8) en la ruta de localización de DC de Netlogon
NlGetLocalPingResponse → BuildSamLogonResponse → NetpLogonPutUnicodeString.
Al responder a un ping CLDAP o MAILSLOT, el DC serializa sus propios nombres de bosque, dominio y
host más una pequeña cadena controlada por el atacante en un búfer de pila fijo de 528 bytes
(ushort local_258[264]), con la cookie de pila inmediatamente después. Cuando
los propios nombres DNS del servidor son lo suficientemente largos, la escritura acumulativa alcanza el
final del búfer, el terminador L'\0' final sobrepasa la cookie, se dispara __report_gsfailure
y lsass.exe muere con STATUS_STACK_BUFFER_OVERRUN (0xc0000409). El
controlador de dominio se reinicia. Sin autenticación, un paquete UDP.
Donde Zerologon (CVE-2020-1472) abusó de un desafío todo-cero, LongLogon abusa de un nombre de dominio patológicamente largo.
longlogon.py es no destructivo. Envía pings CLDAP benignos con un campo User mínimo,
mide la respuesta del constructor heredado e informa si se cumple la precondición de desbordamiento:
si el dominio de este DC es lo suficientemente largo como para que un DC sin parche se bloquee.
No hace:
Saber cuáles de sus DC están realmente parcheados necesita una verificación de versión con credenciales (admin) en todo el parque. Eso es lo que ADscan automatiza en un compromiso (ver más abajo).
Los únicos bytes controlados por el atacante que llegan al búfer provienen del filtro CLDAP User,
limitado a 130 caracteres anchos, muy por debajo del búfer de 528 bytes por sí solos.
Los bytes que llevan el cursor sobre la cookie son los nombres propios del servidor,
que el atacante no controla. Un DC con nombre predeterminado (corp.local) no se puede bloquear.
Por eso Microsoft lo califica como "Explotación menos probable." En un laboratorio, la longitud mínima
del dominio DNS para bloquear Windows Server 2016 (con un nombre de host de 7 caracteres) fue de
98 caracteres.
Con uv, sin configuración. Las dependencias se declaran en línea
(PEP 723), por lo que esto instala automáticamente rich en un entorno efímero:
uv run longlogon.py <dc-ip> <dc-dns-domain>
O con pip:
pip install rich
python3 longlogon.py <dc-ip> <dc-dns-domain>
El dominio DNS debe coincidir con el que sirve el DC. No es secreto: rootDSE, DNS inverso y el propio CLDAP lo revelan. La salida es un veredicto de precondición más los cálculos de llenado del búfer por campo.
El enrutamiento de NtVer es importante. La vulnerable BuildSamLogonResponse
heredada solo se alcanza cuando (NtVer & 0xc) == 0 y (NtVer & 0x2) != 0. Los intentos de exploit
públicos que envían NtVer=0x16 o 0x06 activan el bit 2 (0x4) y alcanzan la versión con límites seguros
BuildSamLogonResponseEx, por lo que nunca desencadenan el bug. LongLogon usa 0x02.
Controladores de dominio de Windows Server sin parche, desde 2012 R2 hasta 2025. Primeras compilaciones con parche:
Solo para investigación de seguridad autorizada y validación defensiva. Este repositorio distribuye el verificador de precondiciones no destructivo, no un crashador armado, para un CVE explotado activamente y con capacidad de propagación automática. Parchee sus controladores de dominio.
Investigación por Yeray Martín Domínguez · ADscan · CVE-2026-41089 · Netlogon · Active Directory · controlador de dominio · desbordamiento de búfer en la pila · CLDAP · no autenticado · pre-autenticación · prueba de concepto
| Windows Server | Primera compilación con parche |
|---|
| 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 |