vfs_attr_pack_internal 中的 getattrlist 越界写入组件: XNU VFS — vfs_attr_pack_internal(getattrlist 系统调用)
受影响版本: iOS / iPadOS 26.6 (23G71) 及更早版本
修复版本: iOS / iPadOS 26.6.1 (23G83)
类型: 对调用者缓冲区进行越界写入
影响: 内核堆损坏;在内核上下文中(获得内核读写能力后),可向攻击者控制的缓冲区写入 PAC 签名指针
由匿名研究人员发现
(依据 Apple 安全公告 — iOS 26.6.1)
vfs_attr_pack_internal 遍历请求的属性位图,并将每个属性顺序写入调用者的缓冲区。在写入属性槽位 51(SETXATTR_SLOT)之前,它不会检查当前输出偏移是否已超过 bufsize。
对于文件名为 16 个字符的文件,完整有效的属性输出为 0x1a4(420)字节。槽位 51 从偏移 0x198(408 字节)处开始。当调用者提供的缓冲区小于 0x198 + 8 时,内核会向缓冲区末尾之外写入 8 字节:
; vfs_attr_pack_internal(受影响路径,26.6 / 23G71)
; 槽位 51 写入 — 存储前无边界检查
str x_attr_data, [buf + 0x198] ; 若 bufsize < 0x198 + 8 则越界
通过设备端探测验证的有效属性掩码(在 16 字符文件名上执行 getattrlist,iOS 26.6):
| 字段 | 掩码 |
|---|---|
commonattr | 0xffe7ffff(位 19、20 在此内核上无效) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
在 16 字符文件名上使用这些掩码时,总输出 = 0x1a4 字节。只要 bufsize < 0x1a0,越界就会发生在槽位 51(buf+0x198)处。
在 iOS 26 上,KHEAP_TEMP 隔离机制使得从用户空间进行的越界写入无法以有效方式直接破坏相邻的堆分配。在本研究中,该漏洞被归类为仅限内核堆:
vfs_attr_pack_internal。在 iOS 26.6 越狱链中,此漏洞在最后阶段被用于将 PACIA 伪造指针写入与调用者缓冲区相邻的内核分配中。
poc_getattrlist_oob.c 通过三次调用演示越界边界:
PoC 创建一个 16 字符文件名(/var/root/aaaaaaaaaaaaaaaa)作为测试目标,执行全部三次 getattrlist() 调用,并打印返回码。内核崩溃日志(若触发)将显示在 buf+0x198 处出现故障。
/var/root/ 写入权限(用于创建 16 字符测试文件;路径可调整为任何可写位置)# 独立 C 二进制 — 无需框架
clang -arch arm64 -o poc poc/poc_getattrlist_oob.c
# 在设备上运行:
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_getattrlist_oob.c
codesign -s "Apple Development" poc
| 日期 | 事件 |
|---|---|
| 2026-08-17 | 发布包含修复的 iOS 26.6.1 |
| 2026-08-17 | Apple 在安全公告中发布致谢 |
| 调用 | 缓冲区大小 | 预期结果 |
|---|
| 1 | 64 字节 | 内核写入 0x1a4 字节 → 在 buf+0x198 处越界(超出末尾 344 字节) |
| 2 | 0x198 字节 | 越界写入恰好从缓冲区末尾开始 |
| 3 | 0x1a4 字节 | 精确有效大小 → 完全成功 |