
Script di valutazione PowerShell che controlla i sistemi Windows per CVE-2025-47981 (heap overflow SPNEGO NEGOEX) verificando la versione del kernel, la chiave di registro PKU2U e le porte SPNEGO esposte. Fornisce passaggi di remediation e indicazioni per il rilevamento.
Tipo: Valutazione della Vulnerabilità — Rilevamento / Verifica di Conformità CVE: CVE-2025-47981 CVSS: 9.8 Critico (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 | Luglio 2025 Patch Tuesday
Script PowerShell di assessment che verifica se un sistema Windows è vulnerabile al CVE-2025-47981 — heap-based buffer overflow nel meccanismo SPNEGO Extended Negotiation (NEGOEX) che consente RCE senza autenticazione. Non esegue exploit — valuta solo l'esposizione e lo stato della patch.
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 è un heap-based buffer overflow nel protocollo NEGOEX — il livello di estensione interno del meccanismo di autenticazione SPNEGO di Windows. La vulnerabilità consente ad attaccanti non autenticati di eseguire codice remoto arbitrario, ottenendo potenzialmente il controllo totale del sistema.
Gli analisti hanno già descritto la CVE come avente "le sfortunate caratteristiche di diventare un problema significativo", con potenziale wormable — capace di propagarsi automaticamente tra sistemi vulnerabili senza interazione dell'utente.
La vulnerabilità colpisce Windows 10 (versione 1607 in poi) e tutti i Windows Server dal 2008 R2 fino al Server 2025, incluse le varianti Server Core — più di 33 configurazioni distinte di Windows e Server confermate vulnerabili su architetture x64, x86 e ARM64.
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) è il livello di handshake di autenticazione che Windows usa prima di ogni sessione autenticata. Le applicazioni spesso necessitano di autenticazione senza fissare un protocollo — Windows può usare Kerberos in un ambiente, NTLM in un altro, o un meccanismo di autenticazione esteso in un modello di trust diverso. SPNEGO è il meccanismo di negoziazione che decide quale protocollo di autenticazione usare.
Cliente Servidor
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← overflow qui nel NEGOEX
NEGOEX è il meccanismo di estensione all'interno di SPNEGO — consente che autenticazioni PKU2U (peer-to-peer) e altri meccanismi personalizzati vengano negoziati. La vulnerabilità risiede nella funzione ntoskrnl!SpnegoHandleExtended, che elabora strutture SPNEGO_TOKEN sovradimensionate inviate in più frammenti, causando overflow nell'heap del kernel.
Il rischio è elevato nei sistemi in cui la Group Policy "Network security: Allow PKU2U authentication requests to this computer to use online identities" è abilitata. Questa configurazione, abilitata per impostazione predefinita in molte distribuzioni di Windows, amplifica la superficie di attacco di NEGOEX consentendo l'autenticazione peer-to-peer che attiva il percorso di codice vulnerabile di NEGOEX su endpoint che altrimenti non lo esporrebbero.
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-47981 ASSESSMENT SCRIPT — FLOW │
│ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 1: Windows Version │ │
│ │ Get-CimInstance Win32_OperatingSystem → .Version │ │
│ │ Contesto: identifica la build esatta per correlazione con patch│ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 2: ntoskrnl.exe Version │ │
│ │ Get-Item C:\Windows\System32\ntoskrnl.exe │ │
│ │ Confronto: installata < 10.0.14393.8246 → VULNERABILE │ │
│ │ Confronto: installata ≥ 10.0.14393.8246 → KB5062560 applicato │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 3: PKU2U Registry Key │ │
│ │ HKLM:\SYSTEM\...\Lsa\pku2u\AllowOnlineID │ │
│ │ 1 → PKU2U abilitato → superficie di attacco ampliata │ │
│ │ 0 → PKU2U disabilitato → vettore PKU2U mitigato │ │
│ │ Non esiste → configurazione predefinita (valutare tramite GPO) │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────────────────────────────────────────────────┐ │
│ │ CHECK 4: Porte SPNEGO Esposte │ │
│ │ Get-NetTCPConnection → 135, 445, 5985, 3389, 80, 443, 25 │ │
│ │ Ogni porta aperta = un vettore di consegna dell'exploit │ │
│ └──────────────────────────────────────────────────────────────────┘ │
│ │ │
│ Format-Table -AutoSize │
│ (output leggibile per report di 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) {
"Vulnerabile - Patch mancante ($missingKB)"
}
Perché ntoskrnl.exe e non Get-HotFix?
Get-HotFix elenca i KB installati, ma ha limitazioni note:
DISM o Windows Update in modalità silenziosaVerificare la versione di ntoskrnl.exe direttamente è più affidabile — il file riceve la versione patchata solo quando il KB è stato effettivamente applicato e il sistema riavviato. Un sistema con KB in attesa di riavvio avrà ancora la vecchia versione del kernel in memoria.
Cast [version]: PowerShell confronta le stringhe lessicograficamente per impostazione predefinita — "10.0.14393.8246" -lt "10.0.14393.800" sarebbe $false (errato). Il cast a [version] garantisce un confronto numerico corretto per ottetto.
[System.IO.Path]::Combine($env:SystemRoot, ...): usa SystemRoot invece di C:\Windows hardcoded — portabile per sistemi con Windows installato su unità diverse.
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = build con KB5062560 applicato
Perché questa build specifica?
Windows Server 2016 (build base 14393) è uno degli ambienti più critici per le patch — ampiamente utilizzato in DC, file server e servizi interni aziendali. La versione 8246 corrisponde alla build del kernel dopo l'applicazione del KB5062560 (Luglio 2025).
Per altri sistemi operativi, il numero di build minimo richiesto è diverso — lo script può essere esteso con una tabella di versioni per OS.
AllowOnlineID$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"
Cosa controlla questa chiave?
La vulnerabilità colpisce principalmente i sistemi in cui la Group Policy "Allow PKU2U authentication requests to this computer to use online identities" è abilitata per impostazione predefinita, che è il caso per Windows 10 versione 1607 in poi.
La chiave AllowOnlineID è la rappresentazione nel registry di questa Group Policy. Quando abilitata (= 1), il sistema accetta autenticazioni PKU2U — attivando il percorso di codice di NEGOEX che contiene l'overflow.
| Valore | Stato | Rischio |
|---|---|---|
1 | PKU2U abilitato | ALTO — vettore NEGOEX attivato |
0 | PKU2U disabilitato | BASSO — vettore mitigato (patch comunque necessaria) |
| Non esiste | Predefinito del sistema | Dipende dalla GPO — verificare tramite gpresult /r |
-ErrorAction SilentlyContinue: la chiave potrebbe non esistere su tutti i sistemi — lo script gestisce con garbo l'assenza senza generare errori.
$ports = @(135, 445, 5985, 3389, 80, 443, 25)
Gli attaccanti possono sfruttare la falla da remoto senza autenticazione inviando pacchetti dannosi a servizi vulnerabili come SMB (porta 445/TCP), RDP (porta 3389/TCP), HTTP/S (porte 80, 443/TCP) e SMTP (porta 25/TCP) che utilizzano l'autenticazione SPNEGO.
| Porta | Protocollo | SPNEGO usato per |
|---|---|---|
135 | RPC Endpoint Mapper | Negoziazione dell'autenticazione RPC |
445 | SMB | Autenticazione di file share, named pipes |
5985 | WinRM (HTTP) | PowerShell remoting, gestione |
3389 | RDP | Autenticazione Remote Desktop |
80 | HTTP | IIS Windows Authentication (Negotiate) |
443 | HTTPS | IIS Windows Authentication tramite TLS |
25 | SMTP | Exchange Extended Protection |
Get-NetTCPConnection -LocalPort $port verifica se la porta è in LISTEN sul sistema locale — ogni porta aperta rappresenta un vettore di consegna indipendente per l'exploit.
$ cat ./mitre_mapping.yml# Prospettiva dell'ATTACCANTE (cosa lo script rileva/previene)
tactic: Initial Access
- T1190 # Exploit Public-Facing Application
# RCE tramite SPNEGO heap overflow senza autenticazione
# Vettore: qualsiasi porta con auth Negotiate (445, 5985, 3389...)
tactic: Execution
- T1203 # Exploitation for Client Execution
# Heap overflow in ntoskrnl!SpnegoHandleExtended
# Controllo di RIP/EIP tramite corruzione dell'heap del kernel
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# Wormable: sfrutta altri host tramite SMB/RPC senza credenziali
- T1550.002 # Pass-the-Hash
# Post-RCE: accesso SYSTEM consente l'estrazione di hash LSASS
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# Buffer overflow in contesto del kernel → ring 0 immediato
# Prospettiva del DIFENSORE (cosa lo script di assessment esegue)
tactic: Discovery (Blue Team)
- T1082 # System Information Discovery
# Raccoglie versione del OS e di ntoskrnl.exe per valutazione patch
- T1012 # Query Registry
# Verifica HKLM:\...\pku2u\AllowOnlineID
- T1049 # System Network Connections Discovery
# Get-NetTCPConnection per mappare le porte SPNEGO esposte
$ cat ./detection_opportunities.md# Anomalia di autenticazione NEGOEX — pacchetti SPNEGO sovradimensionati
# Fonte: Windows Security Event Log / ETW
EventID: 4625 (Logon Failure) con SubStatus 0xC000006D
+ Origine: host esterni
+ Frequenza: alta (tentativi di scan/exploit)
+ TargetUserName: ANONYMOUS LOGON OPPURE vuoto
# Alternativa: Sysmon Event 3 (Network Connection)
EventID: 3
Condizione:
DestinationPort: 445 OPPURE 5985 OPPURE 135
Initiated: false (connessione in entrata)
Image: System OPPURE lsass.exe
# Crash del kernel post-exploit non riuscito
# Fonte: Windows Event Log → System
EventID: 1001 (BugCheck)
BugCheckCode: 0x00000050 (PAGE_FAULT_IN_NONPAGED_AREA)
OPPURE
BugCheckCode: 0x0000007E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED)
Contesto: Crash in ntoskrnl.exe → possibile tentativo di exploit
# Snort/Suricata — token SPNEGO sovradimensionato (concettuale)
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; # i token legittimi raramente superano i 4KB
threshold:type both, track by_src, count 3, seconds 10;
sid:2025479810;
)
$ cat ./remediation.mdPRIORITÀ: CRITICA — Patch immediata (CVSS 9.8, wormable)
1. PATCH (azione principale):
Windows Update → KB5062560 (Luglio 2025 Patch Tuesday)
WSUS: approvare KB5062560 per tutti i sistemi Windows 10 1607+
RIAVVIARE dopo la patch — ntoskrnl.exe viene sostituito solo dopo il riavvio
2. VERIFICA POST-PATCH:
Eseguire nuovamente questo script
Risultato atteso:
ntoskrnl.exe Installed Version: 10.0.14393.8246 (o superiore)
Vulnerability Result: Sicuro - Patch applicata
3. MITIGAZIONE TEMPORANEA (se la patch immediata non è fattibile):
Disabilitare PKU2U tramite Group Policy:
Computer Configuration → Windows Settings → Security Settings →
Local Policies → Security Options →
"Network security: Allow PKU2U authentication requests..." → DISABLED
OPPURE tramite registry:
Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
-Name AllowOnlineID -Value 0
4. BLOCCO DI RETE (defense-in-depth):
Firewall: limitare le connessioni in entrata su 135, 445, 5985 a host autorizzati
Segmentare DC e server critici in VLAN con ACL rigide
5. PRIORITÀ SPECIALE — Domain Controllers:
I DC espongono tutte le porte elencate (RPC, SMB, LDAP)
Wormable + DC compromesso = compromissione completa del dominio AD
Applicare la patch ai DC nella prima finestra disponibile
$ cat ./usage.sh# Eseguire lo script di assessment (non richiede privilegi di admin per la lettura di base,
# ma alcuni controlli del registry potrebbero richiedere elevazione)
powershell.exe -ExecutionPolicy Bypass -File cve_2025_47981_check.ps1
# Output atteso su sistema VULNERABILE:
Name Value
---- -----
ntoskrnl.exe Installed Version 10.0.14393.7906
ntoskrnl.exe Required Version 10.0.14393.8246
PKU2U AllowOnlineID 1
Porte SPNEGO aperte {135, 445, 5985, 3389}
Vulnerability Result Vulnerabile - Patch mancante (KB5062560)
Windows Version 10.0.14393.7906
# Output atteso su sistema PATCHATO:
Vulnerability Result Sicuro - Patch applicata
PKU2U AllowOnlineID 0
$ cat ./affected_versions.txtCOLPITI (33+ configurazioni):
Windows 10: 1607, 1809, 21H2, 22H2
Windows 11: 22H2, 23H2, 24H2
Windows Server: 2008 R2, 2012, 2012 R2, 2016, 2019, 2022, 2025
Architetture: x64, x86, ARM64
Server Core: Sì (tutte le versioni sopra)
FATTORE DI RISCHIO ELEVATO:
GPO PKU2U abilitata (predefinita in Win10 1607+)
Porte 135/445/5985 accessibili da reti esterne o non affidabili
PATCH:
KB5062560 → Luglio 2025 Patch Tuesday
ntoskrnl.exe minimo → 10.0.14393.8246 (Windows Server 2016)
Verificare le build specifiche per versione su: msrc.microsoft.com
$ cat ./lessons_learned.txt[+] Confrontare [version] invece della stringa evita falsi negativi nei confronti delle build
[+] ntoskrnl.exe è la fonte primaria di verità per lo stato della patch — più affidabile di Get-HotFix
[+] PKU2U AllowOnlineID è l'amplificatore del rischio — i sistemi senza di esso hanno una superficie ridotta
[+] Get-NetTCPConnection mappa rapidamente la superficie di attacco esposta localmente
[+] Format-Table -AutoSize genera output pronto per essere copiato in un report di pentest
[-] Lo script verifica solo Windows Server 2016 (14393) — è necessario estenderlo ad altre build
[-] Non verifica lo stato della GPO tramite gpresult — il registry può divergere dalla policy effettiva
[-] Non testa la connettività remota — verifica solo se le porte sono aperte localmente
[-] Nessun output in JSON/CSV — difficile integrare in pipeline di compliance automatizzate
[→] Miglioramenti: tabella delle versioni per OS, output in JSON, verifica remota tramite Invoke-Command,
integrazione con Qualys/Tenable per la correlazione delle vulnerabilità
CVE Assessment · CVSS 9.8 · Wormable · Luglio 2025 Patch Tuesday · Solo rilevamento · Nessun exploit