Skip to main content

ios-exploiting

iOS 系统级漏洞利用方法论。涵盖 iOS 内核漏洞利用(UAF/堆溢出/类型混淆)、Safari/WebKit 漏洞利用、PAC 绕过、沙箱逃逸、Corellium 研究环境、已知 CVE 分析(CVE-2020-27950、CVE-2021-30807、iMessage 零点击)。当 Agent 需要分析 iOS 系统级漏洞、进行内核利用研究、或理解 iOS 漏洞利用链时触发。

来源信息

仓库
wgpsec/AboutSecurity
最近来源活动
2026年10月15日 06:58
检测到的 SKILL.md 语言
中文
星标
1,790
分支
248

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
3 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
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 / Watchtower | iOS 9 时代,A7-A9 常见 | 内核代码篡改 | | KTRR / KIP | A10+ | 内核代码页写入 | | PPL | A12+ | 内核内存修改保护页 | | PAC | A12+ (ARMv8.3) | 指针篡改/ROP/JOP | | BTI | ARMv8.5+ | 间接分支劫持 | | PAN | ARMv8.1+ | 内核访问用户内存 | | PXN | ARMv8+ | 内核执行用户代码 | | SPTM/TXM | 较新平台(如 A15+ / iOS 17+) | 内核内存与页表权限管理 | | 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)
在 GitHub 查看