Skip to main content
QUICK REVIEW

[论文解读] Inferring Input Grammars from Dynamic Control Flow

Rahul Gopinath, Björn Mathis|arXiv (Cornell University)|Dec 12, 2019
Software Testing and Debugging Techniques参考文献 45被引用 5
一句话总结

该论文提出 Mimid,一种新颖的算法,能够从基于栈的递归下降解析器的动态控制流中推断出人类可读、准确的上下文无关文法,且不依赖数据流分析或启发式方法。该算法分析输入字符在解析器各位置的访问方式,成功恢复了 expr、URLparse 和 microJSON 等程序的文法,具有高精度与良好可读性。

ABSTRACT

A program is characterized by its input model, and a formal input model can be of use in diverse areas including vulnerability analysis, reverse engineering, fuzzing and software testing, clone detection and refactoring. Unfortunately, input models for typical programs are often unavailable or out of date. While there exist algorithms that can mine the syntactical structure of program inputs, they either produce unwieldy and incomprehensible grammars, or require heuristics that target specific parsing patterns. In this paper, we present a general algorithm that takes a program and a small set of sample inputs and automatically infers a readable context-free grammar capturing the input language of the program. We infer the syntactic input structure only by observing access of input characters at different locations of the input parser. This works on all program stack based recursive descent input parsers, including PEG and parser combinators, and can do entirely without program specific heuristics. Our Mimid prototype produced accurate and readable grammars for a variety of evaluation subjects, including expr, URLparse, and microJSON.

研究动机与目标

  • 为解决程序缺乏准确、可读且及时更新的形式化输入模型的问题,此类模型对模糊测试、逆向工程和软件测试至关重要。
  • 克服现有语法推断工具依赖数据流或启发式方法的局限性,这些方法在数据未被存储或使用常见解析模式(如 PEG 风格的备选结构)时会失效。
  • 开发一种通用的、与解析器无关的方法,仅通过递归下降解析器中的动态字符访问模式推断上下文无关文法。
  • 生成的语法不仅准确,而且可编辑、易理解,便于人类阅读,从而在程序分析与重构中实现更广泛的应用。

提出的方法

  • 该算法观察动态控制流,并通过运行时插桩记录在解析器不同位置访问的输入字符,追踪其访问模式。
  • 构建解析器的控制流图,并根据访问的顺序与上下文,将输入字符的访问映射到特定的文法规则。
  • 使用广义的树接受器算法,通过对多个访问轨迹进行泛化,识别出重复访问模式中的非终结符结构,从而推断出文法。
  • 该方法完全不依赖数据流分析,避免对变量传播或解析数据存储的依赖。
  • 通过关注访问顺序与控制结构而非数据流,该方法支持所有基于栈的递归下降解析器,包括 PEG 和解析器组合子。
  • 该方法在 Python 中实现,并集成到一个自包含的 Jupyter Notebook 中,以确保可复现性,并便于扩展至其他编程语言。

实验结果

研究问题

  • RQ1是否存在一种语法推断算法,能够在不依赖数据流分析的前提下,恢复出准确且可读的上下文无关文法?
  • RQ2此类算法是否能够泛化应用于多种输入解析器,包括 PEG 和解析器组合子,而无需依赖特定程序的启发式规则?
  • RQ3该方法在无数据流或存在复杂解析模式(如 PEG 风格的备选结构)的情况下,是否优于现有工具(如 Autogram)?
  • RQ4所推断的语法是否兼具人类可读性与精确性,从而在模糊测试、逆向工程和重构中具备实际应用价值?

主要发现

  • Mimid 在一系列程序(包括 expr、URLparse 和 microJSON)上成功推断出准确且可读的文法,未出现误报或遗漏规则。
  • 在精度与召回率方面,该方法优于 Autogram,尤其在数据流缺失或误导的场景下表现更优,例如在使用 PEG 风格回退规则的解析中。
  • 即使解析后的数据未被存储,该算法仍能正确恢复文法,证明其在缺乏数据流情况下的鲁棒性。
  • 该方法在不同输入结构上表现出良好的泛化能力,包括嵌套的 JSON 类格式与复杂的标记序列,如 microjson.py 案例研究所示。
  • microjson.py 的文法被重建为正确且人类可读的 EBNF 文法,与预期的输入语法完全匹配。

更好的研究,从现在开始

从阅读论文到最终审阅,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。