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子表,配合混合操作码参数可精确控制写入值。
关键调试过程:
- 在libFontParser.dylib设置断点(0x01ED2B和0x1EE67)
- 观察RAX寄存器指向CharString堆栈地址
- 执行
sub rax,rsi
后堆栈缓冲区指向其他TCharString成员 - 最终实现每次4字节的任意写入
结论
该字体引擎漏洞影响Windows/Linux/macOS等多平台,建议用户升级至macOS 10.15.5和iOS 13.5.1以上版本。研究人员可基于此漏洞编写完整利用链。
延伸阅读
- OpenType字体规范
- CFF格式手册
- CFF2规范
- CFF2 Charstring说明
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码