
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.8246