
CVE-2026-41089 PoC — Débordement de tampon de la pile Netlogon CLDAP (CVSS 9.8 CRITIQUE)
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
Exécution de code à distance dans Windows Netlogon via un dépassement de tampon de pile CLDAP
Un seul paquet UDP forgé vers le port 389 provoque un dépassement d'un tampon de pile de 528 octets dans LSASS sur tout contrôleur de domaine Windows non corrigé. Le processus plante. Le DC redémarre en environ 60 secondes. Aucune authentification n'est requise.
| Vecteur d'attaque | UDP 389 (CLDAP), pré-authentification, zéro identifiants |
| Impact | plantage LSASS, redémarrage DC, potentielle exécution de code à distance |
| CWE | CWE-121 (dépassement de tampon de 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
Trois phases : ping normal pour confirmer que le DC est actif, ping de débordement avec un nom d'utilisateur de 130 caractères, vérification de disponibilité. Prend environ 10 secondes.
Chaque version de Windows Server fonctionnant en tant que contrôleur de domaine :
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 bogue : NetpLogonPutUnicodeString reçoit une longueur maximale en octets mais la traite comme un nombre de WCHAR. Chaque chaîne écrite via ce chemin occupe le double de l'espace prévu. Le champ 'User' dans le 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 |
# Test de connectivité (nom d'utilisateur court, pas de débordement)
python3 poc.py 10.0.50.21 corp.local
# Tentative de débordement par défaut
python3 poc.py 10.0.50.21 corp.local -l 130
# Charge plus grande, timeout plus long pour les réseaux lents
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
Nécessite Python 3.8+. Aucun paquet tiers.
Le débordement déclenche un déni de service (plantage LSASS, redémarrage du DC). L'exécution de code à distance par corruption de pile est théoriquement possible. Ce PoC ne tente pas d'exécution de code.
Réseau. Analysez le trafic CLDAP pour des requêtes de recherche où l'attribut de filtre 'User' dépasse 20-30 caractères. Les pings normaux de localisation de DC utilisent des noms de comptes de service (chaînes courtes).
Hôte. Surveillez les plantages LSASS liés à netlogon.dll (ID d'événement 1000). Activez la journalisation de débogage Netlogon :
nltest /dbflag:0x2080ffff
mov edx, 0x40 pour diviser par deux la longueur maximale du nom d'utilisateur)Légal. Ce code existe pour la recherche en sécurité et l'éducation autorisées. Testez uniquement sur 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.
| Version du serveur | Corrigé dans |
|---|
| 2012 / 2012 R2 | Correctifs ESU uniquement |
| 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 |
| 130 |
-t | Timeout UDP de réception (secondes) | 5 |
-d | Délai entre le débordement et la vérification de disponibilité (secondes) | 3 |