针对 CVE-2026-64747 的根因分析和 macOS 可达性概念验证,该漏洞是 AppleAVE2 视频编码器内核扩展(com.apple.driver.AppleAVE2)中的缓冲区溢出,已在 macOS 26.6(kext 905.40.1)中修复。
AppleAVE2 — 影响:应用或许能够以内核权限执行任意代码。编码器工作缓冲区大小计算中的缓冲区溢出已通过改进的边界检查得到解决。
本仓库记录了 AppleAVE2UserClient 的完全逆向 IOKit 线协议(创建会话 → 配置 → 逐帧处理)、精确溢出位置(HEVC 10 位多通道路径中的 32 位 LRB 工作缓冲区大小计算器),以及一个用户态 PoC,该 PoC 打开用户客户端、驱动配置路径通过内核的验证栈,并演示易受攻击版本(905.36.1)与修复版本(905.40.1)之间的差异。
层级(如实说明):可达性 + 完整协议逆向 + 分析证明的溢出数学。非 RCE,未演示实际溢出 — 实验室主机运行的是修复后的 kext,且硬件能力门(两个版本均存在)会在易受攻击的计算器运行之前拒绝溢出的尺寸。触发溢出需要一个能力表允许所需尺寸的目标(参见 FIRE_READY.md §5-6)。
| 文件 | 说明 |
|---|
poc_ave2_reach.c | IOKit 用户态 PoC:打开 AppleAVE2UserClient,创建会话,使用逆向结构体驱动配置。无需权限。 |
ave2_wire.h | 逆向线格式:选择器编号、结构体大小以及每个重要的字段偏移(宽/高、encType、views/layers、chroma、位深) |
WIRE_FORMAT.md | 线格式参考:调度表布局、PAC 怪癖、各选择器契约 |
FIRE_READY.md | 溢出数学(模式 5 LRB 计算器)、触发溢出的精确输入、补丁主机运行证据以及剩余未知项 |
evidence/ | 补丁主机运行时的 ioreg 捕获 + 内核日志(验证栈推进) |
clang -O0 -g -arch arm64 -framework IOKit -framework CoreFoundation \
-o poc_ave2_reach poc_ave2_reach.c
./poc_ave2_reach # 无需 root;服务可从用户上下文打开
AppleAVE2 的编码器使用 32 位算术计算 LRB(旁路参考缓冲区)工作缓冲区大小,且无溢出检查。在 HEVC 10 位多通道路径(以 param_2 = 5 调用计算器)中,诸如 64656×8080 的尺寸(通过驱动程序的 w*h ≤ 0x1FFE0000 限制检查)会使分量和达到 0x80000000 — 符号位被置位。易受攻击的计算器返回裸 32 位和;该大小在下游被当作负数处理,分配了过小的 DART/IOMMU 缓冲区,编码器 DMA 写入超出其范围 → 内核堆/DART 损坏 → 内核代码执行。修复后的计算器增加了逐分量符号检查和 64 位和检查,并记录 LRB size overflow。
__const 节解码的调度表(行步长 0x18 = {func, inSize<<32, outSize<<32},带有 PAC 指针怪癖)。IOServiceOpen 必须使用 type=1(type=0 → 创建被拒绝)。IOConnectCallAsyncStructMethod(同步路径在验证前的 IO_Config:337 门处被拒绝)。用于教育和防御性研究目的。该漏洞已在当前 macOS 中修复;仅在您拥有的硬件上测试。