
# PowerShell アセスメントスクリプト CVE-2025-47981(SPNEGO NEGOEX ヒープオーバーフロー)について、カーネルバージョン、PKU2U レジストリキー、公開された SPNEGO ポートを検証することで Windows システムをチェックする PowerShell アセスメントスクリプトです。修復手順と検出ガイダンスを提供します。
種別: 脆弱性評価 — 検出 / コンプライアンスチェック 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 — ヒープベースのバッファオーバーフロー 別名: "SPNEGO Nightmare" / "Windows Authentication Wormable RCE" パッチ: KB5062560 | 2025年7月 Patch Tuesday
WindowsシステムがCVE-2025-47981 — SPNEGO Extended Negotiation (NEGOEX) メカニズムにおけるヒープベースのバッファオーバーフローで、認証なしのRCEを許す脆弱性 — に対して脆弱かどうかを検証するPowerShell評価スクリプト。エクスプロイトは実行せず — 露出とパッチ状態のみを評価します。
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-47981は、WindowsのSPNEGO認証メカニズムの内部拡張レイヤーであるNEGOEXプロトコルにおけるヒープベースのバッファオーバーフローです。この脆弱性により、認証されていない攻撃者が任意のリモートコードを実行し、システムの完全な制御を取得する可能性があります。
アナリストはすでにこのCVEを「重大な問題になるという不幸な特徴を持つ」と評しており、ワーム化可能 — ユーザーの操作なしに脆弱なシステム間で自動的に拡散する可能性 — とされています。
この脆弱性は、Windows 10 (バージョン1607以降) およびWindows Server 2008 R2からServer 2025まで(Server Core バリアントを含む)に影響し、x64、x86、ARM64アーキテクチャで33以上の異なるWindowsおよびServer構成が脆弱であると確認されています。
$ cat ./technical_background.txtSPNEGO (Simple and Protected GSSAPI Negotiation Mechanism) は、認証された各セッションの前にWindowsが使用する認証ハンドシェイクレイヤーです。アプリケーションは、プロトコルを固定せずに認証を必要とすることがよくあります — Windowsはある環境ではKerberos、別の環境ではNTLM、または異なる信頼モデルでは拡張認証メカニズムを使用できます。SPNEGOは、使用する認証プロトコルを決定するネゴシエーションメカニズムです。
Cliente Servidor
│ │
│──── SPNEGO Negotiation ────────►│
│ MechTypeList: │
│ [Kerberos, NTLM, NEGOEX] │
│ │
│◄─── Selected Mechanism ─────────│
│ │
│──── Auth Exchange ─────────────►│ ← overflow aqui no NEGOEX
NEGOEX はSPNEGO内の拡張メカニズムです — PKU2U (ピアツーピア) 認証やその他のカスタムメカニズムのネゴシエーションを可能にします。 この脆弱性は、複数のフラグメントで送信された過大な SPNEGO_TOKEN 構造を処理する ntoskrnl!SpnegoHandleExtended 関数にあり、カーネルヒープのオーバーフローを引き起こします。
グループポリシー「ネットワーク セキュリティ: このコンピューターへのPKU2U認証要求をオンラインIDを使用して許可する」が有効になっているシステムでは、リスクが高まります。多くのWindowsデプロイメントでデフォルトで有効になっているこの設定は、ピアツーピア認証を許可することでNEGOEXの攻撃対象領域を拡大し、そうでなければ公開されないエンドポイントでNEGOEXの脆弱なコードパスをアクティブにします。
$ 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)"
}
なぜ ntoskrnl.exe で、Get-HotFix ではないのか?
Get-HotFix はインストール済みKBを一覧表示しますが、既知の制限があります:
DISM またはサイレントモードのWindows Updateで適用されたKBを検出しないntoskrnl.exe のバージョンを直接確認する方が信頼性が高い — このファイルは、KBが実際に適用され、システムが再起動された場合にのみパッチ済みバージョンを受け取ります。再起動が保留中のKBがあるシステムでは、メモリ内に古いバージョンのカーネルが残っています。
[version] キャスト: PowerShellはデフォルトで文字列を辞書順に比較します — "10.0.14393.8246" -lt "10.0.14393.800" は $false (誤り) になります。[version] へのキャストにより、オクテット単位の正しい数値比較が保証されます。
[System.IO.Path]::Combine($env:SystemRoot, ...): ハードコードされた C:\Windows の代わりに SystemRoot を使用 — Windowsが別のドライブにインストールされているシステムに移植可能です。
10.0.14393.824610.0.14393.xxxx → Windows 10 version 1607 / Windows Server 2016
│
└─ 8246 = build com KB5062560 aplicado
なぜこの特定のビルドなのか?
Windows Server 2016 (ベースビルド 14393) は、パッチ適用に最も重要な環境の1つです — DC、ファイルサーバー、社内コーポレートサービスで広く使用されています。バージョン 8246 は、KB5062560 (2025年7月) 適用後のカーネルビルドに対応します。
他のオペレーティングシステムでは、必要な最小ビルド番号が異なります — スクリプトはOSごとのバージョンテーブルで拡張できます。
AllowOnlineID$regPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\pku2u"
$regName = "AllowOnlineID"
このキーは何を制御するのか?
この脆弱性は、主にグループポリシー「オンラインIDを使用したこのコンピューターへのPKU2U認証要求を許可する」がデフォルトで有効になっているシステムに影響します。これはWindows 10バージョン1607以降の場合です。
AllowOnlineID キーは、このグループポリシーのレジストリ表現です。有効 (= 1) の場合、システムはPKU2U認証を受け入れ — オーバーフローを含むNEGOEXコードパスをアクティブにします。
| 値 | 状態 | リスク |
|---|---|---|
1 | PKU2U 有効 | 高 — NEGOEXベクターがアクティブ |
0 | PKU2U 無効 | 低 — ベクターは緩和 (パッチは依然として必要) |
| 存在しない | システムデフォルト | GPOに依存 — gpresult /r で確認 |
-ErrorAction SilentlyContinue: このキーはすべてのシステムに存在するとは限りません — スクリプトはエラーを生成せずに不在を適切に処理します。
$ports = @(135, 445, 5985, 3389, 80, 443, 25)
攻撃者は、SPNEGO認証を使用するSMB (ポート445/TCP)、RDP (ポート3389/TCP)、HTTP/S (ポート80、443/TCP)、SMTP (ポート25/TCP) などの脆弱なサービスに悪意のあるパケットを送信することで、認証なしでリモートからこの欠陥を悪用できます。
| ポート | プロトコル | SPNEGOの使用目的 |
|---|---|---|
135 | RPC Endpoint Mapper | RPC認証ネゴシエーション |
445 | SMB | ファイル共有、名前付きパイプの認証 |
5985 | WinRM (HTTP) | PowerShell リモーティング、管理 |
3389 | RDP | リモートデスクトップ認証 |
80 | HTTP | IIS Windows 認証 (Negotiate) |
443 | HTTPS | TLS経由のIIS Windows認証 |
25 | SMTP | Exchange Extended Protection |
Get-NetTCPConnection -LocalPort $port は、ローカルシステムでポートが LISTEN 状態にあるかどうかを確認します — 開いている各ポートは、エクスプロイトの独立した配信ベクターを表します。
$ 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