
Script d'évaluation PowerShell qui vérifie les systèmes Windows pour CVE-2025-47981 (débordement de tas SPNEGO NEGOEX) en vérifiant la version du noyau, la clé de registre PKU2U et les ports SPNEGO exposés. Fournit des étapes de remédiation et des conseils de détection.
Type : Évaluation de vulnérabilité — Détection / Vérification de conformité CVE : CVE-2025-47981 CVSS : 9.8 Critique (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) CWE : CWE-122 — Dépassement de tampon basé sur le tas Alias : « SPNEGO Nightmare » / « Windows Authentication Wormable RCE » Correctif : KB5062560 | Patch Tuesday de juillet 2025
Script PowerShell d'évaluation qui vérifie si un système Windows est vulnérable au CVE-2025-47981 — dépassement de tampon basé sur le tas dans le mécanisme SPNEGO Extended Negotiation (NEGOEX) permettant une exécution de code à distance sans authentification. N'exécute pas d'exploit — évalue uniquement l'exposition et l'état du correctif.
Développé par : HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 est un dépassement de tampon basé sur le tas dans le protocole NEGOEX — la couche d'extension interne du mécanisme d'authentification SPNEGO de Windows. La vulnérabilité permet à des attaquants non authentifiés d'exécuter du code arbitraire à distance, obtenant potentiellement un contrôle total du système.
Les analystes ont déjà décrit ce CVE comme ayant « les caractéristiques malheureuses de devenir un problème significatif », avec un potentiel wormable — capable de se propager automatiquement entre les systèmes vulnérables sans interaction de l'utilisateur.
La vulnérabilité affecte Windows 10 (version 1607 et ultérieures) et tous les Windows Server de 2008 R2 jusqu'à Server 2025, y compris les variantes Server Core — plus de 33 configurations distinctes de Windows et Server confirmées vulnérables sur les architectures x64, x86 et ARM64.
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) est la couche de négociation d'authentification que Windows utilise avant chaque session authentifiée. Les applications ont souvent besoin d'authentification sans fixer un protocole — Windows peut utiliser Kerberos dans un environnement, NTLM dans un autre, ou un mécanisme d'authentification étendu dans un modèle de confiance différent. SPNEGO est le mécanisme de négociation qui décide quel protocole d'authentification utiliser.
Cliente Servidor
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← overflow aqui no NEGOEX
NEGOEX est le mécanisme d'extension au sein de SPNEGO — il permet de négocier les authentifications PKU2U (pair-à-pair) et d'autres mécanismes personnalisés. La vulnérabilité se trouve dans la fonction ntoskrnl!SpnegoHandleExtended, qui traite des structures SPNEGO_TOKEN surdimensionnées envoyées en plusieurs fragments, provoquant un dépassement de tampon dans le tas du noyau.
Le risque est élevé sur les systèmes où la stratégie de groupe « Network security: Allow PKU2U authentication requests to this computer to use online identities » est activée. Cette configuration, activée par défaut dans de nombreux déploiements Windows, amplifie la surface d'attaque de NEGOEX en permettant l'authentification pair-à-pair qui active le chemin de code vulnérable de NEGOEX sur des points de terminaison qui ne l'exposeraient pas autrement.
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-47981 ASSESSMENT SCRIPT — FLOW │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 1: Windows Version │ │
│ │ Get-CimInstance Win32_OperatingSystem → .Version │ │
│ │ Contexto: identifica o build exato para correlação com patch │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 2: ntoskrnl.exe Version │ │
│ │ Get-Item C:\Windows\System32\ntoskrnl.exe │ │
│ │ Compare: installed < 10.0.14393.8246 → VULNERÁVEL │ │
│ │ Compare: installed ≥ 10.0.14393.8246 → KB5062560 aplicado │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 3: PKU2U Registry Key │ │
│ │ HKLM:\SYSTEM\...\Lsa\pku2u\AllowOnlineID │ │
│ │ 1 → PKU2U habilitado → superfície de ataque ampliada │ │
│ │ 0 → PKU2U desabilitado → vetor PKU2U mitigado │ │
│ │ Não existe → configuração padrão (avaliar via GPO) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 4: Portas SPNEGO Expostas │ │
│ │ Get-NetTCPConnection → 135, 445, 5985, 3389, 80, 443, 25 │ │
│ │ Cada porta aberta = um vetor de entrega do exploit │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ Format-Table -AutoSize │
│ (output legível para relatório de pentest) │
└─────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdntoskrnl.exe$kernelPath = [System.IO.Path]::Combine($env:SystemRoot, "System32\ntoskrnl.exe")
$requiredVersion = "10.0.14393.8246"
$installedVersion = (Get-Item $kernelPath).VersionInfo.FileVersion
if ([version]$installedVersion -lt [version]$requiredVersion) {
"Vulnerável - Patch ausente ($missingKB)"
}
Pourquoi ntoskrnl.exe et non Get-HotFix ?
Get-HotFix liste les KB installés, mais présente des limitations connues :
DISM ou Windows Update en mode silencieuxVérifier la version de ntoskrnl.exe directement est plus fiable — le fichier ne reçoit la version corrigée que lorsque le KB a été effectivement appliqué et le système redémarré. Un système avec un KB en attente de redémarrage aura toujours l'ancienne version du noyau en mémoire.
Cast [version] : PowerShell compare les chaînes lexicographiquement par défaut — "10.0.14393.8246" -lt "10.0.14393.800" serait $false (incorrect). Le cast vers [version] garantit une comparaison numérique correcte par octet.
[System.IO.Path]::Combine($env:SystemRoot, ...) : utilise SystemRoot au lieu de C:\Windows codé en dur — portable pour les systèmes avec Windows installé sur des lecteurs différents.
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = build com KB5062560 aplicado
Pourquoi cette build spécifique ?
Windows Server 2016 (build de base 14393) est l'un des environnements les plus critiques pour les correctifs — largement utilisé sur les contrôleurs de domaine, les serveurs de fichiers et les services internes d'entreprise. La version 8246 correspond à la build du noyau après l'application du KB5062560 (juillet 2025).
Pour les autres systèmes d'exploitation, le numéro de build minimal requis est différent — le script peut être étendu avec un tableau de versions par OS.
AllowOnlineID$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"
Que contrôle cette clé ?
La vulnérabilité affecte principalement les systèmes où la stratégie de groupe « Allow PKU2U authentication requests to this computer to use online identities » est activée par défaut, ce qui est le cas pour Windows 10 version 1607 et ultérieures.
La clé AllowOnlineID est la représentation dans le registre de cette stratégie de groupe. Lorsqu'elle est activée (= 1), le système accepte les authentifications PKU2U — activant le chemin de code de NEGOEX qui contient le dépassement de tampon.
| Valeur | État | Risque |
|---|---|---|
1 | PKU2U activé | ÉLEVÉ — vecteur NEGOEX activé |
0 | PKU2U désactivé | FAIBLE — vecteur atténué (correctif toujours nécessaire) |
| N'existe pas | Défaut du système | Dépend de la GPO — vérifier via gpresult /r |
-ErrorAction SilentlyContinue : la clé peut ne pas exister sur tous les systèmes — le script gère gracieusement l'absence sans générer d'erreur.
$ports = @(135, 445, 5985, 3389, 80, 443, 25)
Les attaquants peuvent exploiter la faille à distance sans authentification en envoyant des paquets malveillants à des services vulnérables tels que SMB (port 445/TCP), RDP (port 3389/TCP), HTTP/S (ports 80, 443/TCP) et SMTP (port 25/TCP) qui utilisent l'authentification SPNEGO.
| Port | Protocole | SPNEGO utilisé pour |
|---|---|---|
135 | RPC Endpoint Mapper | Négociation d'authentification RPC |
445 | SMB | Authentification des partages de fichiers, named pipes |
5985 | WinRM (HTTP) | PowerShell remoting, gestion |
3389 | RDP | Authentification Remote Desktop |
80 | HTTP | Authentification Windows IIS (Negotiate) |
443 | HTTPS | Authentification Windows IIS via TLS |
25 | SMTP | Exchange Extended Protection |
Get-NetTCPConnection -LocalPort $port vérifie si le port est en LISTEN sur le système local — chaque port ouvert représente un vecteur de livraison indépendant pour l'exploit.
$ cat ./mitre_mapping.yml# Perspectiva do ATACANTE (o que o script detecta/previne)
tactic: Initial Access
- T1190 # Exploit Public-Facing Application
# RCE via SPNEGO heap overflow sem autenticação
# Vetor: qualquer porta com Negotiate auth (445, 5985, 3389...)
tactic: Execution
- T1203 # Exploitation for Client Execution
# Heap overflow em ntoskrnl!SpnegoHandleExtended
# Controle de RIP/EIP via kernel heap corruption
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Wormable: explora outros hosts via SMB/RPC sem credenciais
- T1550.002 # Pass-the-Hash
# Pós-RCE: acesso SYSTEM permite extração de hashes LSASS
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# Buffer overflow em contexto do kernel → ring 0 imediato
# Perspectiva do DEFENSOR (o que o script assessment executa)
tactic: Discovery (Blue Team)
- T1082 # System Information Discovery
# Coleta versão do OS e ntoskrnl.exe para avaliação de patch
- T1012 # Query Registry
# Verifica HKLM:\...\pku2u\AllowOnlineID
- T1049 # System Network Connections Discovery
# Get-NetTCPConnection para mapear portas SPNEGO expostas
$ cat ./detection_opportunities.md# Anomalia de autenticação NEGOEX — pacotes SPNEGO oversized
# Fonte: Windows Security Event Log / ETW
EventID: 4625 (Logon Failure) com SubStatus 0xC000006D
+ Origem: hosts externos
+ Frequência: alta (scan/exploit tentatives)
+ TargetUserName: ANONYMOUS LOGON OU vazio
# Alternativa: Sysmon Event 3 (Network Connection)
EventID: 3
Condição:
DestinationPort: 445 OU 5985 OU 135
Initiated: false (conexão inbound)
Image: System OU lsass.exe
# Crash do kernel pós-exploit malsucedido
# Fonte: Windows Event Log → System
EventID: 1001 (BugCheck)
BugCheckCode: 0x00000050 (PAGE_FAULT_IN_NONPAGED_AREA)
OU
BugCheckCode: 0x0000007E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED)
Context: Crash em ntoskrnl.exe → possível exploit attempt
# Snort/Suricata — SPNEGO token oversized (conceitual)
alert tcp any any -> $HOME_NET [445,5985,3389] (
msg:"CVE-2025-47981 SPNEGO NEGOEX oversized token";
content:"|60|"; # SPNEGO OID marker
content:"|a0|"; # MechTypeList marker
dsize:>4096; # tokens legítimos raramente excedem 4KB
threshold:type both, track by_src, count 3, seconds 10;
sid:2025479810;
)
$ cat ./remediation.mdPRIORIDADE: CRÍTICA — Patch imediato (CVSS 9.8, wormable)
1. PATCH (ação principal):
Windows Update → KB5062560 (Julho 2025 Patch Tuesday)
WSUS: aprovar KB5062560 para todos os sistemas Windows 10 1607+
REINICIAR após o patch — ntoskrnl.exe só é substituído após reboot
2. VERIFICAÇÃO PÓS-PATCH:
Executar este script novamente
Resultado esperado:
ntoskrnl.exe Installed Version: 10.0.14393.8246 (ou maior)
Vulnerability Result: Seguro - Patch aplicado
3. MITIGAÇÃO TEMPORÁRIA (se patch imediato for inviável):
Desabilitar PKU2U via Group Policy:
Computer Configuration → Windows Settings → Security Settings →
Local Policies → Security Options →
"Network security: Allow PKU2U authentication requests..." → DISABLED
OU via registry:
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
-Name AllowOnlineID -Value 0
4. BLOQUEIO DE REDE (defense-in-depth):
Firewall: restringir inbound 135, 445, 5985 a hosts autorizados
Segmentar DCs e servidores críticos em VLANs com ACLs rígidas
5. PRIORIDADE ESPECIAL — Domain Controllers:
DCs expõem todas as portas listadas (RPC, SMB, LDAP)
Wormable + DC comprometido = comprometimento completo do domínio AD
Patch DCs na primeira janela disponível
$ cat ./usage.sh# Executar o script de assessment (não requer privilégios de admin para leitura básica,
# mas alguns checks de registry podem precisar de elevação)
powershell.exe -ExecutionPolicy Bypass -File cve_2025_47981_check.ps1
# Output esperado em sistema VULNERÁVEL:
Name Value
---- -----
ntoskrnl.exe Installed Version 10.0.14393.7906
ntoskrnl.exe Required Version 10.0.14393.8246
PKU2U AllowOnlineID 1
Portas SPNEGO abertas {135, 445, 5985, 3389}
Vulnerability Result Vulnerável - Patch ausente (KB5062560)
Windows Version 10.0.14393.7906
# Output esperado em sistema PATCHADO:
Vulnerability Result Seguro - Patch aplicado
PKU2U AllowOnlineID 0
$ cat ./affected_versions.txtAFETADOS (33+ configurações):
Windows 10: 1607, 1809, 21H2, 22H2
Windows 11: 22H2, 23H2, 24H2
Windows Server: 2008 R2, 2012, 2012 R2, 2016, 2019, 2022, 2025
Arquiteturas: x64, x86, ARM64
Server Core: Sim (todas as versões acima)
FATOR DE RISCO ELEVADO:
PKU2U GPO habilitada (padrão em Win10 1607+)
Portas 135/445/5985 acessíveis de redes externas ou não confiáveis
PATCH:
KB5062560 → July 2025 Patch Tuesday
ntoskrnl.exe mínimo → 10.0.14393.8246 (Windows Server 2016)
Verificar builds específicos por versão em: msrc.microsoft.com
$ cat ./lessons_learned.txt[+] Comparar [version] em vez de string evita falsos negativos em comparações de build
[+] ntoskrnl.exe é fonte primária de verdade para estado de patch — mais confiável que Get-HotFix
[+] PKU2U AllowOnlineID é o amplificador do risco — sistemas sem ele têm superfície reduzida
[+] Get-NetTCPConnection mapeia rapidamente a superfície de ataque exposta localmente
[+] Format-Table -AutoSize gera output pronto para copiar em relatório de pentest
[-] Script verifica apenas Windows Server 2016 (14393) — estender para outros builds é necessário
[-] Não verifica estado da GPO via gpresult — registry pode divergir da política efetiva
[-] Não testa conectividade remota — apenas verifica se as portas estão abertas localmente
[-] Sem output em JSON/CSV — difícil integrar em pipelines de compliance automatizados
[→] Melhorias: tabela de versões por OS, output em JSON, verificação remota via Invoke-Command,
integração com Qualys/Tenable para correlação de vulnerabilidade
CVE Assessment · CVSS 9.8 · Wormable · July 2025 Patch Tuesday · Detection only · No exploit