一种基于人工智能的智能合约安全漏洞挖掘方法及***
技术领域
本公开涉及人工智能和智能合约领域,具体涉及一种基于人工智能的智能合约安全漏洞挖掘方法,适用于以太坊智能合约的漏洞的发现和预警。
背景技术
区块链作为一种去中心化的共识体系,在诸多领域传统依赖于中心化信任机构的***中得到了广泛的应用。以太坊作为区块链2.0的开拓者,目前拥有全球最大的区块链开源平台和社区,可提供开发人员编写自己的区块链规则和分布式账本。以太坊把这种技术命名为智能合约。智能合约是运行在区块链上的一段代码,这段代码规定了该区块链上的交易规则,所以在这个链上的节点都必须无条件地遵循这个规则来进行交易。因此,智能合约的编写安全尤为重要,一旦不小心出现逻辑错误和安全漏洞,将有可能导致不可挽回的巨大损失。据此,本公开提供一种基于人工智能算法的根据智能合约字节码(bytecode)做漏洞挖掘的方法,提醒开发人员潜在的风险,使得开发人员有效地规避风险。
因为智能合约是一个新兴领域,目前对于智能合约自动化漏洞检测的方法尚不多。当前对于智能合约的主要是有两类方法:对智能合约的字节码/源代码基于代码静态分析方法(包括基于规则逻辑检测、符号执行、污点追踪等算法)发现安全漏洞,另一种是使用形式化证明的方法对智能合约从数学上通过枚举形式化证明其安全性。
当前的这些针对智能合约检测的方法存在以下几点致命的缺陷,使得他们离真正广泛地部署还要相当远的距离:
对于基于代码静态分析挖掘漏洞的方法,往往需要安全人员手动去定义规则。这些逻辑规则繁多复杂,人手定义很容易出现疏漏,如果出现疏漏,即便是静态分析方法完全正确,也会造成安全漏洞的忽视;
(2)对于基于代码静态分析挖掘漏洞的方法,需要大量的人工手动干预,使得其无法被大规模自动化地使用;
(3)当前形式化证明的方法不能从真正意义上证明一个智能合约的安全,因为根据形式化证明的要求,一个***被证明是安全的必须它所有的有关联的代码都需要证明,因此如果要用形式化证明,需要把整个以太坊***从底层到上层的每一行代码进行验证,而且每次改动都需要全盘重新验证,目前这种方法是不现实的;
(4)当前的所有方法都缺乏智能的特性,也就是他们都只能对固定的规则进行检测,不具有进化和学习的功能,遇到新的安全漏洞不懂得重新学习。
发明内容
本公开提供一种基于人工智能的智能合约安全漏洞挖掘方法及***,通过提出一种基于人工智能的智能合约安全漏洞挖掘方法,从而更智能更自动化保证智能合约的安全。
为了实现上述目的,根据本公开的一方面,提供一种基于人工智能的智能合约安全漏洞挖掘方法,所述方法包括以下步骤:
步骤1,智能合约安全漏洞挖掘***读取待验证的智能合约的二进制代码;
步骤2,启动字节码控制流图生成模块,将待验证的智能合约的二进制代码作为该模块的输入,字节码控制流图生成模块通过字节码解析器将二进制代码反汇编转换成智能合约字节码转成智能合约字节码;
步骤3,字节码控制流图生成模块按照智能合约字节码跳转指令字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图,该有向图即为该智能合约字节码的控制流图;
步骤4,启动特征提取模块,将字节码的控制流图作为该模块的输入;
步骤5,特征提取模块将控制流图中每个节点的提取m个特征,假设控制流图总共有n个节点,最终该模块将生成n*m的特征矩阵;
步骤6,启动深度学习决策模块,将n*m特征矩阵作为该模块输入。该模块将矩阵分别输入模块中的深度学习模型中,每个模型给出一个k维向量,k是总共可能漏洞的总数。向量中每个元素为[0,1]中的一个分数,表示该智能合约存在某个特定漏洞的概率;
步骤7,深度学习决策模块统计深度学习的决策概率,并整合成一个总概率,输出给用户,提醒用户可能存在的安全漏洞;
步骤8,启动深度学习可解释性模块对深度学习决策模块所有的深度学习模型做可解释性分析并展示给用户,如果用户觉得某个深度学习模型中某个参数不合理,可以进行手动修改;
步骤9,当用户手动修改后,深度学习可解释性模块记录下用户修改的结果,将结果输入到给深度学习决策模块进行再训练。
进一步地,在步骤1中,所述智能合约安全漏洞挖掘***包括字节码控制流图(CFG)生成模块、特征提取模块、深度学习决策模块及深度学习可解释性(XAI)模块。
进一步地,在步骤1中,所述待验证的智能合约的二进制代码是通过EVM编译器编译该智能合约的solidity源代码生成的,由用户提供。
进一步地,在步骤2中,所述字节码控制流图生成模块用于将一段智能合约字节码转换成字节码控制流图。因为智能合约的二进制代码和传统意义上的基于指令集的二进制代码(如x86/x64、ARM、MIPS、RISC-V等)有很大的区别,因此该模块需要先调用字节码解析器,将智能合约的二进制按照智能合约指令集进行反汇编,变成智能合约汇编。之后,该模块再按照智能合约字节码跳转指令(如jump、jumpdest)等将字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图(directed graph),源和目标代码块作为有向图的节点,跳转的指令作为有向图的边,该有向图即为该智能合约字节码的控制流图。
进一步地,在步骤3中,所述智能合约字节码跳转指令包括但不限于jump、jumpdest、jumpi、return,revert、fall to、push1、switch。
进一步地,在步骤4中,所述特征提取模块用于对字节码控制流图提取特征,因为字节码控制流图中每个节点都是一个字节码代码段,含有多个的指令,因此具有相当丰富的信息,即指令数、算数指令数、存储指令数、读取指令数等,该特征提取模块的人物就是需要把这些节选这些丰富的信息作为特征转换成特征向量或特征矩阵,并将这些特征向量和特征举证作为输入传给深度学习决策模块,让深度学习决策模块做出决策。
进一步地,在步骤5中,所述控制流图中每个节点为跳转的指令的源和目标代码块。
进一步地,在步骤5中,所述特征包括但不仅限于指令数、算数指令数、存储指令数、读取指令数等。
进一步地,在步骤6中,所述深度学***均等等。
进一步地,在步骤7中,所述深度学习的决策概率为各深度学习模型结合搜索算法进行深度学习获得的判断结果,即智能合约存在各深度学习模型相对应的各种特定漏洞的概率。
进一步地,在步骤8中,所述深度学习可解释性模块的主要功能是为了更好地把深度学习决策模块中的深度学习模型的决策过程呈献给用户,并允许用户对其中的决策过程进行调整,调整后的数据会返回到深度学习决策模块再训练,从而使得整个决策过程更透明,决策结果更准确,其中,可解释性算法包括但不限于决策树和随机森林,或可视化决策树。
本发明还提供了一种基于人工智能的智能合约安全漏洞挖掘***,所述***包括:存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序运行在智能合约安全漏洞挖掘***的字节码控制流图生成模块、特征提取模块、深度学习决策模块及深度学习可解释性模块的各自单元中,
其中,字节码控制流图生成模块,包括以下单元:
智能合约反汇编单元,用于读取待验证的智能合约的二进制代码,并通过字节码解析器将二进制代码反汇编转换成智能合约字节码转成智能合约字节码;
控制流图生成单元,用于字节码控制流图生成模块按照智能合约字节码跳转指令字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图,该有向图即为该智能合约字节码的控制流图;
其中,特征提取模块,包括以下单元:
特征提取单元,用于特征提取模块将控制流图中每个节点的提取m个特征;
其中,深度学习决策模块,包括以下单元:
深度学习单元,用于将n*m特征矩阵作为该模块输入,该模块将矩阵分别输入模块中的深度学习模型中,每个模型给出一个k维向量,k是总共可能漏洞的总数,向量中每个元素为[0,1]中的一个分数,表示该智能合约存在某个特定漏洞的概率;
决策统计输出单元,用于统计深度学习的决策概率,并整合成一个总概率,输出给用户,提醒用户可能存在的安全漏洞;
其中,深度学习可解释性模块,包括以下单元:
可解释性分析单元,用于对深度学习决策模块所有的深度学习模型做可解释性分析并展示给用户,并可以进行手动修改模型的参数;
再训练单元,用于当用户手动修改后,深度学习可解释性模块记录下用户修改的结果,将结果输入到给深度学习决策模块进行再训练。
本公开的有益效果为:本发明提供一种基于人工智能的智能合约安全漏洞挖掘方法及***,可以极大地减少人工干预成本,最大程度地避免其他防御中人工干预出错对安全漏洞检测的疏忽;本公开的技术可以大范围地运用在产业界平台;本公开的技术具有智能学习功能,在发现新型漏洞样本的时候,可以快速学习漏洞样本的特征,从而避免漏洞的大范围扩散。
附图说明
通过对结合附图所示出的实施方式进行详细说明,本公开的上述以及其他特征将更加明显,本公开附图中相同的参考标号表示相同或相似的元素,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图,在附图中:
图1所示为一种基于人工智能的智能合约安全漏洞挖掘方法的流程图;
图2所示为一种基于人工智能的智能合约安全漏洞挖掘***图。
具体实施方式
以下将结合实施例和附图对本公开的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本公开的目的、方案和效果。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
如图1所示为根据本公开的一种基于人工智能的智能合约安全漏洞挖掘方法的流程图,下面结合图1来阐述根据本公开的实施方式的一种基于人工智能的智能合约安全漏洞挖掘方法。
本公开提出一种基于人工智能的智能合约安全漏洞挖掘方法,具体包括以下步骤:
步骤1,智能合约安全漏洞挖掘***读取待验证的智能合约的二进制代码;
步骤2,启动字节码控制流图生成模块,将待验证的智能合约的二进制代码作为该模块的输入,字节码控制流图生成模块通过字节码解析器将二进制代码反汇编转换成智能合约字节码转成智能合约字节码;
步骤3,字节码控制流图生成模块按照智能合约字节码跳转指令字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图,该有向图即为该智能合约字节码的控制流图;
步骤4,启动特征提取模块,将字节码的控制流图作为该模块的输入;
步骤5,特征提取模块将控制流图中每个节点的提取m个特征,假设控制流图总共有n个节点,最终该模块将生成n*m的特征矩阵;
步骤6,启动深度学习决策模块,将n*m特征矩阵作为该模块输入。该模块将矩阵分别输入模块中的深度学习模型中,每个模型给出一个k维向量,k是总共可能漏洞的总数。向量中每个元素为[0,1]中的一个分数,表示该智能合约存在某个特定漏洞的概率;
步骤7,深度学习决策模块统计深度学习的决策概率,并整合成一个总概率,输出给用户,提醒用户可能存在的安全漏洞;
步骤8,启动深度学习可解释性模块对深度学习决策模块所有的深度学习模型做可解释性分析并展示给用户,如果用户觉得某个深度学习模型中某个参数不合理,可以进行手动修改;
步骤9,当用户手动修改后,深度学习可解释性模块记录下用户修改的结果,将结果输入到给深度学习决策模块进行再训练。
进一步地,在步骤1中,所述智能合约安全漏洞挖掘***包括字节码控制流图(CFG)生成模块、特征提取模块、深度学习决策模块及深度学习可解释性(XAI)模块。
进一步地,在步骤1中,所述待验证的智能合约的二进制代码是通过EVM编译器编译该智能合约的solidity源代码生成的,由用户提供。
进一步地,在步骤2中,所述字节码控制流图生成模块用于将一段智能合约字节码转换成字节码控制流图。因为智能合约的二进制代码和传统意义上的基于指令集的二进制代码(如x86/x64、ARM、MIPS、RISC-V等)有很大的区别,因此该模块需要先调用字节码解析器,将智能合约的二进制按照智能合约指令集进行反汇编,变成智能合约汇编。之后,该模块再按照智能合约字节码跳转指令(如jump、jumpdest)等将字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图(directed graph),源和目标代码块作为有向图的节点,跳转的指令作为有向图的边,该有向图即为该智能合约字节码的控制流图。
进一步地,在步骤3中,所述智能合约字节码跳转指令包括但不限于jump、jumpdest、jumpi、return,revert、fall to、push1、switch。
进一步地,在步骤4中,所述特征提取模块用于对字节码控制流图提取特征,因为字节码控制流图中每个节点都是一个字节码代码段,含有多个的指令,因此具有相当丰富的信息,即指令数、算数指令数、存储指令数、读取指令数等,该特征提取模块的人物就是需要把这些节选这些丰富的信息作为特征转换成特征向量或特征矩阵,并将这些特征向量和特征举证作为输入传给深度学习决策模块,让深度学习决策模块做出决策。
进一步地,在步骤5中,所述控制流图中每个节点为跳转的指令的源和目标代码块。
进一步地,在步骤5中,所述特征包括但不仅限于指令数、算数指令数、存储指令数、读取指令数等。
进一步地,在步骤6中,所述深度学***均等等。
进一步地,在步骤7中,所述深度学习的决策概率为各深度学习模型结合搜索算法进行深度学习获得的判断结果,即智能合约存在各深度学习模型相对应的各种特定漏洞的概率。
进一步地,在步骤8中,所述深度学习可解释性模块的主要功能是为了更好地把深度学习决策模块中的深度学习模型的决策过程呈献给用户,并允许用户对其中的决策过程进行调整,调整后的数据会返回到深度学习决策模块再训练,从而使得整个决策过程更透明,决策结果更准确,其中,可解释性算法包括但不限于决策树和随机森林,或可视化决策树。
本实施给出一个具体实施例,阐述该方法如该方法如何完成一次漏洞的查询
实施例,某开发人员用solidity语言写了一个转帐的智能合约,里面包含有如下主要的功能性语句:
mapping(address=>uint)balances;
Function withdraw(){
uint amount=balances[msg.sender];
msg.sender.call.value(amount);
balances[msg.sender]=0;};
其中,withdraw函数主要的规定了该区块链转帐的规则。
根据代码的逻辑,一个钱包中的钱会先转帐到一个目标地址(msg.sender.call.value(amount);)然后该智能合约才会将钱包的余额清空,这是一个严重的逻辑错误,该逻辑漏洞称之为重入漏洞(re-entrancy)。
根据上述的逻辑错误,一个恶意攻击者可以写一个恶意的智能合约交易协议,协议对于转账语句进行重写,在call.value()函数中重复调用withdraw函数,这样做就会导致攻击者可以不停地从钱包里面转账,但合约却不知道钱包中的余额已经为0(因为(balances[msg.sender]=0;语句永远不会被执行)。造成巨额损失。
本公开所提的方法以下步骤可有效防止该漏洞的触发。
S1,在该段代码被转换成字节码之后,字节码控制流图生成模块将withdraw函数生成为一个拥有两个节点的控制流图。第一个节点包括uint amount=balances[msg.sender];和balances[msg.sender]=0;语句的字节码,第二个节点msg.sender.call.value(amount);的字节码;
S2,特征提取模块对于两个节点分别提取n个特征,并生成2*n维向量;
S3,深度学习决策模块检查所生成的2*n维向量,其中的循环神经网络模型(RNN)发现msg.sender.call.value(amount);所对应的字节码永远都在balances[msg.sender]=0;所对应的字节码之前,因此RNN模型会输出决策,指出该智能合约可能有很大的概率会产生重入漏洞并警告开发人员;
S4,开发人员根据相关警告,将msg.sender.call.value(amount);balances[msg.sender]=0;这两句语句顺序调换,从而修复漏洞。
本公开的实施例提供的一种基于人工智能的智能合约安全漏洞挖掘***,如图2所示为本公开的一种基于人工智能的智能合约安全漏洞挖掘***图,该实施例的一种基于人工智能的智能合约安全漏洞挖掘***包括:处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序运行在智能合约安全漏洞挖掘***的字节码控制流图生成模块、特征提取模块、深度学习决策模块及深度学习可解释性模块的各自单元中,
其中,字节码控制流图生成模块,包括以下单元:
智能合约反汇编单元,用于读取待验证的智能合约的二进制代码,并通过字节码解析器将二进制代码反汇编转换成智能合约字节码转成智能合约字节码;
控制流图生成单元,用于字节码控制流图生成模块按照智能合约字节码跳转指令字节码划分成不同模块,然后根据跳转的指令的源和目标代码块生成有向图,该有向图即为该智能合约字节码的控制流图;
其中,特征提取模块,包括以下单元:
特征提取单元,用于特征提取模块将控制流图中每个节点的提取m个特征;
其中,深度学习决策模块,包括以下单元:
深度学习单元,用于将n*m特征矩阵作为该模块输入,该模块将矩阵分别输入模块中的深度学习模型中,每个模型给出一个k维向量,k是总共可能漏洞的总数,向量中每个元素为[0,1]中的一个分数,表示该智能合约存在某个特定漏洞的概率;
决策统计输出单元,用于统计深度学习的决策概率,并整合成一个总概率,输出给用户,提醒用户可能存在的安全漏洞;
其中,深度学习可解释性模块,包括以下单元:
可解释性分析单元,用于对深度学习决策模块所有的深度学习模型做可解释性分析并展示给用户,并可以进行手动修改模型的参数;
再训练单元,用于当用户手动修改后,深度学习可解释性模块记录下用户修改的结果,将结果输入到给深度学习决策模块进行再训练。
所述一种基于人工智能的智能合约安全漏洞挖掘***可以运行于桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备中。所述一种基于人工智能的智能合约安全漏洞挖掘***,可运行的***可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述例子仅仅是一种基于人工智能的智能合约安全漏洞挖掘***的示例,并不构成对一种基于人工智能的智能合约安全漏洞挖掘***的限定,可以包括比例子更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述一种基于人工智能的智能合约安全漏洞挖掘***还可以包括输入输出设备、网络接入设备、总线等。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述一种基于人工智能的智能合约安全漏洞挖掘***运行***的控制中心,利用各种接口和线路连接整个一种基于人工智能的智能合约安全漏洞挖掘***可运行***的各个部分。
所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述一种基于人工智能的智能合约安全漏洞挖掘***的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
尽管本公开的描述已经相当详尽且特别对几个所述实施例进行了描述,但其并非旨在局限于任何这些细节或实施例或任何特殊实施例,而是应当将其视作是通过参考所附权利要求考虑到现有技术为这些权利要求提供广义的可能性解释,从而有效地涵盖本公开的预定范围。此外,上文以发明人可预见的实施例对本公开进行描述,其目的是为了提供有用的描述,而那些目前尚未预见的对本公开的非实质性改动仍可代表本公开的等效改动。