
PoC pré-auth pour CVE-2026-41089 : débordement de pile Netlogon CLDAP via UDP/389, provoquant un plantage de LSASS/redémarrage du contrôleur de domaine. Comprend un script d'exploitation, une analyse des causes racines, la détection et des recommandations d'atténuation.
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Exécution de code à distance dans Windows Netlogon via un débordement de tampon de pile CLDAP
Un seul paquet UDP envoyé sur le port 389 provoque un débordement d'un tampon de pile de 528 octets dans LSASS sur tout contrôleur de domaine Windows non corrigé. LSASS plante. Le contrôleur de domaine redémarre en environ 60 secondes. Aucun identifiant requis.
| Vecteur d'attaque | UDP 389 (CLDAP), pré-authentification, zéro identifiant |
| Impact | Crash de LSASS, redémarrage du contrôleur de domaine, RCE potentielle |
| CWE | CWE-121 (débordement de tampon basé sur la pile) |
| Vecteur CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publié | 12 mai 2026 par Microsoft |
python3 poc.py 10.0.50.21 corp.local
Le PoC envoie un ping normal, puis un ping de débordement avec un nom d'utilisateur de 130 caractères, puis vérifie si le contrôleur de domaine a survécu. Environ 10 secondes au total.
Versions de Windows Server agissant en tant que contrôleurs de domaine :
| Version du serveur | Corrigé dans |
|---|---|
| 2012 / 2012 R2 | Correctifs réservés à 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 alloue un tampon de pile de 528 octets et le transmet à BuildSamLogonResponse. Cette fonction appelle NetpLogonPutUnicodeString pour écrire le nom du serveur, le nom de domaine, les GUID et le nom d'utilisateur contrôlé par l'attaquant dans le tampon.
Le bug : NetpLogonPutUnicodeString reçoit une longueur maximale en octets mais la lit comme un nombre de WCHAR. Chaque chaîne écrite via ce chemin occupe deux fois l'espace attendu. Le champ « User » du filtre CLDAP (jusqu'à 130 wchars, 260 octets sur le fil) pousse l'écriture combinée au-delà de la limite de 528 octets.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| Option | Description | Défaut |
|---|---|---|
-l | Longueur du nom d'utilisateur en caractères | 130 |
-t | Délai d'expiration de la réception UDP (secondes) | 5 |
-d | Délai entre le débordement et la vérification de disponibilité (secondes) | 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+. Aucun paquet tiers.
Le débordement provoque un déni de service (crash de LSASS, redémarrage du contrôleur de domaine). La corruption de la pile pourrait permettre une RCE, mais ce PoC reste au niveau du déni de service.
Réseau. Recherchez les requêtes de recherche CLDAP avec un attribut de filtre « User » plus long que 20 à 30 caractères. Les pings normaux de localisation de contrôleur de domaine utilisent des noms de comptes de service courts.
Hôte. Surveillez les crashs de LSASS liés à netlogon.dll (ID d'événement 1000). Activez la journalisation de débogage Netlogon :
nltest /dbflag:0x2080ffff
mov edx, 0x40 réduit de moitié la longueur maximale du nom d'utilisateur)Légal. Ce code existe à des fins de recherche en sécurité autorisée et d'éducation. Testez uniquement contre des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite. L'accès non autorisé à des systèmes informatiques viole le CFAA et les lois équivalentes dans la plupart des juridictions.