
Proof-of-concept for a fixed PAC diversifier bypass in the tmpfs setxattr handler on iOS 26.6, demonstrating reachability of the vulnerable signing path from userspace.
Component: XNU VFS — default_setxattr_doubleagent (tmpfs VNOP)
Affected: iOS / iPadOS 26.6 (23G71) and earlier
Fixed in: iOS / iPadOS 26.6.1 (23G83)
Type: Fixed PAC diversifier in xattr handler pointer signing
Impact: PC control from kernel context; full privilege escalation when combined with a kernel write primitive
Discovered by: Bhaswanth Chigurupati, Billy Jheng Bing Jhong, Pan Zhenpeng (@Peterpan0927) of STAR Labs SG Pte. Ltd.
(per Apple Security Advisory — iOS 26.6.1)
default_setxattr_doubleagent, the VNOP xattr handler for the tmpfs filesystem, signs the xattr handler function pointer using a fixed, compile-time constant PAC diversifier: #0x307a.
; XNU kernel — default_setxattr_doubleagent (decompiled)
handler_ptr = vnode_operations[VNOP_SETXATTR_SLOT]; // read from vnop table
signed_ptr = PACDA(handler_ptr, 0x307a); // sign with FIXED diversifier
... call AUTDA(signed_ptr, 0x307a) → BLR // authenticate and branch
Because the diversifier is fixed and publicly known, an attacker with a kernel write primitive can:
forged = PACIA(shellcode_addr, 0x307a)forged into the appropriate slot of the target vnode's vnode_operations table.setxattr() on any file on the tmpfs mount → kernel executes shellcode_addr.In the iOS 26.6 kernel privilege escalation chain:
CVE-2026-64788 (IOGPUFamily UAF) → kernel r/w primitive
CVE-2026-65330 (this bug) → PC control → root (uid=0)
The sign_ptr primitive (PACIA with diversifier #0x307a) is implemented in the jailbreak POC using inline ARM64e assembly. The kernel r/w primitive is used to:
v_op pointer.vnode_operations[VNOP_SETXATTR_SLOT].setxattr("/tmp/trigger", ...).The standalone PoC (poc_pac_bypass.c) exercises the vulnerable VNOP path:
/var/root/poc65330_testsetxattr() with XATTR_NAME="com.apple.poc.cve65330.test" → hits default_setxattr_doubleagentremovexattr() to hit the cleanup pathThe PoC does not forge a PAC pointer or overwrite any kernel data — it only demonstrates that the vulnerable #0x307a signing path is reachable from userspace via a normal setxattr() syscall.
/var/root/ file creation (the setxattr call itself is reachable from any process — the file path can be adjusted to a sandbox-writable location)# Standalone C binary (no frameworks needed)
clang -arch arm64 -o poc poc/poc_pac_bypass.c
# For on-device (with signing):
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_pac_bypass.c
codesign -s "Apple Development" poc
The fixed diversifier 0x307a was verified from disassembly of the 26.6 (23G71) kernelcache:
; default_setxattr_doubleagent + 0x?? (approximate)
MOVZ x1, #0x307a ; diversifier constant
PACDA x0, x1 ; sign handler pointer
The corresponding AUTDA x0, x1 at the call site uses the same constant, confirming that any PACIA-forged pointer with diversifier 0x307a authenticates successfully.
| Date | Event |
|---|---|
| 2026-08-17 | iOS 26.6.1 released with fix |
| 2026-08-17 | Apple credits published in security advisory |