macOS/iOS字体解析漏洞分析:CFF2混合操作码导致越界访问

漏洞根源

半年前,我在广泛用于macOS/iOS/iPadOS字体解析的CoreGraphics库组件libFontParser.dylib中发现漏洞。该漏洞存在于处理CFF2字体Charstring的混合操作码(blend opcode)时,具体位置在TType1FontType2CharStringHandler::InterpreteCharString函数中。

OpenType字体包含两种基于字体设计的操作码:CFF(Compact Font Format)和其扩展CFF2。漏洞触发时存在以下关键参数:

  • n_blend:从堆栈弹出的最后一个值
  • k:攻击者可控制的数值
  • nargs_left:nargs - 1(排除已弹出的n_blend)

根据OTF-CFF2规范,混合参数应通过公式n_blend * k + n_blend计算,但实际汇编代码仅检查v2 = n_blend * k,随后通过buffer = (signed __int64)&stack[-v103]获取堆栈指针时产生越界访问。

漏洞验证

通过构造包含下列操作码的恶意OTF字体:

<示例恶意操作码>

生成PDF文件用Preview打开后立即崩溃,调试显示ItemVariationStore::ValueFromBlendRequest函数的返回值(eax)可被攻击者控制。通过修改CFF2表中的VarRegionList子表,配合混合操作码参数可精确控制写入值。

关键调试过程:

  1. 在libFontParser.dylib设置断点(0x01ED2B和0x1EE67)
  2. 观察RAX寄存器指向CharString堆栈地址
  3. 执行sub rax,rsi后堆栈缓冲区指向其他TCharString成员
  4. 最终实现每次4字节的任意写入

结论

该字体引擎漏洞影响Windows/Linux/macOS等多平台,建议用户升级至macOS 10.15.5和iOS 13.5.1以上版本。研究人员可基于此漏洞编写完整利用链。

延伸阅读

posted @ 2025-08-16 12:03  qife  阅读(23)  评论(0)    收藏  举报