乐于分享
好东西不私藏

iOS 26.1内核漏洞利用:vm_map_clip竞态与OOB

iOS 26.1内核漏洞利用:vm_map_clip竞态与OOB

📡 嗨~这是来自 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 编号。

影响范围

属性
详情
受影响产品
iOS 26.1 (23B85)
目标设备
iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max、iPhone SE2(A13 芯片)
内核版本
xnu 26.1 (42.6)
漏洞类型
竞态条件(Race Condition)、越界写入(Out-of-Bounds Write)
修复版本
iOS 26.6 及更高版本
CVE 状态未分配 CVE
CVSS 评分
未公开(推测为高危,9.0+)
CISA KEV
未收录(两个漏洞均无 CVE 编号)
利用前提
需在越狱设备上运行,或通过沙箱逃逸获取代码执行能力

技术分析

Bug 1: vm_map_clip 竞态条件

漏洞根因:在 XNU 内核的虚拟内存管理子系统中,vm_map_clip 函数负责在处理 COW(写时复制)映射时"裁剪"(clip)虚拟内存条目。当调用 vm_remap(copy=TRUE) 创建 COW 子映射时,存在以下竞态窗口:

  1. 复制映射(copy-map)被加锁
  2. 在 0x8c2c 偏移处解锁 copy-map
  3. 随后在未持有子映射(submap)锁的情况下
    ,对保存的条目执行 clip 操作
  4. 关键问题: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 范围时:

  1. 从条目的 +0x38 偏移处读取高 32 位物理索引
  2. 将物理索引解码到 0xffffffdc00000000 物理窗口
  3. 关键缺陷
    :将 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

安全影响与威胁评估

威胁评级:高危

维度
评估
利用复杂度
高(需要精确的竞态时序控制)
权限提升
本地内核代码执行 → root 权限
设备影响
设备崩溃(panic)是预期行为
修复及时性
已修复(iOS 26.6+)
野外利用
未观察到

与相关 CVE 的区别

此 clipwire 项目涉及的两个漏洞不同于已知的 iOS 内核 CVE:

CVE
漏洞类型
影响版本
与 clipwire 关系
CVE-2025-31219
vm_map 竞态条件
iOS 18.5+
不同代码路径
CVE-2025-24118
XNU SMR 竞态
macOS 15.5+
不同漏洞机制
CVE-2025-43300
ImageIO OOB 写入
iOS 18.6.2+
不同组件
CVE-2025-24257
Kernel OOB 写入
iOS 18.4+
不同函数

重要说明:clipwire 作者明确表示这两个漏洞未分配 CVE 编号,属于补丁后披露的研究成果。

检测与防御

检测方法

由于漏洞已在 iOS 26.6 中修复,当前主要检测方向为:

  1. 版本检测
    :检查设备 iOS 版本是否为 26.1(23B85)
  2. 内核崩溃日志分析
    :若设备发生不明原因 kernel panic,检查 panic 日志是否包含 vm_map 或 vm_fault_wire 相关堆栈
  3. 沙箱行为监控
    :监控异常 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 深度研究生成,内容基于公开信息整理,仅供安全研究和防御参考。禁止将本报告用于未授权的漏洞利用或攻击行为。

相关学习资料