
PoC pre-autenticazione per CVE-2026-41089, overflow dello stack Netlogon CLDAP via UDP/389, che provoca il crash di LSASS/riavvio del DC. Include script di exploit, analisi della causa principale, rilevamento e linee guida per la mitigazione.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Esecuzione di codice remoto in Windows Netlogon tramite stack buffer overflow in CLDAP
Un singolo pacchetto UDP sulla porta 389 fa oltrepassare un buffer di stack da 528 byte all'interno di LSASS su qualsiasi Domain Controller Windows non aggiornato. LSASS va in crash. Il DC si riavvia in circa 60 secondi. Nessuna credenziale richiesta.
| Vettore d'attacco | UDP 389 (CLDAP), pre-auth, zero credenziali |
| Impatto | Crash di LSASS, riavvio del DC, potenziale RCE |
| CWE | CWE-121 (Stack-based Buffer Overflow) |
| Vettore CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Pubblicazione | 12 maggio 2026 da Microsoft |
python3 poc.py 10.0.50.21 corp.local
Il PoC invia un ping normale, poi un ping con overflow con username di 130 caratteri, quindi verifica se il DC è sopravvissuto. Circa 10 secondi in totale.
Versioni di Windows Server che fungono da Domain Controller:
| Versione Server | Corretta In |
|---|---|
| 2012 / 2012 R2 | Solo patch 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 alloca un buffer di stack da 528 byte e lo passa
a BuildSamLogonResponse. Questa funzione chiama
NetpLogonPutUnicodeString per scrivere nome del server, nome di dominio, GUID
e lo username controllato dall'attaccante all'interno del buffer.
Il bug: NetpLogonPutUnicodeString riceve una lunghezza massima in byte ma
la legge come conteggio di WCHAR. Ogni stringa scritta attraverso questo percorso occupa
il doppio dello spazio previsto. Il campo "User" nel filtro CLDAP (fino
a 130 wchar, 260 byte sul wire) spinge la scrittura combinata oltre
il limite di 528 byte.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // buffer di stack da 528 byte
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // confusione byte/WCHAR sulla dimensione
python3 poc.py <target_ip> <domain_name> [options]
| Flag | Descrizione | Default |
|---|---|---|
-l | Lunghezza username in caratteri | 130 |
-t | Timeout ricezione UDP (secondi) | 5 |
-d | Ritardo tra overflow e controllo di attività (secondi) | 3 |
# Test di connettività (username corto, nessun overflow)
python3 poc.py 10.0.50.21 corp.local
# Tentativo di overflow predefinito
python3 poc.py 10.0.50.21 corp.local -l 130
# Payload più grande, timeout più lungo per reti lente
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Python 3.8+. Nessun pacchetto di terze parti.
L'overflow causa un DoS (crash di LSASS, riavvio del DC). La corruzione dello stack potrebbe consentire RCE, ma questo PoC si ferma al DoS.
Rete. Cercare richieste di ricerca CLDAP con attributo del filtro "User" più lungo di 20-30 caratteri. I normali ping di DC locator usano nomi di account di servizio brevi.
Host. Monitorare i crash di LSASS legati a netlogon.dll (Event ID 1000). Attivare la registrazione di debug di Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 dimezza la lunghezza massima dello username)Legale. Questo codice esiste per ricerca sulla sicurezza autorizzata e formazione. Testare solo contro sistemi di tua proprietà o per i quali hai autorizzazione scritta. L'accesso non autorizzato a sistemi informatici viola il CFAA e leggi equivalenti nella maggior parte delle giurisdizioni.