[Notes] Generating MP4 Files for Fuzzing

原文:Uncovering GStreamer secrets - The GitHub Blog

仓库:securitylab/Fuzzing/GStreamer at main · github/securitylab · GitHub

总结:针对多媒体文件格式 Fuzz 种子文件过大的问题,通过编程实现小型 MP4 / MKV 种子文件生成,从而大幅提升 Fuzz 速度。

搞过多媒体文件格式 Fuzz 的都知道,这玩意不比图片文件格式,很难找到合适的种子文件,笔者收集种子文件一般通过以下几种方式:

  • Google / GitHub 搜索
  • 开源项目的 Test Suite
  • Fuzzing Corpus(像 AFL 自带的,或者专门的 Repo)
  • 历史漏洞 PoC

你可能会问,可不可以 ffmpeg 转几个视频出来?理论上是可以的,但是实际效果可能不会很好。有几个问题:

  • ffmpeg 转出来的文件仍然很大,即便视频长度只有 1 秒钟,而且可能还夹杂了一些无关紧要的 Comment 内容
  • ffmpeg 转出的文件,文件结构可能都是同一个模式,代码覆盖率可能也大差不差

MP4 文件生成步骤:

  1. MP4 文件由各种 Box / Atom 组成,如果把 Box 当成一个节点,那么 MP4 文件可以当成一棵树,首先随机生成各种树(节点均为空节点)

随机生成 MP4 文件树

  1. 树的生成过程:先生成总的节点数,然后从根节点往下进行层次遍历,每一层的节点个数也是随机的,当节点数达到预期的总数时,表示树已经生成完毕

MP4 文件数生成过程

  1. 为节点关联 Box 数据:叶子节点是普通的 Box,上层的节点则是 Container(可以包含其他 Box 的 Box)

为节点关联 Box 类型

  1. 为各 Box 指定大小,可以稍微大一点,这样方便 Fuzz 的时候进行数据变异
  2. 自底向上更新各 Box 的大小,以形成一个语法上合规的 MP4 文件