uvuldeepecker

μvuldeepecker:A Deep Learning-Based System for Multiclass Vulnerability Detection

对vuldeepecker的一个改进,多分类的漏洞检测系统。

  1. 提出了code attention的概念在code gadget 上的一个改进。

  2. 在原来的数据流依赖产生的code gadget上,加入了控制流依赖

  3. 提出了一种新的漏洞检测的网络结构

https://github.com/muVulDeePecker/muVulDeePecker

作者对几个重要的概念进行了说明。

  1. 对于程序P,可以写成按照一定顺序组成的语句集合{p1, p2, . . . , pε};而对于一条语句pi,可以写成按照一定顺序组成的token集合。

  2. 数据流依赖。如果某个变量token属于某个语句pi,然后pi又在语句pu中被使用,那么就说pu与pi的那个变量token有数据流依赖关系

  3. 控制流依赖。对于两个语句pi,pj,如果只有当pi执行完后,pj才能执行,那么就说pj控制流依赖于pi。

  4. code gadget。对于某个程序P={p1, p2, . . . , pε},其中某个语句pv有个库函数/API调用f,那么与f相关的code gadget是一个有序的程序语句集合,这些语句要么与f有数据流依赖关系,要么与f所在的语句有控制流依赖关系。

  5. code attention。作者还定义了一些 vulnerability syntax characteristic,与相应的code gadget对应的code attention是code gadget的子集,这些语句满足定义的这些vulnerability syntax characteristic规则。

overview of μvuldeepecker

  1. 从程序源代码中生成code gadgets。

    1.1 首先生成SDGs(system dependency graph),这是PDGs(program dependency graph)的组合,包括了数据流依赖和控制流依赖。一个节点是一个函数语句。

    1.2 然后在图的节点中识别出 library/API 函数调用(目前作者只考虑了这种情况)。主要是将节点中的函数调用与已知的library/API 函数调用进行匹配得到。

    1.3 从前向和后向切片中都提取出与 library/API 函数调用相关的(如何前向后向切)

    ​ 作者对比了vuldeepecker中的对前后向切片的切法。在vuldeepecker中,将函数分成forward functions(接收外部输入),backward functions(不接收外部输入)。然后只从forward function中提取forward slice,只从backward function中提取backward slice。在μvuldeepecker中,对所有的函数都考虑forward slice 和backward slice。

    ​ 举了两个例子。forward function:scanf()。这个是获取输入的函数,很显然参数是在此函数被调用之前,但如果按照forward function 只能切 forward slice那么这个切片就会将之前的参数漏了。backword function:malloc(),这个是函数是backward function,因此只能在backward进行切片。那么被分配的这些内存,只能再forward 才能被用,这样又遗漏掉了。所以,不对函数类型进行区分,只要是API或者库函数调用,都进行forward slice 和 backward slice 考虑控制流依赖和数据流依赖。

    ​ 算法如下。

    ​ 输入是和包含库函数/API调用函数语句的相关节点,以及函数调用的参数集合。

    ​ 输出是与此库函数/API函数调用相关的code gadget

    ​ 获取前向切片:get_for_slice(函数参数的token,参照节点n,前向切片集合),这个函数是个递归函数。

    ​ 对节点n的所有前向节点进行遍历,当发现有节点与函数参数的token有数据流依赖关系,与节点n(表示的函数语句)有控制流依赖关系,那么此节点满足条件前向code gadget的条件,将此节点加入前向切片集合,同时用此节点替换参照节点n(这样替换还可以解决了隐式控制流依赖问题),重复上述操作直到完成整个搜索。

    ​ 同理获取后向切片。然后将两者获取的切片进行整合成code gadget。

  2. 对生成的code gadget进行标签。

    “0”表示没有漏洞,“i”表示漏洞的类型type-i

  3. 对code gadget进行归一化。

    由于变量名,函数名由于不同的编程习惯,风格各异这会影响检测效果。

    将相同的变量和函数都映射成同一个标识符,即varb_0,varb_1,func_0,func_1之类的。

    对于一些保留字,库函数/API进行保留。

  4. 根据vulnerability syntax characteristic,将code gadget转换成code attention

    4.1 库函数/API 中的参数的声明。这些参数的类型和大小是否会对被调函数有影响,造成不恰当的调用。

    4.2 条件语句。bounds-checking and security screening 这可以进行安全边界检查

    4.3 包含库函数/API的语句

    实现上述三条规则的匹配算法如下:

    将code gadget中的每条语句进行如下循环遍历。首先将程序语句解析成token序列,对于上述的三条规则进行逐一验证。(在文中,作者是将程序语句解析出来的每个token都进行验证,这个没搞懂什么意思?

  5. 分别将code gadget 和 code attention都通过词嵌入的方式映射成相同长度的向量。

  6. 构建神经网络。

    用BLSTM作为网络的主要结构,然后可以分为三个部分。一是学习global feature的部分,这是将code gadget作为输入;二个是学习local feature的部分,这是将code attention作为输入;三是融合特征部分,这个部分将之前的global feature和local feature的输出进行融合,然后再输入分类器。

    训练的时候先训练学习global feature 和 local feature两个部分,然后再学习最后的分类器。

数据集

从 SARD(software assurance reference dataset)和 NVD(national vulnerability database)。总共涉及到116中CWE漏洞类型的编号,但是由于有些漏洞类型编号会有包含关系比如(CWE-121包含CWE-787和CWE-788)。对这些漏洞类型都用第三级的编号作为漏洞类型编号比如CWE-119已经是第三级编号,它后面的CWE-121的漏洞类型编号就用CWE-119来代替。总共label了40个类型。

33409 SARD(57 good + 925 bad + 32104 mix) + 323 NVD(bad)

具体实现

  1. 用工具 Joern 对每个程序构建PDGs,然后生成SDG。库函数/API的匹配库 共有881个,可以从Checkmarx中获取。

  2. 如何对code gadget进行标记,如果code gadget中包含有vulnerable statement那么code gadget就根据漏洞类型进行标记,如果不包括vulnerable statement那么就标记为0。对于SARD中的数据,这些是直接有标出了的vulnerable statement,可以直接获取;对于NVD中的数据,这些需要将patch前后的比对就知道vulnerable statemet。

  3. 对于每个code gadget,通过分析每个statement的token来进行归一化,并提取出 code attention。

  4. 将归一化后的code gadget,序列化成token的形式生成语料库。(这里还是有个疑问就是归一化后的token中的函数名,变量名这些作为语料怎么表示?)。用Word2vec方法(Skip-gram)进行词嵌入,窗口大小是10,向量维度50。

    对于code gadget和code attention的向量长度还是通过“多退少补”的方式来进行预处理。

  5. 在神经网络训练调参时,作者首先训练global-model,local-model来调整超参数(通过grid search的方法,这里的loss是怎么设定的,直接分别将输出与最后的结果对应吗)。然后将调整好的超参数固定与后面的融合网络结合,这时候固定住global和local两个模型的超参数,然后对fusion-model调整超参数。即作者说的对上述三个网络分别进行训练。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ce2NYMe-1594777368228)(C:\Users\khy\AppData\Roaming\Typora\typora-user-images\image-20200310153503785.png)]

  6. 体提取出来181641 code gadgets。因为从提取code gadget的算法我们可以知道,在同一个程序中,每种API/库函数调用是可以生成一种code gadget,所以虽然漏洞程序少,但实际上生成的code gadget是很多的。code attention数量是和code gadget一样的。

vulnerablenon-vulnerable
42,795(SARD)+324(NVD)=43,119132,620(SARD)+5,902(NVD)=138,522
  1. 对最后结果的评估是用了两种平均的估计。

一种是对漏洞种类的平均,即不考虑每种漏洞的数量,只考虑漏洞种类的数量,然后对种类取平均,每类漏洞的权重是一样的。

二种是对漏洞的数量取平均,即乘上每种漏洞的数量作为其权重值。

vuldeepecker+是直接将vuldeepecker后面接上多分类的任务。

对漏洞的数量取平均,即乘上每种漏洞的数量作为其权重值。

vuldeepecker+是直接将vuldeepecker后面接上多分类的任务。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值