组件: AppleKeyStore 内核扩展 — _LibSer_SEPControl_Deserialize
受影响版本: iOS / iPadOS 26.6 (23G71) 及更早版本
修复版本: iOS / iPadOS 26.6.1 (23G83)
类型: SEP 控制消息反序列化中的越界读取
影响: 内核指针泄露 → 从沙盒、无权限进程中绕过 KASLR(通过 DYLD_INTERPOSE ACM 句柄捕获)
发现者:Drinor Selmanaj (Sentry)、Surya Narayan Kushwaha
(依据 Apple 安全公告 — iOS 26.6.1)
AppleKeyStore 内核扩展中的 _LibSer_SEPControl_Deserialize 将 ACM(凭据管理器)消息缓冲区中的 (payload_ptr, declared_length) 对通过 copyout() 发布到用户空间,。
declared_length ≤ remaining通过提供 declared_length = 0x800,驱动程序会从内核 ACM 消息缓冲区末尾之外复制约 0x7E8 字节 — 读取到相邻的内核堆分配区域。这些相邻区域包含可用于计算 KASLR slide 的内核指针(0xfffffff0xxxxxxxx)。
; _LibSer_SEPControl_Deserialize(受影响路径,26.6 / 23G71)
ldr w2, [acm_msg + declared_length_offset] ; 用户可控的 0x800
; 无检查:w2 <= (acm_msg_end - payload_ptr) ← 缺失
bl copyout ; 将 w2 字节复制到用户空间
直接调用 IOServiceOpen("AppleKeyStore") 会被沙盒对侧载应用阻止。然而,Security.framework 的安全隔区密钥签名路径会在进程内使用真实的 ACM 会话句柄调用 IOConnectCallMethod。
PoC 使用 __DATA,__interpose 钩子(在 dyld 加载时运行,早于 __DATA_CONST 变为只读 — fishhook 在 iOS 26 上因 DATA_CONST 保护而被阻止):
SecKeyCreateRandomKey(kSecAttrTokenIDSecureEnclave) → SecKeyCreateSignature() → 进程内 IOConnectCallMethod 以真实 ACM 句柄触发(conn, handle[16])declared_length = 0x800 跨 163 个 AKS 选择器重放0xfffffff0xxxxxxxx 内核指针 → 计算 KASLR slidepoc_aks_oob.m 实现了完整的 ACM 句柄捕获和 OOB 探测链:
kSecAttrAccessibleAfterFirstUnlock,无生物识别)declared_length = 0x800 跨全部 163 个 AKS 选择器重放KPTR @+XXXX = 0xfffffff0YYYYYYYY 处发现的任何内核指针如果 SE 密钥签名通过 secd XPC 而非进程内路由,则回退探测使用零句柄(确认 OOB 路径可达性;所有选择器将无法通过 ACM 验证,但 VNOP 路径已确认)。
在 iOS 26 上,__DATA_CONST(包含 GOT)在任何进程内代码运行之前就被映射为只读。运行时 GOT 写入(如 fishhook 所使用的)会触发 KERN_PROTECTION_FAILURE → SIGBUS。通过 __DATA,__interpose 的 DYLD_INTERPOSE 之所以有效,是因为 dyld 在镜像加载时处理 interpose 表,早于内核强制执行 __DATA_CONST 保护。
kSecAttrTokenIDSecureEnclave)— 任何无权限的侧载应用均可使用Security.framework 的 SE 密钥签名可能会在进程内调用 AKS IOKit 调用
(取决于设备和 iOS 构建版本)。在某些配置下,该调用会通过 secd XPC 路由 —
在这种情况下,零句柄回退可确认 OOB 路径可达性,但无法实现完整的 KASLR 绕过。# Xcode 项目 — 链接 Security.framework 和 Foundation.framework
clang -arch arm64 \
-isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-framework Security -framework Foundation \
-o poc poc/poc_aks_oob.m
codesign -s "Apple Development" --entitlements ent.plist poc
最低权限要求(ent.plist):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>keychain-access-groups</key>
<array><string>$(AppIdentifierPrefix)com.research.poc65343</string></array>
</dict></plist>
| 日期 | 事件 |
|---|---|
| 2026-08-17 | iOS 26.6.1 发布并包含修复 |
| 2026-08-17 | Apple 在安全公告中发布致谢 |