
CVE-2025-21333の概念実証エクスプロイト。Hyper-Vのvkrnlintvsp.sysにおけるヒープベースのバッファオーバーフローで、I/Oリングとトークン置換によるローカル権限昇格を引き起こします。
Hyper-V NT Kernel Integration VSP(vkrnlintvsp.sys)Paged Pool ヒープオーバーフロー → ローカル権限昇格(LPE)。
本ディレクトリは lab 用 PoC ソースコード(MrAle98/CVE-2025-21333-POC ベース、本機向けパッチを含む)。
| 項目 | 内容 |
|---|---|
| CVE | CVE-2025-21333 |
| タイプ | Heap-based Buffer Overflow |
| 影響 | ローカル権限昇格(EoP);野外利用が報告済み |
| コンポーネント | vkrnlintvsp.sys |
| 脆弱性関数 | VkiRootAdjustSecurityDescriptorForVmwp |
| Pool Tag | ViRo |
| パッチ | 2025-01-14;Win11 23H2 は ≥ 22631.4751(KB5050021)が必要 |
VkiRootAdjustSecurityDescriptorForVmwp 内:
WORD で割り当て長を計算:AclSize + sid1 + sid2 + 16AclSize = 0xfff0 のとき合計 0x10040 → 0x40 に切り詰められるExAllocatePool2(..., 0x40, 'ViRo')memmove(pool, dacl, AclSize) は完全な 0xfff0 のままコピー核心となる不等式:allocatedBytes(0x40) < accessEnd(0xfff0)。
KD による動的確認:
ExAllocatePool2 → @rdx = 0x40memmove → @r8 = 0xfff0Windows Sandbox(および Nested Virtualization)を有効化し、関連 syscall を vkrnlintvsp.sys に到達させる必要がある:
PoC → NtCreateCrossVmEvent
→ VkiRootCalloutCreateEvent
→ VkiRootAdjustSecurityDescriptorForVmwp
| 項目 | 値 |
|---|---|
| Guest OS | Windows 11 23H2 |
パッチ適用済みの 23H2(≥ 22631.4751)では再現不可。Nested Virtualization + Windows Sandbox を有効化する必要がある。
WNF_STATE_DATA を SprayAclSize=0xfff0 を構築し、オーバーフローを誘発して隣接 WNF の DataSize を増幅IrRB(I/O Ring RegBuffers)+ NpAt(PipeAttribute)IOP_MC_BUFFER_ENTRY を偽造PRIV_ESC_OK → セッションに紐づく可視の SYSTEM シェル期待されるレイアウト:0x30 IrRB + 0x80 NpAt(found1=1 && found2=1 が必要)。
アップストリームに対して省略不可の約束事:
ヒープスプレーのレイアウトは非決定的であり、権限昇格は100% ではない;失敗した場合は再試行可能。
| Guest build |
10.0.22631.3447(< 4751、再現可) |
vkrnlintvsp.sys | 10.0.22621.2506;SHA256 015DD1211569B6F85CC0041269F249BA5935A3DA89B615B502DF59EAD5354BB8 |
| テーマ | 要点 |
|---|
| Dual-ACE | 単一 ACE の AceSize=0xf000 は SeCapture によって約 0xf008 に変更される → オーバーフローなし;カーネル側の AclSize=0xfff0 を維持するには二重 ACE が必須 |
| リターンコード | CrossVm が STATUS_INVALID_ACL (0xC0000077) を返す可能性があるが、WNF のスキャンを継続する必要がある |
| タイミング | free CCC → Submit IoRing → Sleep(5000) → free DDD → pipe spray |
| Sandbox | IrRB/NpAt を確認した後に WindowsSandboxClient を kill する |
| ntos RVA | ExAllocatePool2=0xaac7a0、PsInitialSystemProcess=0xd1da60(3447 ではアップストリームのオフセットだと system EPROCESS: 0 になる) |
| 可視シェル | CreateProcessAsUser + TokenSessionId + winsta0\Default → VISIBLE_SYSTEM_CMD_OK |