
# 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)