原文信息:
- 原文作者: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. 存在很大的漏报率
本文研究目标: 能够自动化探测源码中的漏洞,并找出该漏洞的位置。而且...
- 不需要太复杂的专业技巧
- 具有比较理想的误报率与漏报率
本文主要贡献 设计实现了系统:Vulnerability Deep Pecker(VulDeePecker)
- 基于深度学习设计的自动化源码审计系统
0x01 指导原则
三个基本问题: * Q1: 如何在基于深度学习的漏洞探测中表示源程序
* 能够保持代码单元之间的语义关系,包括控制流关系和数据流关系。
Q2: 什么是合适的粒度
- 比把整个程序或函数作为一个单元更好的粒度去表示程序。
Q3: 什么是合适的深度学习模型
初步选择了能够处理语义的神经网络。
不同神经网络效果的比较可作为以后的工作
0x02 VulDeePecker设计
流程图
设计思路如图所示,整个系统分为学习阶段和探测阶段两部分。
- 学习阶段大致为:
生成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
。
以上这段代码,以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
的定义后,整个流程图详细为: 在把Code Gadgets
转化为向量之前需要打上ground truth labels
,即StepII.2。 标明每一个Code Gadget
是否包含漏洞。包含已知漏洞遍标为1。 接下来便是StepIII.1:将Code Gadgets
转化为符号表示。 Simple the names in one-to-one StepIII.2:将code gadget
进行一系列预处理符号化后转化维向量形式表示。 StepIV:我们进行BLSTM
神经网络训练:
之后的略过,详见原文。
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函数调用相关的漏洞
- 只关注了数据流信息,没有关注控制流的信息