记录黑客技术中优秀的内容, 传播黑客文化,分享黑客技术精华

VulDeePecker:基于深度学习的漏洞检测系统

2018-07-27 18:15

作者:{wh1t3p1g}@ArkTeam

原文作者: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

软件漏洞自动化检测是一个重要的研究问题。然而现今的解决方案都是依赖人的经验去定义特征,这种方式会遗漏很多漏洞,有很高的漏报率。本文提出使用深度学习来进行漏洞检测,使人从繁重且主观的人为特征定义任务中解脱出去。因为深度学习所处理的问题与软件漏洞检测问题有所差距,所以作者提出了一些指导原则来将深度学习应用到漏洞检测中。特别是我们需要找到适合深度学习的程序软件的表示。为了这个目的,文章提出使用代码小工具(code gadgets,代码小工具是一系列语意相关的代码)来表示程序,然后将他们转换成向量。作者由此设计并实现了基于深度学习的漏洞检测系统,叫做vulnerability deep peckerVulDeePecker)。为了评估该工具,作者提出了第一个用于深度学习的漏洞数据集。实验结果表明,VulDeePecker可以比其他方法获得更少的假阴性(具有合理的误报)。作者进一步将VulDeepecker应用到3个软件产品并检测到了新的4个漏洞。

现今存在的解决方案存在两个缺陷:

  1. 依赖专家经验区定义特征,这是一个繁重的主观的有时候容易出错的任务
  2. 容易遗漏漏洞或高误报率

作者的工作:

  1. 为此目的讨论了一些初步指导原则,包括软件程序的表示,使深度学习适合于漏洞检测,确定应进行基于深度学习的漏洞检测的粒度,以及选择特定的神经网络用于漏洞检测。
  2. 设计并实现了一个基于深度学习的漏洞检测系统,vuldeepecker
  3. 第一个用于评估的漏洞数据集,https://github.com/CGCL-codes/VulDeePecker

一、基于深度学习的漏洞检测指导原则

指导原则主要回答了以下3个基础问题:

1.如何表示软件程序?

由于深度学习或神经网络以向量作为输入,所以需要将程序转化为有语意相关的向量。但是不能随意转化,作者提出了指导原则1: 程序先转换为保存了程序元素间(如数据依赖和控制依赖)语意关系的中间表达,然后这个中间表达可以转化为一个向量表达,作为神经网络的实际输入。

由指导原则1提出了中间表达的概念,并命名为code gadget

2.什么是合适的粒度?

由于不仅需要检测这个程序是否存在漏洞,还要定位到具体漏洞的位置,所以需要一个合适的粒度来进行检测,作者提出了指导原则2:为了帮助确定漏洞位置,程序应该以一个合适的粒度来表达,而非一个程序或一个函数作为一个单元。

3. 如何选择神经网络?

神经网络在图像处理、语言识别和自然语言处理领域非常成功,但是不同于漏洞检测,这意味着许多神经网络不适合漏洞检测,作者提出了指导原则3:确定这行代码是否存在漏洞需要依赖上下文环境。那些可以处理上下文环境的神经网络可能适合用来做漏洞检测。

这条原则建议自然语言处理的神经网络可能适合用作漏洞检测。作者经过比对,选择了双向的LSTM来进行漏洞检测。


二、VulDeePecker的设计

1.定义code gadget

code gadget由许多程序语句组成,他们在数据依赖或控制依赖方面的语义上彼此相关。为了产生code gadget,作者提出key point这个启发性的概念。Key point指代那些不正确的使用所造成漏洞的库/API函数。需要注意的是一种类型的漏洞可能有多种key point。同时同样类型的key point可能存在于多种类型的漏洞中。对应于库/ API函数调用的key pointcode gadget可以通过数据流或程序的控制流分析来生成,其中存在众所周知的算法和易于使用的商业产品,例如Checkmarx

2.VulDeePecker的概述

学习阶段:

提取库/API函数调用和相应的程序切片

  1. 生成训练程序的code gadget和他们的基本事实标签,如下图所示,label1为存在漏洞,0为不存在漏洞
  2. code gadget转化为向量表达
  3. 训练BLSTM神经网络


检测阶段:

  1. 将目标程序转化为code gadgets和向量W
  2. 使用训练好的模型检测


关于上述的详细过程可看论文,由于篇幅这里不再详述。

为了评估该工具是否更具有效性,作者选取了大量存在漏洞的程序,如有一个或多个CVE号的程序。按照学习阶段的123,作者生成了一个Code Gadget Database,共48744个用作训练,12894个用作检测。文章主要针对缓冲器错误和资源管理错误这两个漏洞,评估同3个同类型不同方法的工具做比较,可以发现基于深度学习的系统更有效。


三、讨论

文章主要提出了使用深度学习来代码审计的3个原则,code gadget这个概念以及VulDeePecker这个工具。这个工具是第一个使用深度学习来进行代码审计的工具,给我们传统的静态代码审计提供了一个新的思路。

但是同样的,数据集的优劣直接关系了漏报率和误报率,怎么样选好数据集是非常重要的一步。相对传统的方法,这是一个难点。文章对VulDeePecker的实现主要通过数据流分析来进行code gadget的生成,进一步我觉得可以对控制流分析来研究生成code gadget,并且文章的漏洞种类不多,无法确定对于其他类型的漏洞是否同样有效,需要进一步的研究。

知识来源: www.arkteam.net/?p=3928

阅读:142492 | 评论:0 | 标签:ArkDemy 论文笔记 漏洞

想收藏或者和大家分享这篇好文章→复制链接地址

“VulDeePecker:基于深度学习的漏洞检测系统”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

关注公众号hackdig,学习最新黑客技术

推广

工具

标签云

本页关键词