
PowerShell-Bewertungsskript, das Windows-Systeme auf CVE-2025-47981 (SPNEGO-NEGOEX-Heap-Überlauf) prüft, indem es die Kernel-Version, den PKU2U-Registrierungsschlüssel und exponierte SPNEGO-Ports verifiziert. Bietet Behebungsmaßnahmen und Erkennungsanleitung.
Typ: Vulnerability Assessment — Erkennung / Compliance-Prüfung CVE: CVE-2025-47981 CVSS: 9.8 Critical (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) CWE: CWE-122 — Heap-based Buffer Overflow Alias: „SPNEGO Nightmare" / „Windows Authentication Wormable RCE" Patch: KB5062560 | July 2025 Patch Tuesday
PowerShell-Assessment-Skript, das prüft, ob ein Windows-System anfällig für CVE-2025-47981 ist — ein Heap-basierter Pufferüberlauf im SPNEGO Extended Negotiation (NEGOEX)-Mechanismus, der RCE ohne Authentifizierung ermöglicht. Führt keinen Exploit aus — bewertet nur die Exposition und den Patch-Status.
Entwickelt von: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 ist ein Heap-basierter Pufferüberlauf im NEGOEX-Protokoll — der internen Erweiterungsschicht des Windows-SPNEGO-Authentifizierungsmechanismus. Die Schwachstelle ermöglicht es nicht authentifizierten Angreifern, beliebigen Remote-Code auszuführen und möglicherweise die vollständige Kontrolle über das System zu erlangen.
Analysten haben die CVE bereits als mit „den unglücklichen Merkmalen, ein bedeutendes Problem zu werden" beschrieben, mit Wurm-Potenzial — fähig, sich automatisch zwischen anfälligen Systemen ohne Benutzerinteraktion zu verbreiten.
Die Schwachstelle betrifft Windows 10 (Version 1607 und höher) und alle Windows Server von 2008 R2 bis Server 2025, einschließlich Server-Core-Varianten — mehr als 33 verschiedene Windows- und Server-Konfigurationen wurden als anfällig auf x64-, x86- und ARM64-Architekturen bestätigt.
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) ist die Authentifizierungs-Handshake-Schicht, die Windows vor jeder authentifizierten Sitzung verwendet. Anwendungen benötigen häufig Authentifizierung, ohne ein Protokoll festzulegen — Windows kann in einer Umgebung Kerberos, in einer anderen NTLM oder einen erweiterten Authentifizierungsmechanismus in einem anderen Vertrauensmodell verwenden. SPNEGO ist der Aushandlungsmechanismus, der entscheidet, welches Authentifizierungsprotokoll verwendet wird.
Cliente Servidor
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← overflow aqui no NEGOEX
NEGOEX ist der Erweiterungsmechanismus innerhalb von SPNEGO — er ermöglicht die Aushandlung von PKU2U-Authentifizierungen (Peer-to-Peer) und anderen benutzerdefinierten Mechanismen. Die Schwachstelle liegt in der Funktion ntoskrnl!SpnegoHandleExtended, die überdimensionierte SPNEGO_TOKEN-Strukturen verarbeitet, die in mehreren Fragmenten gesendet werden, was einen Heap-Überlauf im Kernel verursacht.
Das Risiko ist auf Systemen erhöht, auf denen die Gruppenrichtlinie „Netzwerksicherheit: PKU2U-Authentifizierungsanforderungen an diesen Computer für die Verwendung von Online-Identitäten zulassen" aktiviert ist. Diese Konfiguration, die in vielen Windows-Bereitstellungen standardmäßig aktiviert ist, erweitert die Angriffsfläche von NEGOEX, indem sie Peer-to-Peer-Authentifizierung zulässt, die den anfälligen NEGOEX-Codepfad auf Endpunkten aktiviert, die ihn andernfalls nicht exponieren würden.
$ 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)"
}
Warum ntoskrnl.exe und nicht Get-HotFix?
Get-HotFix listet installierte KBs auf, hat aber bekannte Einschränkungen:
DISM oder Windows Update im stillen Modus angewendet wurdenDie direkte Überprüfung der Version von ntoskrnl.exe ist zuverlässiger — die Datei erhält nur dann die gepatchte Version, wenn das KB tatsächlich angewendet und das System neu gestartet wurde. Ein System mit ausstehendem Reboot nach KB-Installation hat weiterhin die alte Kernel-Version im Speicher.
[version]-Cast: PowerShell vergleicht Zeichenfolgen standardmäßig lexikografisch — "10.0.14393.8246" -lt "10.0.14393.800" wäre $false (falsch). Der Cast auf [version] gewährleistet einen korrekten numerischen Vergleich pro Oktett.
[System.IO.Path]::Combine($env:SystemRoot, ...): verwendet SystemRoot anstelle von hartcodiertem C:\Windows — portabel für Systeme mit Windows auf anderen Laufwerken.
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = build com KB5062560 aplicado
Warum genau dieser Build?
Windows Server 2016 (Basis-Build 14393) ist eine der kritischsten Umgebungen für Patches — weit verbreitet in DCs, Dateiservern und internen Unternehmensdiensten. Version 8246 entspricht dem Kernel-Build nach Anwendung von KB5062560 (Juli 2025).
Für andere Betriebssysteme ist die erforderliche Mindest-Build-Nummer unterschiedlich — das Skript kann um eine Versions-Tabelle pro Betriebssystem erweitert werden.
AllowOnlineID$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"
Was steuert dieser Schlüssel?
Die Schwachstelle betrifft hauptsächlich Systeme, auf denen die Gruppenrichtlinie „PKU2U-Authentifizierungsanforderungen an diesen Computer für die Verwendung von Online-Identitäten zulassen" standardmäßig aktiviert ist, was für Windows 10 Version 1607 und höher der Fall ist.
Der Schlüssel AllowOnlineID ist die Registry-Repräsentation dieser Gruppenrichtlinie. Wenn aktiviert (= 1), akzeptiert das System PKU2U-Authentifizierungen — wodurch der NEGOEX-Codepfad aktiviert wird, der den Überlauf enthält.
| Wert | Status | Risiko |
|---|---|---|
1 | PKU2U aktiviert | HOCH — NEGOEX-Vektor aktiviert |
0 | PKU2U deaktiviert | NIEDRIG — Vektor entschärft (Patch weiterhin erforderlich) |
| Nicht vorhanden | Systemstandard | Hängt von der GPO ab — über gpresult /r prüfen |
-ErrorAction SilentlyContinue: Der Schlüssel ist möglicherweise nicht auf allen Systemen vorhanden — das Skript behandelt das Fehlen ordnungsgemäß, ohne einen Fehler zu erzeugen.
$ports = @(135, 445, 5985, 3389, 80, 443, 25)
Angreifer können die Schwachstelle remote ohne Authentifizierung ausnutzen, indem sie bösartige Pakete an anfällige Dienste wie SMB (Port 445/TCP), RDP (Port 3389/TCP), HTTP/S (Ports 80, 443/TCP) und SMTP (Port 25/TCP) senden, die SPNEGO-Authentifizierung verwenden.
| Port | Protokoll | SPNEGO verwendet für |
|---|---|---|
135 | RPC Endpoint Mapper | Aushandlung der RPC-Authentifizierung |
445 | SMB | Authentifizierung von Dateifreigaben, Named Pipes |
5985 | WinRM (HTTP) | PowerShell-Remoting, Verwaltung |
3389 | RDP | Remote-Desktop-Authentifizierung |
80 | HTTP | IIS Windows-Authentifizierung (Negotiate) |
443 | HTTPS | IIS Windows-Authentifizierung über TLS |
25 | SMTP | Exchange Extended Protection |
Get-NetTCPConnection -LocalPort $port prüft, ob der Port auf dem lokalen System im Status LISTEN ist — jeder offene Port stellt einen unabhängigen Zustellvektor für den Exploit dar.
$ 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