SMAP was enabled. Windows had already set AC=1 and disarmed it.
A kernel exploit against HackSys' vulnerable driver pivoted onto a user-mode fake stack in Ring 0 and never faulted, because the syscall entry path sets the AC bit that suppresses SMAP.
The Watch · Security desk

What happened
- Charfeddine's arbitrary write overwrote HalDispatchTable+0x8 to redirect kernel execution through a stack pivot in an HEVD exploit chain.
- The pivot gadget mov esp, ebx zeroed the top of RSP and dropped execution onto a fake stack allocated in user memory below the 4GB line.
- With CR4 bit 21 set, the ROP chain ran in Ring 0 while reading its gadget addresses straight from a user-mode page.
- A test driver saw RFLAGS.AC set on entry even when the calling process had explicitly cleared it, so the kernel path turns AC on itself.
- A second driver dereferenced a user pointer in Ring 0 with no page fault, confirming that AC=1 switches SMAP off.
Why it matters
- constraint The mitigation an operator sees enabled in CR4 does not by itself stop kernel code from reading a user-mode fake stack, so its coverage is narrower than the checkbox implies.
- contradiction The mitigation read as enabled the whole time the primitive it should have blocked ran to completion, which means a status check on CR4[21] overstates what is actually enforced.
- exposure Any Ring 0 code reached through the normal syscall dispatch inherits AC=1, leaving read and write primitives that touch user memory unguarded by SMAP on this build.
- decision Defenders leaning on SMAP to trip user-mode ROP staging need another signal, because the page fault they expect does not fire.
The behaviour is not exotic once you read the enable condition closely. SMAP only enforces while RFLAGS.AC is clear; set the AC bit and the processor stops faulting on supervisor-mode reads of user pages. [7] So the real question was never whether the exploit was clever, but whether AC was somehow clear in the kernel and got set, or arrived set and stayed that way.
Charfeddine's first guess was that the syscall entry masking clears AC, which would keep SMAP live inside the driver. It does not. The IA32_FMASK MSR that SYSCALL uses to scrub flags read back as 0x4700, which clears the trap, interrupt, direction and nested-task flags and leaves bit 18 untouched. [8] A test driver then confirmed the flag is present rather than absent: when the client raised AC before the call, the handler saw AC=1 at its first instruction. [9]
The rest of the chain is unremarkable, which is the point. Once pivoted, the ROP disabled SMEP through mov cr4, rcx, ran a token-theft payload, and restored the kernel stack. [3] It returned SYSTEM, and the VM stayed up long enough to pop a shell. [4] Nothing in that sequence should have survived a supervisor read of a low user-mode allocation with SMAP on, and all of it did.
One thing the published excerpt leaves open is virtualization. The work ran in a VM, so Charfeddine set up a further check that forces AC back to zero inside the driver and repeats the read, to rule out QEMU/KVM quietly eating the fault. [12] That result is not in the material here, so for now the finding is scoped to Windows 11 build 26200.8328 under a hypervisor. [6] The narrow lesson holds regardless of how that test lands: the presence of a mitigation bit and the blocking of a primitive are two different measurements, and this chain measured both.
What to watch
- The outcome of the AC-forced-to-zero driver test: if the read still succeeds, the fault suppression belongs to the hypervisor, not the syscall path, and the conclusion shifts.
- Whether the same AC=1-on-entry behaviour holds on bare metal and across other Windows builds, or is specific to build 26200.8328 in a VM.
- Whether Microsoft treats a kernel-set AC as intended entry-path behaviour or changes it.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence65
- Adoption
- Insufficient
- Hype gap+5
- Incentives40
- Confidence58
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
While developing a kernel exploit chain against the HackSys Extreme Vulnerable Driver (HEVD), Charfeddine abused an arbitrary write primitive to overwrite HalDispatchTable+0x8 and redirect execution through a stack pivot.
- [2]
The pivot gadget was a 32-bit partial register move, mov esp, ebx ; ret, which zeroes the upper 32 bits of RSP and lands execution in a fake stack built in low user-mode memory via a VirtualAlloc below the 4GB boundary.
- [3]
From the fake stack, a ROP chain disabled SMEP via mov cr4, rcx, jumped to a token-theft payload, and recovered the original kernel stack.
- [4]
The exploit worked, returned SYSTEM, and the VM stayed stable long enough to pop a shell.
- [5]
SMAP was enabled with CR4 bit 21 set, the fake stack was in user-mode memory, and the ROP chain executed in Ring 0 reading gadget addresses from a user-mode page.
- [6]
The experiments were run on a Windows 11 VM, build 26200.8328.
- [7]
SMAP enforcement is conditional: the CPU checks both CR4[21] (SMAP enable) and RFLAGS[18] (the AC bit), and when AC=1 SMAP is suppressed.
- [8]
SYSCALL masks RFLAGS using IA32_FMASK (MSR 0xC0000084) on kernel entry; in WinDbg the mask read back as 0x4700, covering bits 8, 9, 10 and 14 (TF, IF, DF, NT) but not bit 18, so SYSCALL does not clear AC via the hardware mask.
- [9]
A test driver read RFLAGS at the first instruction of its IOCTL handler; when the user-mode client set AC=1 before DeviceIoControl, the driver saw AC=1, showing AC survives the syscall transition.
- [10]
When the client was modified to force AC=0 before the call, the driver still saw AC=1, indicating the kernel entry path actively sets AC=1 regardless of the user-mode state.
- [11]
A second test driver dereferenced a user-mode pointer passed by a client that never touched AC, without crashing, confirming that AC=1 in Ring 0 actually disables SMAP protection.
- [12]
To rule out the hypervisor (QEMU/KVM) silently suppressing SMAP faults, Charfeddine set up a further test that forcefully clears AC inside the driver and repeats the same dereference.
Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.
Sources
1 independent publisher whose own reporting we read for this story.
- Youssef Charfeddine
sibouzitoun.tech
1 article · August 23, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.
Topics
- CPU Security MitigationsFollow
- Exploit Mitigation BypassFollow
- Kernel ExploitationFollow
- Windows SecurityFollow