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