CVE-2025-62215

Racing for Root: Anatomy of the CVE-2025-62215 Windows Kernel Zero-Day

Amit Schendel
Amit Schendel
Senior Security Researcher

Jan 10, 2026·6 min read

Executive Summary (TL;DR)

CVE-2025-62215 is a race condition in the Windows Kernel handle management logic. By coordinating multiple threads to release the same resource simultaneously, an attacker can trigger a Double Free. This memory corruption allows for the manipulation of kernel structures, ultimately letting a low-privileged user swap their access token for a SYSTEM token. Patch immediately.

A critical race condition in the Microsoft Windows Kernel leads to a Double Free vulnerability, allowing local attackers to escalate privileges to SYSTEM. This flaw was caught being actively exploited in the wild as a zero-day.

The Hook: Concurrency is Hard, Let's Go Shopping

The Windows Kernel is a massive, sprawling beast of C code that has to manage millions of objects—processes, threads, semaphores, and graphical handles—simultaneously. When you have that many things happening at once, synchronization isn't just a good idea; it's the only thing standing between order and absolute chaos. CVE-2025-62215 is exactly what happens when that synchronization slips.

At its core, this is a Use-After-Free (UAF) scenario's ugly cousin: the Double Free. Disclosed in November 2025, this vulnerability was caught actively exploited in the wild. That means someone didn't just stumble upon it; they weaponized it. It affects almost every modern version of Windows, from your grandma's Windows 10 laptop to the Windows Server 2025 blades running the cloud.

Why is this juicy? Because in the kernel, a Double Free isn't just a crash. If you have the right heap layout (Feng Shui), a Double Free is a write-what-where primitive. And in the land of the kernel, if you can write what you want, where you want, you are God.

The Flaw: A Window of Opportunity

The root cause is a classic Time-of-Check to Time-of-Use (TOCTOU) race condition (CWE-362) that results in a Double Free (CWE-415). The vulnerability exists in how the kernel manages the lifecycle of specific shared objects. When an object's reference count drops to zero, or when a handle is explicitly closed, the kernel needs to free the associated memory.

The logic flaw here is surprisingly simple: the kernel checks if the object is ready to be freed, but it doesn't lock the object effectively during the transition state.

Imagine two threads, Thread A and Thread B. Both hold a handle to the same object. Thread A decides to close the handle. The kernel checks: "Is this object valid? Yes. Should I free it? Yes." But before Thread A can actually mark the memory as 'freed', the OS scheduler pauses it and lets Thread B run. Thread B says, "I also want to close this handle." The kernel checks again: "Is this object valid? Yes (because A hasn't finished killing it). Should I free it? Yes." Now both threads rush to call ExFreePool on the exact same pointer.

The Code: The Smoking Gun

To understand the fix, we have to look at the pattern of the failure. While Microsoft doesn't open-source the kernel, we can infer the logic from the patch diffing and the nature of the race. The vulnerable code likely looked something like this—a check without a lock, followed by an action.

Vulnerable Logic (Pseudocode):

void KernelObjectRelease(PVOID Object) {
    // DANGER: No locking mechanism here
    if (Object->State != STATE_FREED) {
        // Small window here where another thread can enter
        Object->State = STATE_FREED;
        
        // The actual memory release
        ExFreePoolWithTag(Object, 'TagX');
    }
}

If two threads enter that if block simultaneously, ExFreePoolWithTag gets called twice on the same address. The allocator freaks out (or gets exploited).

The Fix: Microsoft patched this by introducing proper synchronization primitives. They likely implemented a spinlock or used Interlocked operations to ensure atomicity.

Patched Logic (Pseudocode):

void KernelObjectRelease(PVOID Object) {
    // ATOMIC: Only one thread can switch the state
    if (InterlockedCompareExchange(&Object->State, STATE_FREED, STATE_ACTIVE) == STATE_ACTIVE) {
        // Now we are safe to free, because the other thread will fail the check
        ExFreePoolWithTag(Object, 'TagX');
    }
}

By using an atomic compare-and-exchange, the second thread sees that the state has already changed before it even attempts to enter the cleanup block. The race track is closed.

The Exploit: Grooming the Heap

Turning a Double Free into SYSTEM privileges requires high art: Kernel Heap Feng Shui. The attacker needs to control what happens to that memory chunk between the first free() and the second free().

Step 1: The Setup The attacker creates thousands of handles to the vulnerable object type to defragment the heap. They want their target object to land in a predictable location surrounded by data they control.

Step 2: The Race The attacker spawns multiple threads with high priority. These threads bang on the handle close function simultaneously. If they win the race, the kernel frees the object (let's call it Chunk X), but a second thread is still queued to free Chunk X again.

Step 3: The Spray (The Magic Trick) In the tiny microsecond gap between the first free and the second free, the attacker sprays the heap with a fake object. They allocate a new data structure (like a Pipe attribute or WNF State Name) that fits exactly into Chunk X.

Now, Chunk X isn't empty; it contains the attacker's payload.

Step 4: The Corruption The second thread (the loser of the race) finally executes ExFreePool(Chunk X). But Chunk X is now the attacker's fake object! The kernel frees it again, leaving a dangling pointer or corrupting the heap metadata of the attacker's spray.

Step 5: Token Stealing The attacker uses this corruption to convert their fake object into a primitive that allows reading/writing kernel memory. They scan the EPROCESS list, find the System process (PID 4), copy its Token pointer, and paste it into their own process's token field.

Result? whoami returns nt authority\system.

The Impact: Why Panic?

This is a Local Privilege Escalation (LPE). You might think, "Well, they need to be on the box first." That's true, but in modern attacks, gaining initial access (via phishing or a web shell) is the easy part. The hard part is moving from a constrained user context to full administrative control. CVE-2025-62215 is the key that unlocks that door.

Because this is a kernel-mode exploit, successful execution bypasses most user-mode defenses. It allows an attacker to:

  1. Disable Endpoint Detection and Response (EDR) solutions (most EDRs run as drivers; if you are Kernel, you can unload them).
  2. Dump credentials from LSASS without triggering standard alerts.
  3. Install rootkits or persistent bootloaders.

The fact that this was a zero-day means sophisticated actors were using it to stay hidden. If you see this in your logs, you aren't just compromised; you're owned.

Technical Appendix

CVSS Score
7.0/ 10
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
0.67%
Top 29% most exploited

Affected Systems

Windows 10 (1809, 21H2, 22H2)Windows 11 (22H2, 23H2, 24H2, 25H2)Windows Server 2019Windows Server 2022Windows Server 2025

Affected Versions Detail

Product
Affected Versions
Fixed Version
Windows 10
Microsoft
>= 1809, <= 22H2Nov 2025 Patch
Windows 11
Microsoft
>= 21H2, <= 24H2Nov 2025 Patch
Windows Server
Microsoft
2019, 2022, 2025Nov 2025 Patch
AttributeDetail
CWE IDCWE-362 (Race Condition) / CWE-415 (Double Free)
CVSS7.0 (High)
Attack VectorLocal (AV:L)
ComplexityHigh (AC:H)
PrivilegesLow (PR:L)
EPSS Score0.00668 (Top 30%)
Exploit StatusActive Zero-Day (KEV Listed)
CWE-362
Concurrent Execution using Shared Resource with Improper Synchronization

The product contains a race condition that allows a Double Free to occur, enabling memory corruption.

Vulnerability Timeline

Vulnerability Disclosed & Patched
2025-11-11
Confirmed Exploited in Wild
2025-11-11
Added to CISA KEV
2025-11-12
Federal Patch Deadline
2025-12-03

Subscribe to updates

Get the latest CVE analysis reports delivered to your inbox.