记一次 afdko fuzzing
字数 1306 2025-08-26 22:11:14
AFDKO Fuzzing 与漏洞分析技术文档
1. AFDKO 简介
AFDKO (Adobe Font Development Kit for OpenType) 是Adobe开发的用于创建和修改OpenType字体的工具包。其核心功能用C语言实现,被多个主流软件产品集成使用,包括:
- Adobe Acrobat (通过CoolType.dll)
- Microsoft DirectWrite (Windows文本渲染引擎)
2. Fuzzing 方法与发现
2.1 Fuzzing 准备
- 参考资源:xinali、Project Zero的分析文章
- 工具:AFL (American Fuzzy Lop)模糊测试工具
- 目标:AFDKO的C语言实现部分
2.2 发现的Hang问题
在buildGIDNames函数中发现了一个潜在无限循环问题:
1906 static void buildGIDNames(cfrCtx h) {
1907 char *p;
1908 long length;
1909 long numGlyphs = h->glyphs.cnt;
1910 unsigned short i; // 问题点:unsigned short最大65535
1911
1912 if (numGlyphs <= 0)
1913 fatal(h, cfrErrNoGlyph);
1914 dnaSET_CNT(h->post.fmt2.glyphNameIndex, numGlyphs);
1915 for (i = 0; i < numGlyphs; i++) { // 当numGlyphs>65535时无限循环
1916 h->post.fmt2.glyphNameIndex.array[i] = i;
1917 }
问题分析:
numGlyphs是long类型,可以大于65535- 循环变量
i是unsigned short类型,最大值65535 - 当
numGlyphs > 65535时,i会从65535回绕到0,导致无限循环
修复方案:
Adobe通过commit e4c023d将循环变量类型改为long
3. 相关CVE漏洞分析
3.1 CVE-2019-8017 (Adobe Acrobat漏洞)
利用场景:
- 构造包含特殊Type 1字体的PDF文件
- 在字体中设置
/FDArray 0操作符 - 使用Adobe Acrobat Pro打开该PDF
- 通过"文件 > 导出为 > (封装)PostScript"触发漏洞
技术细节:
- 漏洞触发路径:CoolType.dll中的AFDKO代码
- 崩溃发生在Acrobat.exe进程
3.2 CVE-2019-1117 (Microsoft DirectWrite漏洞)
利用场景:
- 创建包含恶意OpenType可变字体的网页
- 使用Microsoft Edge打开该网页
- 尝试打印网页(到PDF/XPS或物理打印机)
- 触发DirectWrite中的AFDKO代码执行
PoC HTML示例:
<html>
<head>
<style>
@font-face { font-family: custom_font; font-weight: 1000; src: url('poc.otf'); }
h1 {
font-family: custom_font
}
</style>
</head>
<body>
<h1>The quick brown fox jumps over the lazy dog.</h1>
</body>
</html>
4. 漏洞利用难点与限制
-
Adobe的漏洞分类政策:
- 即使发现内存破坏类漏洞,Adobe也不为AFDKO申请CVE
- 仅视为普通bug而非安全漏洞
-
实际利用挑战:
- 需要精确控制字体文件结构
- 依赖特定软件功能(如Acrobat的导出功能或Edge的打印功能)
- 现代系统防护机制增加了利用难度
5. 防御建议
-
开发者:
- 严格检查所有循环变量的范围
- 对字体解析代码进行边界检查
- 及时更新AFDKO到最新版本
-
用户:
- 保持Adobe产品和Windows系统更新
- 谨慎处理来源不明的PDF文件和网页
- 限制不必要的字体嵌入功能
6. 进一步研究方向
- 深入分析AFDKO的字体解析逻辑
- 探索更多集成AFDKO的软件产品
- 开发更高效的AFDKO fuzzing方法
- 研究现代防护机制下的漏洞利用技术