skills/mobile/ios-exploiting/SKILL.md
iOS 系统级漏洞利用方法论。涵盖 iOS 内核漏洞利用(UAF/堆溢出/类型混淆)、Safari/WebKit 漏洞利用、PAC 绕过、沙箱逃逸、Corellium 研究环境、已知 CVE 分析(CVE-2020-27950、CVE-2021-30807、iMessage 零点击)。当 Agent 需要分析 iOS 系统级漏洞、进行内核利用研究、或理解 iOS 漏洞利用链时触发。
npx skillsauth add wgpsec/AboutSecurity ios-exploitingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
阶段流: 环境准备(Corellium) → 漏洞面分析 → 内核漏洞利用 → WebKit利用 → PAC绕过 → 沙箱逃逸 → 已知CVE分析
研究环境?
├─ Corellium(云端 iOS 虚拟化)
│ ├─ 支持内核调试
│ ├─ 支持快照/回滚
│ ├─ 支持多版本 iOS 并行
│ └─ 付费,但研究价值最高
├─ 越狱真机
│ ├─ A11 以下: checkra1n(硬件级越狱)
│ ├─ 需配合 JTAG/SWD(高端研究)
│ └─ 限制: 无法调试内核启动
├─ QEMU (开源)
│ ├─ Project Sandcastle 部分支持
│ └─ 功能有限,不完整
└─ 补丁对比环境
├─ Ghidra + BinDiff
└─ 对比不同 iOS 版本 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
# 自动分析完成后可搜索函数/符号
# 定位安全补丁修改的函数
# 1. 下载漏洞版本和补丁版本的 IPSW
# 2. 提取两个 kernelcache
# 3. Ghidra 分析两个版本
# 4. 导出 BinExport: File → Export → Binary BinExport (v2) for BinDiff
# 5. BinDiff 打开 → 新建 workspace → 添加 diff
# 6. 主文件=漏洞版本,次文件=补丁版本
# 7. 关注: Changed Functions → 修改的函数即补丁位置
# iOS 版本 → XNU 版本映射
# https://www.theiphonewiki.com/wiki/kernel
# 例: iOS 15.1 → Darwin Kernel Version 21.1.0 → xnu-8019.43.1
攻击面?
├─ 远程无交互 (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 | 数组/缓冲区边界检查缺失 | 中 |
堆布局策略?
├─ 旧版 (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 利用流程:
├─ 1. 分配 IOSurface 对象
├─ 2. 获取底层物理页面引用
├─ 3. 释放 IOSurface(但保持物理页引用)
├─ 4. 物理页被回收,分配给其他内核对象
├─ 5. 通过保留的映射读写被复用的内核对象
└─ 6. 构建 kernel r/w 原语
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 利用框架特征:
├─ 可复用入口: 任何 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)
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 绕过(极难)
│ ├─ 签名 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 提供不同原语
沙箱层次:
├─ App Sandbox(最严格)
│ ├─ 文件系统: 仅访问自身容器
│ ├─ IPC: 受限的 XPC/Mach port 访问
│ ├─ 网络: 受 ATS 约束
│ └─ 逃逸路径: XPC 服务漏洞 / Mach port 操作
├─ WebContent Sandbox(Safari 渲染进程)
│ ├─ 比 App 更严格
│ ├─ 无直接文件系统访问
│ ├─ 有限的 Mach 服务列表
│ └─ 逃逸路径: 利用可达的 Mach 服务
├─ 系统服务 Sandbox
│ ├─ mediaserverd / imagent / SpringBoard
│ ├─ 各有不同权限范围
│ └─ 可作为提权中间跳板
└─ 内核 (无沙箱)
└─ 完全权限
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
└─ 更高特权级别的页表监控
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 零点击攻击面:
├─ 图片解析器: 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 |
异常触发 → 利用影响:
├─ 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 越狱 | 研究设备准备 |
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能