论文:VulDeePecker

原文信息:

  • 原文作者:Zhen Li, Deqing Zou, Shouhuai Xu, Xinyu Ou, Hai Jin,Sujuan Wang, Zhijun Deng and Yuyi Zhong
  • 原文标题:VulDeePecker: A Deep Learning-Based System for Vulnerability Detection
  • 原文会议:the 25th Annual Network and Distributed System Security Symposium, NDSS 2018
  • 原文链接:https://www.ndss-symposium.org/wp-content/uploads/sites/25/2018/02/ndss2018_03A-2_Li_paper.pdf

目标: 自动化静态漏洞探测技术

当前面临的问题: 1. 依赖专业人员配置 2. 存在很大的漏报率 1

本文研究目标: 能够自动化探测源码中的漏洞,并找出该漏洞的位置。而且...

  • 不需要太复杂的专业技巧
  • 具有比较理想的误报率与漏报率

本文主要贡献 设计实现了系统:Vulnerability Deep Pecker(VulDeePecker) - 基于深度学习设计的自动化源码审计系统

0x01 指导原则

三个基本问题: * Q1: 如何在基于深度学习的漏洞探测中表示源程序

* 能够保持代码单元之间的语义关系,包括控制流关系和数据流关系。
  • Q2: 什么是合适的粒度

    • 比把整个程序或函数作为一个单元更好的粒度去表示程序。
  • Q3: 什么是合适的深度学习模型

    • 初步选择了能够处理语义的神经网络。

    • 2 不同神经网络效果的比较可作为以后的工作

0x02 VulDeePecker设计

流程图 3

设计思路如图所示,整个系统分为学习阶段和探测阶段两部分。

  • 学习阶段大致为: 生成code gadgets =>打上ground truth labels=>转化为向量 =>训练神经网络 以下是设计细节。

流程介绍 * 为了解决指导原则中的Q1:需要源程序转化为能够输入神经网络的向量,且保持源程序中的控制依赖和数据依赖关系。因此需要设计了一种中间形式,来作为源程序与向量之间的过渡。 * 为了解决指导原则中的Q2:需要找到合适的粒度,使得这种形式成能够更好的表述漏洞位置(程序级或函数级划分粒度过粗)。 本文借鉴了代码复用攻击中的gadget提出了一种code gadget来作为这种中间形式。那么如何划分code gadget,本文提出一种启发式的key point,通过找到key point很自然的从源码中划提取出需要的code gadget来。key point的依据是漏洞点。

如果源码中的漏洞是由于不安全地调用library/API函数引起的,那么这次函数调用便是key point,如果源码中的漏洞是由不安全地使用数组引起,那么这个数组就是key point

4

以上这段代码,以library/API调用为key point,从中获取第9行(StepI.1),然后根据第9行调用中的两个参数buf,str分别跟踪生成两组切片(StepI.2)。并在生成code gadgets时进行组合(StepII.1)。 >这里的backward function指的是函数不需要直接地外部输入即可调用。此处的strcpy属于一个backward function,需要进行向后切片,即backward slices >

经过Code Gadget的定义后,整个流程图详细为: 5 在把Code Gadgets转化为向量之前需要打上ground truth labels,即StepII.2。 6 标明每一个Code Gadget是否包含漏洞。包含已知漏洞遍标为1。 接下来便是StepIII.1:将Code Gadgets转化为符号表示。 7 Simple the names in one-to-one StepIII.2:将code gadget进行一系列预处理符号化后转化维向量形式表示。 8 StepIV:我们进行BLSTM神经网络训练: 9

之后的略过,详见原文。

0x03 实验与结论

需要得出的结论: 1. VulDeePecker能不能同时处理多种类型的漏洞 2. VulDeePecker能不能通过人力改善效果 3. VulDeePecker与其他工具相比效果如何

  • 训练平台:
训练模型 BLSTM
软件 Theano、Keras
硬件 NVIDIA GeForce GTX 1080 GPU Intel Xeon E5-1620 CPU
  • 漏洞信息: 19个C/C++开源产品在NVD中的漏洞描述信息,在SARD的测试案例。

  • 训练资源:

漏洞类型 收集资源
buffer error vulnerability(i.e.,CWE-119) 520个开源程序文件,8122个测试案例
resource management error vulnerability(i.e.,CWE-399) 320个开源程序文件,1729个测试案例

实验结果不在赘述,感兴趣的话详见原文。

0x04 后记

  • 只关注了c/c++语言
    • 只关注了library/API函数调用相关的漏洞
    • 只关注了数据流信息,没有关注控制流的信息