ASVG: Automated Software Vulnerability Sample Generation Technology Based on Source Code

前言

这篇论文被BWCCA 2018收录,链接。这篇论文提出了基于符号执行,结合对宿主源程序的结构特点分析,找到潜在的漏洞可插入点,构建漏洞样本的自动化生成技术。目标是给目前发展迅速的Fuzzing技术(灰盒测试)提供基准测试集,助力漏洞挖掘技术的发展。论文采用开源项目作为测试目标,并使用一定的工具进行数据集的验证。

论文虽然提出了一个较为理想的方案,但是在具体执行的时候含糊其辞,有些地方可能因为操作比较困难就省略了,得到的结果也不是特别理想。但是采用符号执行进行潜在漏洞插入点的探索是值得借鉴的。

必要性与目标

  • 必要性

    目前基准测试集的来源基本上包括两个方面:一个是以NIST(SARD)为首的各大漏洞数据集,这些数据集虽然总量上看上去也不小,但是很多单个类型的数量较少,且因为简化的缘故很多程序仅仅保留漏洞的基本特征,缺乏真实性。第二个就是一些最近公开的漏洞软件集合,这种数据集漏洞数量堪忧。而且很多简单的、浅显的漏洞在这些软件中已经很少出现,Fuzzing测试越发艰难。 TaintScope和AFLFast 统一、标准的测试集是有必要的,帮助分析Fuzzing框架的优劣。自动生成的样本应该具有以下几个特点:

    • 数量大、类型多
    • 能够覆盖程序的整个生命周期
    • 尽可能与输入数据联系在一起
    • 可触发、拥有PoC样例(这个PoC不太清楚啥意思,看论文应该是P代表程序的意思,C应该Crash)
    • 不改变程序的正常功能或者原语义
    • 尽可能接近真实漏洞环境
  • 目标

    • 根据符号执行,分析给出的宿主源程序
    • 将漏洞(此处应该是漏洞模板)注入符合特殊条件的位置
    • 使用ASAN (Address Sanitizer)进行内存泄露情况的测试

过程

  • 遍历分支

    使用符号执行工具KLEE得到遍历每一个分支的INPUTS

  • 标记潜在漏洞位置

    论文认为暂时没有简单方式创建逻辑上的漏洞,所以仅仅关注三种漏洞:缓冲区溢出、整数溢出、数组边界溢出。

    • 缓冲区溢出
      • get、fgets等无限制的读取函数
      • read、scanf等函数调用时,size没有经过验证
      • 内存操纵函数比如strncpy、memcpy
    • 整数溢出
      • 有符号和无符号进行合并时

      • 整数扩展

        一个典型例子是

    • 数组边界溢出
      • 参数检查
      • 循环边界检查不正确
      • 循环边界由用户控制

    此过程分为:

    • 找敏感函数

    • 找条件语句

    • 找读写函数

    • 插入信息采集函数

      用于采集在程序运行时潜在漏洞点产生的信息,包括函数参数、涉及条件语句的变量、循环边界、输入变量等等。PS:目前不知道这个函数怎么实现的,动态分析??

  • 注入

    • 常规的改变敏感函数的变量,构造缓冲区溢出

    • 删除或者弱化条件语句的条件

    • 调整循环语句边界

      例子

  • PoC验证

    使用ASAN工具,这是一个用于内存泄漏检测的工具

  • 评估

    并没有和其他技术生成的测试集进行对比。

总结

虽然这篇论文采用符号执行进行对潜在漏洞位置的探索,但是在流程中符号执行几乎没有发挥作用,这很遗憾。