CVE-2025-33071 — Windows KDC Proxy Service (KPSSVC) Remote Code Execution Vulnerability
Executive Summary
Use after free in Windows KDC Proxy Service (KPSSVC) allows an unauthorized attacker to execute code over a network.
Overview
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C
EPSS Score
Affected Products
| Product | KB Article | Severity | Impact | Restart Required |
|---|---|---|---|---|
| Windows Server 2012 | 5061059 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 (Server Core installation) | 5061059 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 | 5061018 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2012 R2 (Server Core installation) | 5061018 (Monthly Rollup) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 | 5061010 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2016 (Server Core installation) | 5061010 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 | 5060531 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2019 (Server Core installation) | 5060531 (Security Update) |
Critical | Remote Code Execution | Yes |
| Windows Server 2022 5060526 (Security Update) 5060525 (SecurityHotpatchUpdate) Critical Remote Code Execution 5058385 5058500 Base: 8.1 Temporal: 7.1 Vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C 10.0.20348.3807 10.0.20348.3745 Yes None Windows Server 2022 (Server Core installation) 5060526 (Security Update) 5060525 (SecurityHotpatchUpdate) Critical Remote Code Execution 5058385 5058500 Base: 8.1 Temporal: 7.1 Vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H/E:U/RL:O/RC:C 10.0.20348.3807 10.0.20348.3745 Yes None Windows Server 2022, 23H2 Edition (Server Core installation) | 5060118 (Security Update) |
Critical | Remote Code Execution | Yes |
Patches
| Article | Type | Restart |
|---|---|---|
5061059 |
Monthly Rollup | Yes |
5061018 |
Monthly Rollup | Yes |
5061010 |
Security Update | Yes |
5060531 |
Security Update | Yes |
5060118 |
Security Update | Yes |
Patch Diff
Use-after-free (CWE-416, race-triggered) in the Windows KDC Proxy Service kpssvc.dll (KPSSVC, MS-KKDCP), unauthenticated remote code execution against servers configured as a KDC Proxy (Critical, AV:N, AC:H race, CVSS 8.1). Each proxied Kerberos request is tracked by a _KPS_IO context created by KpsCreateKpsIo and released by KpsFreeKpsIo, driven asynchronously through HTTP receive/send and backend-socket stages each with its own I/O completion routine (KpsHttp*IoCompletion, KpsSocket*IoCompletion) operating on the same _KPS_IO. PRE: the _KPS_IO could be freed by one path (cancel/timeout/completion) while another in-flight completion still referenced it - a race UAF. Because KPSSVC accepts KKDCP requests over the network without authentication, the freed-object reuse is an RCE primitive (Microsoft rates it Critical; domain controllers are not affected - only servers configured as KDC Proxy). Diff of kpssvc.dll 10.0.26100.3912 -> .4343 (Jun 10 2025, KB5060842, Windows Server 2025; OS fixed build .4349; vsize 274432 -> 286720) confirms the fix: a KpsIoLockedRef locked-reference wrapper is introduced (gated behind CFR flag Feature_4205429049) and threaded through the request paths - KpsProcessProxyRequest's signature changes from _KPS_IO* to KpsIoLockedRef&, so the context is held alive/serialized while in use and KpsFreeKpsIo (now paired with KpsCancelTimeoutTimer) releases it only once no locked reference remains. Stated at confirmed-changed level (broad async-lifecycle rework; the isolable mechanism is the KpsIoLockedRef reference lifetime management).
| Function | Address | Change | Note |
|---|---|---|---|
KpsProcessProxyRequest |
code change |
code (now takes a KpsIoLockedRef locked reference instead of a raw _KPS_IO*) | Signature changed from KpsProcessProxyRequest(_KPS_IO*) to KpsProcessProxyRequest(KpsIoLockedRef&) - the request context is now held via a locked reference across processing so it cannot be freed while in use. |
KpsFreeKpsIo / KpsCreateKpsIo |
code change |
code (request-context lifecycle reworked, CFR-gated) | KpsFreeKpsIo now pairs with KpsCancelTimeoutTimer and releases the _KPS_IO only once no locked reference remains (Feature_4205429049); the async completion routines (Kps*IoCompletion) acquire/hold the locked reference. |
Feature_4205429049 |
gate |
added (CFR gate) | Dominant CFR flag gating the KpsIoLockedRef locked-reference lifecycle; the original raw-pointer _KPS_IO handling remains when the flag is disabled. |
Attack Path
A race between request-context teardown and an in-flight KKDCP completion frees the _KPS_IO while still in use
Derived from the patch delta: the checks added by the vendor identify which fields crossed a trust boundary unvalidated. Reachability and privilege are taken from the call chain in the RCA report.
Exploits & PoC
Detection Rules
Acknowledgments
k0shl
ʌ!ɔ⊥ojv with Kunlun Lab