发明内容
本公开提供一种基于人工智能的智能合约安全漏洞挖掘方法及系统,通过提出一种基于人工智能的智能合约安全漏洞挖掘方法,从而更智能更自动化保证智能合约的安全。
为了实现上述目的,根据本公开的一方面,提供一种基于人工智能的智能合约安全漏洞挖掘方法,所述方法包括以下步骤:
步骤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所示为根据本公开的一种基于人工智能的智能合约安全漏洞挖掘方法的流程图,下面结合图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)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
尽管本公开的描述已经相当详尽且特别对几个所述实施例进行了描述,但其并非旨在局限于任何这些细节或实施例或任何特殊实施例,而是应当将其视作是通过参考所附权利要求考虑到现有技术为这些权利要求提供广义的可能性解释,从而有效地涵盖本公开的预定范围。此外,上文以发明人可预见的实施例对本公开进行描述,其目的是为了提供有用的描述,而那些目前尚未预见的对本公开的非实质性改动仍可代表本公开的等效改动。