ios-exploiting

$npx mdskill add wgpsec/AboutSecurity/ios-exploiting

Exploit iOS kernel and WebKit vulnerabilities using Corellium.

  • Analyzes UAF, heap overflow, and sandbox escape techniques.
  • Integrates Corellium, Ghidra, BinDiff, and img4tool.
  • Prioritizes known CVEs and compares patched vs vulnerable kernels.
  • Outputs detailed exploit chains and mitigation bypass strategies.

SKILL.md

.github/skills/ios-exploitingView on GitHub ↗
---
name: ios-exploiting
description: |
  iOS 系统级漏洞利用方法论。涵盖 iOS 内核漏洞利用(UAF/堆溢出/类型混淆)、Safari/WebKit 漏洞利用、PAC 绕过、沙箱逃逸、Corellium 研究环境、已知 CVE 分析(CVE-2020-27950、CVE-2021-30807、iMessage 零点击)。当 Agent 需要分析 iOS 系统级漏洞、进行内核利用研究、或理解 iOS 漏洞利用链时触发。
metadata:
  tags: [ios-exploit, 内核漏洞, webkit, pac绕过, 沙箱逃逸, uaf, corellium]
  category: mobile
---

# iOS 系统级漏洞利用方法论

> **阶段流**: 环境准备(Corellium) → 漏洞面分析 → 内核漏洞利用 → WebKit利用 → PAC绕过 → 沙箱逃逸 → 已知CVE分析

## 深入参考

- iOS 内核堆机制与利用技术 → [references/ios-kernel-heap.md](references/ios-kernel-heap.md)
- 缓解机制详解与绕过方法 → [references/ios-exploit-mitigations.md](references/ios-exploit-mitigations.md)

---

## Phase 0: 环境准备 (Corellium)

### 研究环境选择

```
研究环境?
├─ Corellium(云端 iOS 虚拟化)
│   ├─ 支持内核调试
│   ├─ 支持快照/回滚
│   ├─ 支持多版本 iOS 并行
│   └─ 付费,但研究价值最高
├─ 越狱真机
│   ├─ A11 以下: checkra1n(硬件级越狱)
│   ├─ 需配合 JTAG/SWD(高端研究)
│   └─ 限制: 无法调试内核启动
├─ QEMU (开源)
│   ├─ Project Sandcastle 部分支持
│   └─ 功能有限,不完整
└─ 补丁对比环境
    ├─ Ghidra + BinDiff
    └─ 对比不同 iOS 版本 kernelcache
```

### kernelcache 提取

```bash
# 1. 下载 IPSW
# https://ipsw.me/ → 选择目标设备和版本

# 2. 解压 IPSW (实际是 ZIP)
unzip iPhone*.ipsw -d ipsw_contents/

# 3. 解压 kernelcache
# 使用 img4tool 或 joker
img4tool -e -o kernelcache.raw ipsw_contents/kernelcache.*
# 或
jtool2 --dec kernelcache.release.*

# 4. Ghidra 加载分析
ghidraRun
# 新建项目 → 导入 kernelcache → ARM64 / AARCH64
# 自动分析完成后可搜索函数/符号
```

### BinDiff 版本对比

```bash
# 定位安全补丁修改的函数
# 1. 下载漏洞版本和补丁版本的 IPSW
# 2. 提取两个 kernelcache
# 3. Ghidra 分析两个版本
# 4. 导出 BinExport: File → Export → Binary BinExport (v2) for BinDiff
# 5. BinDiff 打开 → 新建 workspace → 添加 diff
# 6. 主文件=漏洞版本,次文件=补丁版本
# 7. 关注: Changed Functions → 修改的函数即补丁位置
```

### XNU 版本对应

```bash
# iOS 版本 → XNU 版本映射
# https://www.theiphonewiki.com/wiki/kernel
# 例: iOS 15.1 → Darwin Kernel Version 21.1.0 → xnu-8019.43.1
```

---

## Phase 1: 漏洞面分析

### iOS 攻击面分类

```
攻击面?
├─ 远程无交互 (Zero-Click)
│   ├─ iMessage 解析器(图片/音频/视频/PDF/vCard)
│   ├─ FaceTime / VoIP
│   ├─ AirDrop / Bluetooth
│   └─ WiFi 驱动 / 协议栈
├─ 远程需交互 (One-Click)
│   ├─ Safari / WebKit (JavaScript → JIT → RCE)
│   ├─ URL Scheme 处理
│   └─ 恶意配置文件 (.mobileconfig)
├─ 本地提权
│   ├─ 内核 syscall 接口
│   ├─ IOKit 驱动(IOSurface/AGX/IOMFB)
│   ├─ XPC 服务
│   ├─ Mach IPC(port/message/voucher)
│   └─ 文件系统 / sandbox 逃逸
└─ 物理接触
    ├─ USB(lockdownd/usbmuxd)
    ├─ bootrom(checkm8 系列)
    └─ DFU 模式攻击
```

### 常见漏洞类型

| 漏洞类型 | 常见位置 | 利用复杂度 |
|----------|----------|------------|
| UAF (Use-After-Free) | IPC ports, IOKit objects | 中-高 |
| 堆溢出 (Heap Overflow) | 解析器(图片/字体/媒体) | 中 |
| 类型混淆 (Type Confusion) | WebKit JIT, IOKit | 高 |
| 整数溢出 | 内核内存分配, 长度校验 | 中 |
| 竞态条件 (Race Condition) | syscall 并发, lock 缺失 | 高 |
| 信息泄露 | KASLR 绕过, 堆地址泄露 | 低-中 |
| OOB Read/Write | 数组/缓冲区边界检查缺失 | 中 |

---

## Phase 2: 内核漏洞利用

### 内核堆布局 (Heap Feng Shui)

```
堆布局策略?
├─ 旧版 (Pre-iOS 15)
│   ├─ kalloc zones: 按大小分区(16/32/64/.../1280)
│   ├─ 同大小对象相邻 → 堆喷射可预测布局
│   ├─ freelist 指针裸露 → 可伪造
│   └─ 步骤:
│       ├─ 1. 喷射填充碎片孔
│       ├─ 2. 继续喷射迫使新页分配
│       ├─ 3. 放置攻击者控制对象
│       ├─ 4. 释放一个对象创造空洞
│       ├─ 5. 触发目标对象分配到空洞
│       └─ 6. 溢出/UAF 覆写目标对象
└─ 新版 (iOS 15+)
    ├─ kalloc_type: 按类型+大小分区
    ├─ 不同类型对象隔离(OSData ≠ task_t)
    ├─ freelist 指针 XOR 编码
    ├─ per-CPU cache 降低确定性
    ├─ guard pages 检测溢出
    └─ 需要类型特定漏洞或信息泄露
```

### 内核原语构建

```
利用原语构建路径?
├─ 信息泄露 → KASLR 绕过
│   ├─ Mach port 信息泄露
│   ├─ IOKit 属性读取越界
│   └─ 获得内核基地址 + 堆地址
├─ 任意读 (Arbitrary Read)
│   ├─ 伪造 IOKit 对象的虚表
│   ├─ 利用 mach_msg OOL 描述符
│   └─ 内核 task port 伪造
├─ 任意写 (Arbitrary Write)
│   ├─ freelist 指针伪造(旧版)
│   ├─ 虚表劫持 → 控制函数指针
│   └─ pipe buffer 篡改
└─ 任意代码执行
    ├─ 修改进程凭据 (ucred)
    ├─ 绕过代码签名 (trust cache)
    ├─ kernel task port 获取
    └─ 需绕过 PAC + PPL/SPTM
```

### IOSurface 物理 UAF (经典案例)

```
IOSurface 利用流程:
├─ 1. 分配 IOSurface 对象
├─ 2. 获取底层物理页面引用
├─ 3. 释放 IOSurface(但保持物理页引用)
├─ 4. 物理页被回收,分配给其他内核对象
├─ 5. 通过保留的映射读写被复用的内核对象
└─ 6. 构建 kernel r/w 原语
```

---

## Phase 3: WebKit/Safari 利用

### WebKit 漏洞利用链

```
WebKit → 系统完整利用链:
├─ Stage 1: WebKit Renderer RCE
│   ├─ JIT 编译器漏洞(DFG/FTL)
│   ├─ DOM 对象 UAF / 类型混淆
│   ├─ ArrayBuffer 越界读写
│   └─ 获取: JS 层面任意 r/w
├─ Stage 2: 沙箱逃逸
│   ├─ XPC 服务漏洞
│   ├─ Mach port 操作
│   └─ 获取: 进程外代码执行
├─ Stage 3: 内核提权
│   ├─ IPC UAF → kernel r/w
│   ├─ IOKit 驱动漏洞
│   └─ 获取: 内核级权限
└─ Stage 4: 持久化
    ├─ 修改 trust cache
    ├─ 代码签名绕过
    └─ 安装无签名 payload
```

### JSKit 框架模式 (商业间谍软件)

实战中观察到的模式:

```
JSKit 利用框架特征:
├─ 可复用入口: 任何 WebKit JIT bug → JS 任意 r/w
├─ 版本抽象: 内置多版本 PAC 绕过模块
├─ 目标指纹: 自动识别 iOS 版本,选择对应绕过
├─ 手动 Mach-O 映射: 内存解析 dyld cache,无需落盘
├─ 组合模式:
│   WebKit RCE → 内核 IPC UAF → kernel r/w → 代码签名绕过 → 无签名 stager
└─ 反分析: Watcher 模块检测:
    ├─ developer_mode_status
    ├─ 越狱痕迹(Cydia/checkrain/frida/sshd)
    ├─ 安全应用(McAfee/Avast/Norton)
    ├─ 自定义代理/根证书
    └─ 特定 locale (US/IL)
```

---

## Phase 4: PAC 绕过

### PAC 机制概述

```
PAC (Pointer Authentication Codes):
├─ 硬件: ARMv8.3+ (A12 起)
├─ 五个 128-bit 密钥:
│   ├─ APIAKey / APIBKey → 指令指针签名
│   ├─ APDAKey / APDBKey → 数据指针签名
│   └─ APGAKey → 通用签名
├─ 指令:
│   ├─ PACxx → 签名指针(嵌入 PAC 到高位)
│   ├─ AUTxx → 验证+去除 PAC
│   └─ XPACxx → 去除 PAC(不验证)
├─ Modifier(上下文绑定):
│   └─ SP / frame pointer / object ID → 防止跨上下文重用
└─ Apple 定制:
    ├─ 每次启动随机化密钥
    ├─ 用户态/内核态域隔离
    └─ 九种 modifier 类型
```

### PAC 绕过技术分类

```
PAC 绕过方法?
├─ 内核态 PAC 绕过(极难)
│   ├─ 签名 gadget 重用
│   ├─ 未保护的间接分支
│   ├─ CVE-2023-32424 (Apple Silicon M1/M2)
│   └─ 通常需要实现级 bug,无通用绕过
├─ 用户态 PAC 绕过
│   ├─ dyld shared cache
│   │   ├─ 预签名函数指针复用
│   │   └─ PAC oracle 构建
│   ├─ dlsym(3) 返回已签名指针
│   │   ├─ 调用 dlsym("symbol") → 获取 A-key 签名指针
│   │   ├─ iOS 18.4 dlsym bug (Synacktiv)
│   │   └─ context = 0 的签名可跨进程重用
│   ├─ DYLD 重定位窗口
│   │   ├─ 动态链接时临时 RW 页面
│   │   ├─ 竞态利用修改重定位表
│   │   └─ SPRR/VM_FLAGS_TPRO 保护(新版)
│   └─ ObjC Runtime (SLOP)
│       ├─ NSPredicate / NSExpression / NSInvocation
│       ├─ ISA / selector 指针未完全 PAC 保护
│       └─ SeLector Oriented Programming
└─ 组合绕过
    ├─ 信息泄露 + signing gadget
    ├─ 类型混淆 → 控制已签名对象
    └─ 多 stage 链: 每个 stage 提供不同原语
```

---

## Phase 5: 沙箱逃逸

### iOS 沙箱架构

```
沙箱层次:
├─ App Sandbox(最严格)
│   ├─ 文件系统: 仅访问自身容器
│   ├─ IPC: 受限的 XPC/Mach port 访问
│   ├─ 网络: 受 ATS 约束
│   └─ 逃逸路径: XPC 服务漏洞 / Mach port 操作
├─ WebContent Sandbox(Safari 渲染进程)
│   ├─ 比 App 更严格
│   ├─ 无直接文件系统访问
│   ├─ 有限的 Mach 服务列表
│   └─ 逃逸路径: 利用可达的 Mach 服务
├─ 系统服务 Sandbox
│   ├─ mediaserverd / imagent / SpringBoard
│   ├─ 各有不同权限范围
│   └─ 可作为提权中间跳板
└─ 内核 (无沙箱)
    └─ 完全权限
```

### PPL / SPTM 绕过

```
PPL (Page Protection Layer) 保护:
├─ 内核内的内核: 即使 kernel r/w 也无法修改保护页
├─ 保护范围:
│   ├─ 页表结构
│   ├─ 代码签名元数据 / trust cache
│   ├─ entitlement 表
│   └─ 内核代码页
├─ 基于 APRR (Access Permission ReRouting)
│   └─ PTE 索引 → APRR 寄存器 → 实际权限
├─ 已知绕过:
│   ├─ Project Zero TLB stale entry trick
│   │   ├─ 操控页表映射 + 不完整 TLB flush
│   │   └─ 获得 PPL 保护页的可写映射
│   └─ PPL 代码本身的 bug(边界检查缺失等)
└─ 演进: A15+/M2+ → SPTM 替代 PPL
    └─ 更高特权级别的页表监控
```

---

## Phase 6: 已知 CVE 分析

### 典型漏洞利用链

#### Safari → 内核全链 (CVE-2023-419xx 系列)

```
Intellexa Predator 利用链:
├─ CVE-2023-41993: WebKit JIT → renderer RCE
│   └─ JSKit 框架获取 JS 任意 r/w
├─ CVE-2023-41992: 内核 IPC UAF
│   └─ 释放 IPC 对象 → 重分配 → 悬挂指针利用
│   └─ 构建 kernel r/w
├─ CVE-2023-41991: 代码签名绕过
│   └─ 修改 trust cache → 无签名代码执行
└─ PREYHUNTER: 后续监控植入
    ├─ VoIP 录音 (mediaserverd hook)
    ├─ 键盘记录
    ├─ 拍照(无 UI)
    └─ 录音指示灯隐藏 (SpringBoard hook)
```

#### iMessage Zero-Click 模式

```
iMessage 零点击攻击面:
├─ 图片解析器: ImageIO (TIFF/GIF/PNG/JPEG/HEIF)
├─ 音频解析器: CoreAudio (CAF/MP3/AAC)
├─ 视频解析器: AVFoundation
├─ PDF 渲染: CoreGraphics
├─ vCard 解析: Contacts framework
├─ 利用链典型模式:
│   ├─ 1. 畸形媒体文件触发解析器漏洞
│   ├─ 2. 在 imagent/mediaserverd 进程中获得 RCE
│   ├─ 3. 利用该进程可达的内核接口提权
│   └─ 4. 无需用户任何交互
└─ 案例:
    ├─ FORCEDENTRY (NSO): JBIG2 PDF → 图灵完备虚拟机
    ├─ Operation Triangulation: 字体解析 → kernel
    └─ CVE-2021-30860: CoreGraphics PDF 整数溢出
```

### 缓解措施演进

| 缓解机制 | 引入时期 | 防护目标 |
|----------|----------|----------|
| Code Signing | 初始 | 未签名代码执行 |
| DEP/W^X | 早期 | shellcode 执行 |
| ASLR | iOS 4-5 | 地址预测 |
| KASLR | iOS 5-6 | 内核地址预测 |
| KPP/AMCC | iOS 15-16+ | 内核代码篡改 |
| KTRR | A12+ | 内核代码页写入 |
| PAC | A12+ (ARMv8.3) | 指针篡改/ROP/JOP |
| BTI | ARMv8.5+ | 间接分支劫持 |
| PAN | ARMv8.1+ | 内核访问用户内存 |
| PXN | ARMv8+ | 内核执行用户代码 |
| PPL/SPTM | iOS 17+/A15+ | 内核内存修改保护页 |
| MTE/EMTE/MIE | A19+ | UAF/堆溢出/OOB |

---

## Phase 7: 异常处理机制(利用相关)

### XNU 异常处理流程

```
异常触发 → 利用影响:
├─ CPU 异常 (Data Abort / Illegal Instruction / PAC Fail)
├─ trap handler → exception_triage()
├─ 分发顺序:
│   ├─ 1. Thread exception port (调试器)
│   ├─ 2. Task exception port (进程级)
│   └─ 3. Host exception port (ReportCrash)
├─ 无人处理 → bsd_exception() → UNIX signal
│   ├─ EXC_BAD_ACCESS → SIGSEGV/SIGBUS
│   ├─ EXC_BAD_INSTRUCTION → SIGILL
│   ├─ EXC_ARM_PAC → SIGILL (非致命) / 直接终止 (TFRO_PAC_EXC_FATAL)
│   └─ EXC_CRASH → SIGKILL
└─ PAC 异常特殊处理:
    ├─ 平台二进制: TFRO_PAC_EXC_FATAL = true
    ├─ PAC 失败直接终止,不经过调试器
    └─ 防止调试器绕过 PAC 检查
```

### 利用中的异常处理

```
异常在利用中的角色:
├─ 信息收集: 通过异常信息泄露地址
├─ 条件检查: 触发/不触发异常判断条件
├─ crash 稳定性: 利用失败时的优雅退出
├─ anti-analysis 对抗:
│   ├─ Hook EXC_BREAKPOINT → 实现自定义断点
│   ├─ Mach exception port → 自定义异常处理
│   └─ thread_set_state → 修改寄存器恢复执行
└─ 对抗缓解:
    ├─ PAC 异常 → 需避免触发(而非处理)
    └─ 寄存器覆写 → 破坏 crash 取证
```

---

## 工具速查

| 工具 | 用途 | 场景 |
|------|------|------|
| Ghidra | kernelcache 反编译 | 补丁对比/函数分析 |
| BinDiff | 二进制差异对比 | 定位安全补丁 |
| Corellium | iOS 虚拟化研究 | 内核调试/漏洞复现 |
| Frida | 运行时 Hook | 用户态利用验证 |
| r2frida | 内存分析 | 运行时堆分析 |
| jtool2 / otool | 二进制解析 | Mach-O 结构分析 |
| img4tool | IPSW 解析 | kernelcache 提取 |
| checkra1n | A5-A11 越狱 | 研究设备准备 |

---

## 参考资源

- [HackTricks - iOS Exploiting](https://book.hacktricks.wiki/binary-exploitation/ios-exploiting/)
- [Project Zero Blog - iOS Kernel PAC](https://bazad.github.io/presentations/BlackHat-USA-2020-iOS_Kernel_PAC_One_Year_Later.pdf)
- [Apple Platform Security Guide](https://support.apple.com/guide/security/)
- [The iPhone Wiki - Kernel](https://www.theiphonewiki.com/wiki/kernel)
- [Google TAG - Intellexa Zero-Day Exploits](https://cloud.google.com/blog/topics/threat-intelligence/intellexa-zero-day-exploits-continue)

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|