基于VulDeePecker的智能合约检测新方法

基于VulDeePecker的智能合约检测新方法

1VulDeePecker是什么?

VulDeePecker是基于深度学习的漏洞检测系统,主要针对C/C++代码的漏洞进行检测。它提出使用code gadgets来表示程序,然后将code gadgets转换成向量输入神经网络进行学习,利用学习后的模型进行漏洞检测。

 

2VulDeePecker的方法

它提出了使用code gadgets的方法来表示程序,具体而言,是为了使深度学习适合于漏洞检测。code gadgets是由一些代码行组成的程序声明,这些代码行之间有语义相关。为了生成这些code gadgets,提出了一种key points的概念,某种程度上这些key points暗示代码中漏洞的存在。对于由于库/ API函数调用的不当使用而导致的漏洞,key point是库/ API函数调用;对于由不正确使用数组引起的漏洞,key point是数组。值得注意的是,一类漏洞可能有多种key point。例如,缓冲区错误漏洞可能对应于以下关键点:库/ API函数调用,数组和指针。 此外,多种类型的漏洞中可能存在相同类型的关键点。例如,缓冲区错误和资源管理错误漏洞都可能包含库/ API函数调用的关键点。

在VulDeePecker中,专注于使用库/ API函数调用的特定key point来证明其在基于深度学习的漏洞检测中的有用性。 而对于库/ API函数调用这个key point,code gadgets可以通过数据流程或程序的控制流程分析生成。

而基于深度学习的VulDeePecker,它分为学习阶段和检测阶段,如下图:

具体方法如下:

1. 从C/C++代码中提取出库/ API函数调用,然后对每个库/ API函数调用提取一个或多个程序片,程序片之间是有语义相关的。

2. 将多个程序片组合成一个code gadget,然后对每个code gadget标注,有漏洞的标为“1”,没有漏洞的标为“0”,作为ground truth。

3. 将code gadgets转化为特定的符号表示,旨在保存训练代码程序的语义信息,然后将这些符号表示转化为向量。

4. 向量和标注好的ground truth作为输入,使用BLSTM进行训练。

而对于特定的库/ API函数调用,这里使用了两种程序切片的方式:前向切片和后向切片。前向:库/ API函数调用是直接从外部输入接收一个或多个输入的函数调用,例如命令行,程序,套接字或文件。后向:库/ API函数调用是不直接从程序运行的环境接收任何外部输入的函数调用。文中使用后向库/ API函数调用strcpy(buf, str)为了例子进行了分析。

用户自定义的变量映射成符号名(“VAR1”,“VAR2”…),同时将用户自定义的函数映射成符号名(“FUN1”,“FUN2”)。    

每个code gadget通过其符号表示形式编码为矢量。为此,通过词法分析将符号表示中的code gadget划分为一系列token,包括标识符,关键字,运算符和符号。 例如:

“strcpy(VAR1, VAR2)”

表示一个包含7个token的序列,如下:

“strcpy”,“(”,“VAR1”,“,”,“VAR2”,“)”,“;”

为了将这些token转化为向量,这里使用了word2vec工具。而针对BSTLM只能输入固定等长向量的特性,需要做一些调整:

当向量小于固定长度时,有两种情况:如果code gadget是从后向切片生成的,或者是通过组合多个后向切片生成的,在向量的开头填充零;否则,将零填充到向量的末尾;

当向量长于固定长度时,也有两种情况:如果code gadget是从后向切片生成的,或者是通过组合多个后向切片生成的,则删除向量的开始部分;否则,删除向量的结尾部分。

而在神经网络的选择方面,确定这行代码是否存在漏洞需要依赖上下文环境。那些可以处理上下文环境的神经网络可能适合用来做漏洞检测。这条原则建议自然语言处理的神经网络可能适合用作漏洞检测。选择了双向的LSTM来进行漏洞检测。

 

3VulDeePecker的限制

VulDeePecker目前的设计,实施和评估有一些局限性。

首先,VulDeePecker的当前设计仅限于通过假设程序的源代码可用来处理漏洞检测。检测可执行文件中的漏洞是一个不同且更具挑战性的问题。

其次,VulDeePecker的当前设计仅涉及C / C ++程序。未来的研究需要使其适应其他类型的编程语言。

第三,VulDeePecker的当前设计仅处理与库/ API函数调用相关的漏洞。如何通过利用其他类型的key point来检测其他类型的漏洞是未来需要研究的方向。

第四,VulDeePecker的当前设计仅适用数据流分析(即,数据依赖性),而不适用于控制流分析(即,控制依赖性)。

第五,VulDeePecker的当前实现仅限于BLSTM神经网络。其他可用于漏洞检测的神经网络还在进行实验。

 

VulDeePecker主要提出了使用深度学习来代码审计的3个原则,code gadget概念以及VulDeePecker工具。VulDeePecker是第一个使用深度学习来进行代码审计的工具,给传统的静态代码审计提供了一个新的思路。但是同样的,数据集的优劣直接关系了漏报率和误报率,怎么样选好数据集是非常重要的一步。相对传统的方法,这是一个难点。文章对VulDeePecker的实现主要通过数据流分析来进行code gadget的生成,进一步我觉得可以对控制流分析来研究生成code gadget,并且文章的漏洞种类不多,无法确定对于其他类型的漏洞是否同样有效,需要进一步的研究。

 

4)应用于solidity智能合约漏洞检测的想法

基于VulDeePecker的想法,使用深度学习的方法对solidity智能合约的漏洞检测也是有一定的可行性的。Solidity也是一种高级程序语言,也可以用类似的方法根据key point对智能合约代码进行程序分片。

如何对智能合约代码进行分片以及如何使用code gadget表示智能合约代码?

在VulDeePecker中,主要检测的漏洞是缓冲器错误资源管理错误两种漏洞,对应于两种错误,分别有不同的key points来进行特定的程序分片和code表示,而目前VulDeePecker只针对库/API函数调用这个key point进行了实验,基于此,有如下想法:

(1)首先,Solidity与/C++还是有区别的,并且智能合约代码的漏洞与C/C++的漏洞也是不一样的,所以考虑针对某几个合约漏洞进行检测,如:整数溢出、外部调用、敏感行为、异常、逻辑顺序等,而引发这些漏洞的原因应该被仔细分析,用来作为key points对合约代码进行数据流分析,然后实现程序代码的分片和code gadget的组合。

问题:已有的solidity合约数量庞大,如何定义这些key points,使用什么样的方式进行代码数据流分析,是需要思考的地方。

(2)第二,因为智能合约代码的分析有不同之处,所以是否可以针对某一个特定漏洞(如重入漏洞)进行分析,找到有关重入漏洞的key point然后进行数据流分析。

如果是简单的代码处理,那经过深度学习后的结果肯定是不理想的,所以对于数据集的制作是至关重要的,并且数据集的选取和制作的工作量很大,需要针对特定的问题提出特定的方法。

 

VulDeePecker原文:https://arxiv.org/abs/1801.01681

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值