组件: XNU VFS — default_setxattr_doubleagent(tmpfs VNOP)
受影响版本: iOS / iPadOS 26.6 (23G71) 及更早版本
修复版本: iOS / iPadOS 26.6.1 (23G83)
类型: xattr 处理器指针签名中的固定 PAC 多样化器
影响: 从内核上下文控制 PC;结合内核写入原语可实现完全提权
发现者:Bhaswanth Chigurupati、Billy Jheng Bing Jhong、Pan Zhenpeng (@Peterpan0927)(STAR Labs SG Pte. Ltd.)
(依据 Apple 安全公告 — iOS 26.6.1)
default_setxattr_doubleagent 是 tmpfs 文件系统的 VNOP xattr 处理器,它使用固定的、编译时常量 PAC 多样化器:#0x307a 对 xattr 处理器函数指针进行签名。
; XNU 内核 — default_setxattr_doubleagent(反编译)
handler_ptr = vnode_operations[VNOP_SETXATTR_SLOT]; // 从 vnop 表中读取
signed_ptr = PACDA(handler_ptr, 0x307a); // 使用固定多样化器签名
... call AUTDA(signed_ptr, 0x307a) → BLR // 认证并跳转
由于多样化器是固定的且公开已知,拥有内核写入原语的攻击者可以:
forged = PACIA(shellcode_addr, 0x307a)forged 写入目标 vnode 的 vnode_operations 表中相应槽位。setxattr() → 内核执行 shellcode_addr。在 iOS 26.6 内核提权链中:
CVE-2026-64788 (IOGPUFamily UAF) → 内核读写原语
CVE-2026-65330 (本漏洞) → PC 控制 → root (uid=0)
sign_ptr 原语(使用多样化器 #0x307a 的 PACIA)在越狱 POC 中通过内联 ARM64e 汇编实现。内核读写原语用于:
v_op 指针。vnode_operations[VNOP_SETXATTR_SLOT]。setxattr("/tmp/trigger", ...) 触发执行。独立 PoC(poc_pac_bypass.c)测试易受攻击的 VNOP 路径:
/var/root/poc65330_test 创建测试文件XATTR_NAME="com.apple.poc.cve65330.test" 调用 setxattr() → 命中 default_setxattr_doubleagentremovexattr() 以命中清理路径该 PoC 不会伪造 PAC 指针或覆盖任何内核数据——它仅演示了易受攻击的 #0x307a 签名路径可通过正常的 setxattr() 系统调用从用户空间触达。
/var/root/ 创建文件(setxattr 调用本身可从任何进程触达——文件路径可调整为沙箱可写位置)# 独立 C 二进制(无需框架)
clang -arch arm64 -o poc poc/poc_pac_bypass.c
# 在设备上运行(需签名):
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_pac_bypass.c
codesign -s "Apple Development" poc
固定多样化器 0x307a 已通过 26.6 (23G71) 内核缓存的反汇编验证:
; default_setxattr_doubleagent + 0x??(近似)
MOVZ x1, #0x307a ; 多样化器常量
PACDA x0, x1 ; 签名处理器指针
调用点处对应的 AUTDA x0, x1 使用相同的常量,确认任何使用多样化器 0x307a 的 PACIA 伪造指针都能成功通过认证。
| 日期 | 事件 |
|---|---|
| 2026-08-17 | 发布 iOS 26.6.1 修复版本 |
| 2026-08-17 | Apple 在安全公告中发布致谢 |