📡 嗨~这是来自 Matrix 安全情报工作站 的一条情报。
我们把全网散落的漏洞通告、威胁情报自动聚合、去重、深研,沉淀成安全运营和攻防智能体可以直接消费的实时知识。想获取完整知识库、历史溯源或 API 接入?来我们的网站逛逛 👉 https://matrix.01xinan.com
clipwire: iOS 26.1 vm_map_clip Race + vm_fault_wire_object_pages OOB Kernel Exploit Harness
概述
clipwire 是由安全研究员 olaffx 发布的 iOS 内核漏洞利用开发框架,专门针对 iPhone 11 系列(A13 芯片,iPhone12,1)设备上的 iOS 26.1(23B85)版本。该项目通过二进制补丁比对(patch diffing)技术发现并公开了两个已在内核版本 xnu 26.1(42.6)到 26.6(162.13)之间被修复的内核漏洞:
- Bug 1(漏洞利用第一阶段)
: vm_map_clip在 COW(Copy-On-Write)子映射故障路径中存在竞态条件,导致使用已过期(stale)的映射条目 - Bug 2(漏洞利用第二阶段)
: vm_fault_wire_object_pages函数缺少offset + wire_size <= object->size边界检查,导致越界写入内核堆内存
这两个漏洞均已在 iOS 26.6 中被 Apple 修复,披露状态为"补丁后披露"(post-patch disclosure)。截至目前,Apple 尚未为这两个漏洞分配 CVE 编号。
影响范围
| 受影响产品 | |
| 目标设备 | |
| 内核版本 | |
| 漏洞类型 | |
| 修复版本 | |
| CVE 状态 | 未分配 CVE |
| CVSS 评分 | |
| CISA KEV | |
| 利用前提 |
技术分析
Bug 1: vm_map_clip 竞态条件
漏洞根因:在 XNU 内核的虚拟内存管理子系统中,vm_map_clip 函数负责在处理 COW(写时复制)映射时"裁剪"(clip)虚拟内存条目。当调用 vm_remap(copy=TRUE) 创建 COW 子映射时,存在以下竞态窗口:
复制映射(copy-map)被加锁 在 0x8c2c偏移处解锁 copy-map- 随后在未持有子映射(submap)锁的情况下
,对保存的条目执行 clip 操作 关键问题:clip 操作不重新验证条目边界
竞态时序: Thread A (受害者) Thread B (攻击者) | | vm_remap() 创建子映射 | | | 锁定 copy-map | | | ...处理中... | | | 解锁 copy-map ← ← ← ← ← ← ← ←┘ | | clip 在 stale entry 上执行 | (子映射锁未持有) v 使用 stale entry 访问已释放/修改的内存区域漏洞位置符号(未偏移):0xfffffff0080b8820(KSYM_COW_FAULT_FUNC)
Apple 修复方案:在 26.6 版本中,clip 操作现在会在新条目分配后重新验证条目边界,并在检测到不一致时触发内核 panic。
Bug 2: vm_fault_wire_object_pages 越界写入
漏洞根因:vm_fault_wire_object_pages 函数负责将虚拟内存页"固定"(wire)在物理内存中,防止被换出。该函数在遍历 vme_start..vme_end 范围时:
从条目的 +0x38偏移处读取高 32 位物理索引将物理索引解码到 0xffffffdc00000000物理窗口- 关键缺陷
:将 vm_page指针写入对象的页数组时,缺少offset + wire_size <= object->size边界检查
// 漏洞代码逻辑(伪代码)for(offset=vme_start;offset<vme_end;offset+=PAGE_SIZE){// 从条目获取对象和偏移object=entry->vme_object;page_offset=(offset-entry->vme_start)/PAGE_SIZE;// 漏洞:没有检查 page_offset < object->page_count// 直接写入 vm_page 指针到对象页数组object->pages[page_offset]=vm_page_pointer;// 可导致:vm_page* 被写入 victim vm_object 的页数组之外// 污染内核堆内存}
漏洞位置符号(未偏移):0xfffffff0080abae0(KSYM_WIRE_OBJECT_PAGES)
Apple 修复方案:在 26.6 版本中添加了边界检查和 panic 机制。
漏洞利用链详解
clipwire 采用了经典的多阶段内核漏洞利用框架:
阶段 1:Bug 1 - COW 子映射竞态触发
1.调用vm_remap(copy=TRUE)创建COW子映射2.两个线程并发执行:-Thread1:正常执行COW故障处理-Thread2:在竞态窗口内触发clip操作3.通过mach_vm_region检测(条目增长/区域起始地址移动)4.结果:获得一个引用已修改内存区域的stalevm_map_entry
阶段 2:Bug 2 - 越界写入触发
1.对阶段1获取的腐败范围调用wiring操作2.vm_fault_wire_object_pages遍历vme_start..vme_end3.写入vm_page*指针超过victimvm_object页数组边界4.污染目标:堆相邻的vm_object页数组(COW相同页数的副本)+IOSurface物理连续内存池5.使用write-through测试验证OOB命中:-被覆写的groom的数组现在映射victim's页-通过groom的用户空间VA写入stamp-在victim'swiredpages中检测到stamp
阶段 3:内核读写原语(KRW)建立
1.通过mach_vm_page_info解析每个自有页的物理地址2.构建(va,phys)别名缓存3.write-through别名允许通过两个用户VA访问同一物理页4.escalate()验证别名有效性5.prim_read64/prim_write64提供可达别名空间的读写6.若物理窗口对象被确认,prim_find_kernel_in_phys扫描通过内核线性映射建立slide+kread/kwrite
阶段 4:特权提升
1.find_proc_by_comm自验证structproc:-p_list内核指针-p_pid==getpid()2.patch_creds自验证ucred:-cr_ref较小-cr_uid==getuid()3.零化uid/gid实现root权限获取
项目结构与代码架构
clipwire/├──src/│├──clipwire.h#常量、条目布局、可调参数、API定义│├──util.c#初始化、设备/版本检查、辅助函数│├──slide.c#内核slide解析(env/sysctl回退;krw.c中prim扫描)│├──trigger.c#Bug1:COW子映射+双线程clip竞态│├──wire.c#Bug2:wire-OOB驱动+IOSurfacegrooming+victim检测│├──krw.c#物理r/w(通过腐败页数组)、kread/kwrite、││#物理扫描slide泄漏、进程发现、特权提升│├──exploit.c#漏洞利用编排│└──main.m#入口点├──Makefile#clang(SDK)+ldid构建├──entitlements.plist#sandbox/IOSurface/IOKit例外└──LICENSE#限制性研究许可证
编译与运行
# 构建 make# 使用 clang 构建 arm64e clipwire 二进制# 签名 makesign# 使用 ldid -S entitlements.plist# 部署到越狱设备 makedeployDEVICE_IP=1.2.3.4 # 运行(需注入 slide)CLIPWIRE_SLIDE=0x1234000/var/tmp/clipwire
安全影响与威胁评估
威胁评级:高危
| 利用复杂度 | |
| 权限提升 | |
| 设备影响 | |
| 修复及时性 | |
| 野外利用 |
与相关 CVE 的区别
此 clipwire 项目涉及的两个漏洞不同于已知的 iOS 内核 CVE:
重要说明:clipwire 作者明确表示这两个漏洞未分配 CVE 编号,属于补丁后披露的研究成果。
检测与防御
检测方法
由于漏洞已在 iOS 26.6 中修复,当前主要检测方向为:
- 版本检测
:检查设备 iOS 版本是否为 26.1(23B85) - 内核崩溃日志分析
:若设备发生不明原因 kernel panic,检查 panic 日志是否包含 vm_map 或 vm_fault_wire 相关堆栈 - 沙箱行为监控
:监控异常 vm_wire系统调用序列
缓解措施
| 升级至 iOS 26.6+ | ||
| 启用安全更新自动安装 | ||
| 避免安装非 App Store 应用 | ||
| 启用锁定模式(Lockdown Mode) |
漏洞发现方法论
该漏洞通过二进制补丁比对(Binary Patch Diffing)技术发现:
发现流程: 1. 获取 xnu 26.1 (42.6) 内核缓存 2. 获取 xnu 26.6 (162.13) 内核缓存 3. 使用 diffing 工具(如 BinDiff、Ghidra Diffing)对比 4. 分析函数级别差异: - 26.6 中新增的边界检查 - 新增的 panic 条件 5. 反向工程原始 26.1 代码中的缺陷 6. 开发漏洞利用框架验证漏洞可利用性参考来源
GitHub - olaffx/clipwire: iOS 26.1 vm_map_clip race + vm_fault_wire_object_pages OOB kernel exploit harness Apple Support - About the security content of iOS 26.6 and iPadOS 26.6 Apple Support - About the security content of macOS Tahoe 26.6 Vulners - clipwire Exploit Database Entry ZDI-25-305 - Apple XNU kernel vm_map Race Condition Local Privilege Escalation NVD - CVE-2025-31219 CISA KEV Catalog
本报告由 AI 深度研究生成,内容基于公开信息整理,仅供安全研究和防御参考。禁止将本报告用于未授权的漏洞利用或攻击行为。
夜雨聆风