
Script de avaliação em PowerShell que verifica sistemas Windows para a CVE-2025-47981 (estouro de heap no SPNEGO NEGOEX) ao verificar a versão do kernel, a chave de registro PKU2U e as portas SPNEGO expostas. Fornece etapas de remediação e orientações de detecção.
Type: Vulnerability Assessment — Detection / Compliance Check 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
Script PowerShell de assessment que verifica se um sistema Windows está vulnerável ao CVE-2025-47981 — heap-based buffer overflow no mecanismo SPNEGO Extended Negotiation (NEGOEX) que permite RCE sem autenticação. Não executa exploit — apenas avalia exposição e estado de patch.
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981 é um heap-based buffer overflow no protocolo NEGOEX — a camada de extensão interna do mecanismo de autenticação SPNEGO do Windows. A vulnerabilidade permite que atacantes não autenticados executem código remoto arbitrário, potencialmente obtendo controle total do sistema.
Analistas já descreveram a CVE como tendo "as características infelizes de se tornar um problema significativo", com potencial wormable — capaz de se propagar automaticamente entre sistemas vulneráveis sem interação do usuário.
A vulnerabilidade afeta Windows 10 (versão 1607 em diante) e todos os Windows Server de 2008 R2 até Server 2025, incluindo variantes Server Core — mais de 33 configurações distintas de Windows e Server confirmadas vulneráveis em arquiteturas x64, x86 e ARM64.
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) é a camada de handshake de autenticação que o Windows usa antes de cada sessão autenticada. Aplicações frequentemente precisam de autenticação sem fixar um protocolo — o Windows pode usar Kerberos em um ambiente, NTLM em outro, ou um mecanismo de autenticação estendido em um modelo de confiança diferente. SPNEGO é o mecanismo de negociação que decide qual protocolo de autenticação usar.
Cliente Servidor
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← overflow aqui no NEGOEX
NEGOEX é o mecanismo de extensão dentro do SPNEGO — permite que autenticações PKU2U (peer-to-peer) e outros mecanismos customizados sejam negociados. A vulnerabilidade está na função ntoskrnl!SpnegoHandleExtended, que processa estruturas SPNEGO_TOKEN oversized enviadas em múltiplos fragmentos, causando overflow no heap do kernel.
O risco é elevado em sistemas onde a Group Policy "Network security: Allow PKU2U authentication requests to this computer to use online identities" está habilitada. Essa configuração, habilitada por padrão em muitos deployments do Windows, amplia a superfície de ataque do NEGOEX ao permitir autenticação peer-to-peer que ativa o código path vulnerável do NEGOEX em endpoints que de outra forma não o exporiam.
$ 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)"
}
Por que ntoskrnl.exe e não Get-HotFix?
Get-HotFix lista KBs instalados, mas tem limitações conhecidas:
DISM ou Windows Update em modo silenciosoVerificar a versão do ntoskrnl.exe diretamente é mais confiável — o arquivo só recebe a versão patchada quando o KB foi efetivamente aplicado e o sistema reiniciado. Um sistema com KB pendente de reboot ainda terá a versão antiga do kernel em memória.
[version] cast: PowerShell compara strings lexicograficamente por padrão — "10.0.14393.8246" -lt "10.0.14393.800" seria $false (errado). O cast para [version] garante comparação numérica correta por octeto.
[System.IO.Path]::Combine($env:SystemRoot, ...): usa SystemRoot em vez de C:\Windows hardcoded — portável para sistemas com Windows instalado em drives diferentes.
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = build com KB5062560 aplicado
Por que esse build específico?
Windows Server 2016 (build base 14393) é um dos ambientes mais críticos para patch — amplamente usado em DCs, file servers e serviços internos corporativos. A versão 8246 corresponde à build do kernel após a aplicação do KB5062560 (Julho 2025).
Para outros sistemas operacionais, o número de build mínimo requerido é diferente — o script pode ser estendido com uma tabela de versões por OS.