记一次 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漏洞)

利用场景

  1. 构造包含特殊Type 1字体的PDF文件
  2. 在字体中设置/FDArray 0操作符
  3. 使用Adobe Acrobat Pro打开该PDF
  4. 通过"文件 > 导出为 > (封装)PostScript"触发漏洞

技术细节

  • 漏洞触发路径:CoolType.dll中的AFDKO代码
  • 崩溃发生在Acrobat.exe进程

3.2 CVE-2019-1117 (Microsoft DirectWrite漏洞)

利用场景

  1. 创建包含恶意OpenType可变字体的网页
  2. 使用Microsoft Edge打开该网页
  3. 尝试打印网页(到PDF/XPS或物理打印机)
  4. 触发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. 漏洞利用难点与限制

  1. Adobe的漏洞分类政策

    • 即使发现内存破坏类漏洞,Adobe也不为AFDKO申请CVE
    • 仅视为普通bug而非安全漏洞
  2. 实际利用挑战

    • 需要精确控制字体文件结构
    • 依赖特定软件功能(如Acrobat的导出功能或Edge的打印功能)
    • 现代系统防护机制增加了利用难度

5. 防御建议

  1. 开发者

    • 严格检查所有循环变量的范围
    • 对字体解析代码进行边界检查
    • 及时更新AFDKO到最新版本
  2. 用户

    • 保持Adobe产品和Windows系统更新
    • 谨慎处理来源不明的PDF文件和网页
    • 限制不必要的字体嵌入功能

6. 进一步研究方向

  1. 深入分析AFDKO的字体解析逻辑
  2. 探索更多集成AFDKO的软件产品
  3. 开发更高效的AFDKO fuzzing方法
  4. 研究现代防护机制下的漏洞利用技术

7. 参考资源

  1. AFDKO GitHub仓库
  2. Project Zero关于AFDKO漏洞的文章
  3. 漏洞修复commit
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 函数中发现了一个潜在无限循环问题: 问题分析 : 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示例 : 4. 漏洞利用难点与限制 Adobe的漏洞分类政策 : 即使发现内存破坏类漏洞,Adobe也不为AFDKO申请CVE 仅视为普通bug而非安全漏洞 实际利用挑战 : 需要精确控制字体文件结构 依赖特定软件功能(如Acrobat的导出功能或Edge的打印功能) 现代系统防护机制增加了利用难度 5. 防御建议 开发者 : 严格检查所有循环变量的范围 对字体解析代码进行边界检查 及时更新AFDKO到最新版本 用户 : 保持Adobe产品和Windows系统更新 谨慎处理来源不明的PDF文件和网页 限制不必要的字体嵌入功能 6. 进一步研究方向 深入分析AFDKO的字体解析逻辑 探索更多集成AFDKO的软件产品 开发更高效的AFDKO fuzzing方法 研究现代防护机制下的漏洞利用技术 7. 参考资源 AFDKO GitHub仓库 Project Zero关于AFDKO漏洞的文章 漏洞修复commit