2023-9-14讨论班

API Fuzz Driver Generation

Fuzz是个框架,Fuzz Driver是要测的序列,所以这里说的是对于API的Fuzz如何生成序列

Fuzzing的关键是构造Fuzz Dirver以及Input Generator

既然Fuzz需要接受输入执行代码,那如何应用到lib等API上?

  • API有依赖关系,Data、Control
  • 构建符合API语义的代码

相关工作

  • 收集用户代码片段,通过call graph构建API依赖关系

    语义更好,收集高质量较难

    • 工作1:首先由一批CFG的执行图,清除无关的api调用得到精简图,将这些图中的公共顶点合并,跑一遍DFS去除环,得到合并后的CFG图和拓扑序

    • 工作2:将用户程序抽象为自动机(程序状态点,函数调用、控制判断为边),然后简化自动机,合并啥的

      用自动机的原因是他能标识判断的多分支

  • API文档等构建依赖图,根据图游走构建序列

    覆盖更全,序列较短,语义不足

    • 工作1:期望覆盖更多API依赖图
    • 工作2:初始是单独的API node,通过mutation组装这些node

对于有复杂签名的API暂时没有好的处理方法,例如泛型函数,rust有Trait Bound,Java有基于Interface的约束,C++20有Concept约束。程序可能会生成原来库里没有的函数签名。

Solution表示一种泛型参数的取值,Match是用具体的类型匹配泛型函数,而Mono则是函数的单态化

使用其他API涉及的类型逐步推导更多的Match,然后生成所有可能的单态化函数,删除行为相同的单态化函数(行为用函数调用的方法集表示)。针对优化过的这些单态化函数进行覆盖等操作。

Generative Type Inference for Python(ASE’23)

静态类型推断——coverage比较低

有监督的类型推断:用训练的方式推断——需要大量的优质数据

利用nlp的填空模型填入模型——可解释性欠缺

TypeGen:利用大语言模型对话式地推断——可解释性变好了

  • 对象的上下文就是knowledge
    • 代码裁剪:生成对象的类型依赖图->移除和当前要分析的变量无关的变量
  • 合法类型
    • 用户定义的类型+python类型+第三方包类型(他们对top10000的第三方库建了一个数据库可以直接拿出来)
  • 用这些信息拼起来作为prompt喂给大模型

My Comment:工作量就一两周,还是故事讲得好,有一定的参考意义