mcpField
I
ios-exploiting

ios-exploiting

github.com/wgpsecセキュリティ1.8k50 回インストール4 日前に更新
リポジトリ

ios-exploiting について

ios-exploitingは、iOSのセキュリティ研究者向けのシステムレベル脆弱性調査手法です。環境構築、カーネルやWebKitの攻撃連鎖、緩和策、CVE分析を段階別に整理し、各テーマのツールも参照できます。

主な機能

  1. 01仮想または脱獄済みiOS研究環境の準備
  2. 02カーネルとWebKitの攻撃面を分析
  3. 03PACとサンドボックス脱出の論点を整理
  4. 04カーネル版とセキュリティパッチを比較
  5. 05バイナリ・ランタイムツールを参照

活用シーン

  1. 01iOSカーネルの脆弱性利用連鎖を調査
  2. 02パッチ差分から変更関数を特定
  3. 03Safariからカーネルまでの段階を分析
  4. 04iOS緩和策の変遷を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wgpsec/aboutsecurity --skill ios-exploiting

インストール後、Claude Code で/ios-exploitingを入力して読み込まれたか確認します。

同梱ファイルreferences/ios-exploit-mitigations.mdreferences/ios-kernel-heap.md

詳細

iOS のシステムレベルのエクスプロイト手法

フェーズの流れ: 環境準備(Corellium) → 脆弱性の攻撃対象領域の分析 → カーネルエクスプロイト → WebKit のエクスプロイト → PAC のバイパス → サンドボックスの脱出 → 既知の CVE の分析

詳細な参考資料


Phase 0: 環境準備(Corellium)

研究環境の選択
研究环境?
├─ Corellium(云端 iOS 虚拟化)
│   ├─ 支持内核调试
│   ├─ 支持快照/回滚
│   ├─ 支持多版本 iOS 并行
│   └─ 付费,但研究价值最高
├─ 越狱真机
│   ├─ A11 以下: checkra1n(硬件级越狱)
│   ├─ 需配合 JTAG/SWD(高端研究)
│   └─ 限制: 无法调试内核启动
├─ QEMU (开源)
│   ├─ Project Sandcastle 部分支持
│   └─ 功能有限,不完整
└─ 补丁对比环境
    ├─ Ghidra + BinDiff
    └─ 对比不同 iOS 版本 kernelcache
kernelcache の抽出
# 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 によるバージョン比較
# 定位安全补丁修改的函数
# 1. 下载漏洞版本和补丁版本的 IPSW
# 2. 提取两个 kernelcache
# 3. Ghidra 分析两个版本
# 4. 导出 BinExport: File → Export → Binary BinExport (v2) for BinDiff
# 5. BinDiff 打开 → 新建 workspace → 添加 diff
# 6. 主文件=漏洞版本,次文件=补丁版本
# 7. 关注: Changed Functions → 修改的函数即补丁位置
XNU バージョンの対応関係
# 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 のゼロクリックパターン
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 の実行
ASLRiOS 4-5アドレスの予測
KASLRiOS 5-6カーネルアドレスの予測
KPP / WatchtoweriOS 9 時代、A7-A9 で一般的カーネルコードの改ざん
KTRR / KIPA10+カーネルコードページへの書き込み
PPLA12+カーネルメモリ変更保護ページ
PACA12+ (ARMv8.3)ポインターの改ざん/ROP/JOP
BTIARMv8.5+間接分岐の乗っ取り
PANARMv8.1+カーネルによるユーザーメモリへのアクセス
PXNARMv8+カーネルによるユーザーコードの実行
SPTM/TXM新しいプラットフォーム(A15+/iOS 17+ など)カーネルメモリとページテーブルの権限管理
MTE/EMTE/MIEA19+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 取证

ツール早見表

ツール用途使用場面
Ghidrakernelcache の逆コンパイルパッチの比較/関数分析
BinDiffバイナリ差分の比較セキュリティパッチの特定
CorelliumiOS 仮想化研究カーネルデバッグ/脆弱性の再現
Frida実行時の Hookユーザー空間でのエクスプロイト検証
r2fridaメモリ分析実行時のヒープ分析
jtool2 / otoolバイナリ解析Mach-O 構造の分析
img4toolIPSW 解析kernelcache の抽出
checkra1nA5-A11 の脱獄研究用デバイスの準備

参考資料

コメント