CN116361806A - 基于多示例和注意力机制的智能合约分析方法及装置 - Google Patents
基于多示例和注意力机制的智能合约分析方法及装置 Download PDFInfo
- Publication number
- CN116361806A CN116361806A CN202310167280.4A CN202310167280A CN116361806A CN 116361806 A CN116361806 A CN 116361806A CN 202310167280 A CN202310167280 A CN 202310167280A CN 116361806 A CN116361806 A CN 116361806A
- Authority
- CN
- China
- Prior art keywords
- instance
- contract
- vulnerability
- intelligent contract
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- Computing Systems (AREA)
- General Physics & Mathematics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Mathematical Physics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于多示例和注意力机制的智能合约分析方法及装置。所述方法包括:获取智能合约的操作码;基于所述操作码,构建所述智能合约的程序控制流图;对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例;对所述实例进行编码,并基于注意力机制的双向长短期循环神经网络对编码结果进行分类,以得到该实例的安全结论以及权重;基于各实例的安全结论以及权重,得到所述智能合约的分析结果。本发明可以有效地保护区块链上运行的智能合约安全以及用户的隐私及财产安全。
Description
技术领域
本发明涉及以太坊智能合约安全技术领域,具体涉及一种基于多示例和注意力机制的智能合约分析方法及装置。
背景技术
智能合约是在区块链上运行的程序。目前,数以万计的智能合约被部署在以太坊区块链平台上,已经在钱包、众筹、在线游戏和跨行业金融等领域实现了广泛的应用。这使得智能合约持有价值超过100亿美元的虚拟货币。一旦智能合约存在安全漏洞,恶意用户可能会利用漏洞发起攻击,窃取用户账户中的财产。除了智能合约所承载的经济价值外,这些攻击还源于:1)智能合约运行在一个无需许可的网络中,这意味着攻击者可以自由地检查所有的交易和字节码,并试图找出合约中的漏洞。2)共识协议使得智能合约一旦部署就不可更改,这需要开发者预测合约未来可能遇到的所有可能状态,这无疑是困难的。因此,在将智能合约部署到以太坊之前,对合约进行有效漏洞审查,确保智能合约无错误且设计良好非常重要。
现有的合约分析技术采用了模式匹配(SmartCheck和Slither)、符号执行(Oyente和Mythril)、模糊测试(Contractfuzzer和ILF)和机器学习(DR-GCN和S-gram)来识别漏洞(包含合约漏洞Bug和代码优化)。然而,目前还存在以下三个关键的挑战。
挑战1:(需求)支持智能合约的源代码、字节码/操作码的分析。
智能合约通常使用高级编程语言开发,例如Solidity。当开发人员将智能合约部署到以太坊时,合约将首先被编译成以太坊虚拟机(Ethereum Virtual Machine,EVM)字节码。然后,以太坊系统上的每个节点都将收到合约字节码,并在其账本中拥有一份副本。在以后运行合约时,EVM会将字节码解析为操作码序列并执行。智能合约的源代码由于其易读性而被许多方法分析,例如模式匹配(NeuCheck和Zeus),相似代码匹配(SMARTEMBED)和机器学习(Peculiar和DeeSCVHunter)。然而,根据最新记录,在以太坊上运行的100万个智能合约中,只有不到2%的人公开了它们的源代码。因此,这些工具很难被直接用于分析以太坊上庞大数量的智能合约。同时基于字节码分析由于存在以下原因,很难进行实现。1)字节码丢失了一些合约原始语义。2)合约中往往会引入了很多无关的干扰,即那些与漏洞无关的语句,称为噪声代码,可能会混淆代码匹配。
挑战2:(智能化&无人化)降低对预先人工定义规则/模式的依赖和专家的参与。
尽管已经有一些基于字节码的漏洞检测研究,如符号执行(teEther和DefectChecker)和模糊测试(Contractfuzzer和SMARTIAN),检测和预防越来越多的合约漏洞的需求仍然在增长。这些方法的一个主要不足是它们需要专家定义的某些漏洞模式/预言或规则(统称为模式)来构建漏洞检测器或代码检查器。然而由于以下原因,使得他们不足以应对以太坊上多变的合约漏洞。1)人工定义的模式具有容易出错的风险,并且一些复杂漏洞的规则较难制定。同时,攻击者可能会使用技巧绕过规则的固定模式。2)随着Solidity编译器的发展,字节码具有可变的表现形式,字节码生成的多样性会给固定的规则形式带来困难。3)随着攻击者和防御者之间的竞争,不断编写新模式以响应攻击者创建的新漏洞可能太慢且成本太高。
挑战3:(实用化)帮助开发者更安全地完成合约生命周期,例如漏洞识别、验证、修复、模拟和监控。
基于机器学习的方法(Contractward)常被用于自动学习合约漏洞特征,从而充分利用现有的漏洞合约来表达漏洞。然而,这些方法在可扩展性、通用性和可解释性方面存在一定的限制,导致它们的检测准确性和运行速度不足。更为重要的是,他们仅能检查智能合约是否存在漏洞,而不能输出其他有效的信息以支持开发人员修复这些漏洞,更不支持漏洞验证、漏洞模拟和异常行为监控。因此,以有效、高效和可解释的方式检测合约中的不同漏洞(例如重入和时间戳依赖),同时帮助开发人员在现实生活中更安全地完成合约生命周期,是一个新兴而且至关重要的问题。具体来说,1)在合约开发和部署阶段向合约开发人员报告有缺陷的源代码语句、关键字节码片段以及可能的建议,以便进一步修复合约;2)支持自动化漏洞验证,减少误报和人工审核的工作量;3)提供触发合约漏洞可能的调用输入;4)监控合约调用,判断合约执行和合约销毁阶段的异常行为。解决这个问题的一种方法是使用机器学习技术来关注合约的执行序列,而不是盲目地检查整个合约字节码。然而,由于字节码较差的可读性以及合约往往包含若干个执行序列,因此识别者很难根据合约的标签推断相应合约字节码序列的标签。也就是说,在训练数据集中,本发明仅能知道哪些合约是否包含某个漏洞,但不知道其哪些字节码序列是恶意的,即能够导致漏洞发生。这使得分类器(即基于ML的模型)在缺乏细粒度标签的情况下,无法基于合约执行序列进行训练,也就很难实现合约漏洞执行序列的识别。这可以归因为训练数据的细粒度标签缺失问题。因此,为更好地在真实环境中部署智能的合约识别模型,发现并指导合约开发者/审计者修复合约漏洞,亟需设计和研制一种面向合约字节码执行序列的合约智能分析模型。
发明内容
为了克服上述现有技术的不足,本发明提供一种基于多示例和注意力机制的智能合约分析方法及装置,用于自动化学习以太坊智能合约漏洞特征,检测潜在的智能合约安全风险并输出合约缺陷代码语句、关键操作码片段、执行序列等有效信息,有效地保护区块链上运行的智能合约安全以及用户的隐私及财产安全。
为达到上述目的,本发明提供如下技术方案:
一种基于多示例和注意力机制的智能合约分析方法,所述方法包括:
获取智能合约的操作码;
基于所述操作码,构建所述智能合约的程序控制流图;
对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例;
对所述实例进行编码,并基于注意力机制的双向长短期循环神经网络对编码结果进行分类,以得到该实例的安全结论以及权重;
基于各实例的安全结论以及权重,得到所述智能合约的分析结果。
进一步地,所述获取智能合约的操作码,包括:
将智能合约的源代码编译成字节码;
使用Geth提供的API对所述字节码,以得到智能合约的操作码。
进一步地,所述基于所述操作码,构建所述智能合约的程序控制流图,包括:
将所述操作码拆分为若干个基本块;其中每一基本块表示为一个没有分支的代码序列;
根据所述代码序列的退出指令定义基本块的类型;所述类型包括:条件块、终端块和无条件块;
基于以太坊虚拟机堆栈对每个基本块中的指令执行符号推理,将条件块划分为有条件跳转块和无条件跳转块;
依据各基本块的类型,构建所述智能合约的程序控制流图。
进一步地,所述对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例,包括:
在所述程序控制流图获得没有输入的初始块;
从所述初始块执行深度优先遍历;
在遍历过程中出现连续的ncycle个基本块为已搜索过的基本块的情况下,结束遍历,并基于当前的操作码序列生成一实例;
在遍历过程中的路径长度超过限制数量的情况下,结束遍历,并基于当前的操作码序列生成一实例;
在遍历过程中触及终端块的情况下,结束遍历,并基于当前的操作码序列生成一实例。
进一步地,训练所述基于注意力机制的双向长短期循环神经网络,包括:
构建原始数据集;所述原始数据集由若干个合约样本组成;
获取所述合约样本中的实例样本;
通过将实例样本中的操作码转换成字节码,得到实例样本编码结果;
基于注意力机制的双向长短期循环神经网络的Bi-LSTM层,构建所述实例样本编码结果的向量矩阵H;
基于注意力机制的双向长短期循环神经网络的注意力层,对所述向量矩阵H进行注意力计算,以得到用于分类的最终序列对表示h*和该实例样本的权重向量;
基于注意力机制的双向长短期循环神经网络的分类器,对所述最终序列对表示h*进行分类,得到该实例的分类结果;
根据所述分类结果计算交叉熵损失,以更新所述注意力机制的双向长短期循环神经网络;
基于更新后的注意力机制的双向长短期循环神经网络,对原始数据集进行优化,并返回至所述构建原始数据集;
直至训练周期结束,得到训练后的注意力机制的双向长短期循环神经网络。
进一步地,所述基于各实例的安全结论以及权重,得到所述智能合约的分析结果,包括:
获取所述智能合约的汇编语言源码;
针对所述安全结论为存在漏洞的实例,计算最大的m个权重值的索引向量并提取相应的关键操作码;
获取所述关键操作码在所述汇编语言源码中的起始位置和终止位置,以得到所述智能合约的缺陷代码语句;
根据各实例的安全结论,得到漏洞执行序列;
基于各实例的所述关键操作码、缺陷代码语句和漏洞执行序列,生成所述智能合约的分析结果。
进一步地,所述方法还包括:
基于漏洞执行序列构建符号约束;
利用可满足性模理论求解器对符号约束进行计算,得到该实例的符号约束参数;
基于所述符号约束参数,验证该实例的约束路径是否满足可行性;
在满足可行性的情况下,基于符号约束与符号约束参数,识别漏洞还原和异常调用行为;
在不满足可行性的情况下,判定该安全结论中的漏洞为误报。
进一步地,所述基于各实例的安全结论以及权重,得到所述智能合约的分析结果,包括:
构建合约漏洞-严重性表-通用漏洞修复示例;其中,严重性包括:High、Medium、Low、Info和Opt;
针对所述安全结论中漏洞类型,得到所述实例的漏洞严重性和通用的漏洞修复示例,以生成所述智能合约的分析结果。
一种基于多示例和注意力机制的智能合约分析装置,所述装置包括:
数据获取模块,用于获取智能合约的操作码;
流图构建模块,用于基于所述操作码,构建所述智能合约的程序控制流图;
实例生成模块,用于对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例;
实例分析模块,用于对所述实例进行编码,并基于注意力机制的双向长短期循环神经网络对编码结果进行分类,以得到该实例的安全结论以及权重;
结果生成模块,用于基于各实例的安全结论以及权重,得到所述智能合约的分析结果。
一种电子设备,其特征在于,所述电子设备包括:处理器以及存储有计算机程序指令的存储器;所述处理器执行所述计算机程序指令时实现上述任一项所述方法。
一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现上述任一项所述方法。
相对于现有技术,本发明的有益效果在于:
(1)本发明提出的智能合约分析方法可以在不使用手动预定义规则的情况下准确地分析源代码、字节码和操作码,并且易扩展识别新漏洞。同时,相较于目前的方法准确率、精准度、召回率、F1值较高,方法实现健壮,分析失败率较低。
(2)本发明提出的智能合约分析方法相较于现有模式匹配、符号执行、模糊测试、机器学习的方法拥有较低的时间和空间开销,平均仅需4.4s和81.3MB分析一个121KB的以太坊智能合约,可在内存资源有限的环境中快速完成合约的全流程自动化分析。
(3)本发明提出的智能合约分析方法可以发现以太坊上其余方法检测不到的安全问题和0Day漏洞合约,同时还可以优化合约,减少合约运行过程中不必要的开销,具有更强的实际使用意义。
(4)本发明提出的智能合约分析方法可以通过灵活的基础模型和参数配置满足合约审计人员的各种要求,例如:通过采用决策树模型和提高恶意序列的提取比例qm来尽可能发现更多的漏洞。
(5)本发明提出的智能合约分析方法相较于现有方法可以提供更多的服务。例如,它可以准确地完成合约漏洞检测,同时给出缺陷源码语句、关键操作码/字节码片段、执行序列和通用的修复方法示例。这些信息可以帮助合约开发人员了解漏洞的发生机制,并指导他们研制相应的定制化漏洞修复策略。
附图说明
图1是本发明实施例所述方法中合约字节码分析方法检测流程图。
图2是本发明实施例所述方法中合约语言转换实例图。
图3是本发明实施例所述方法中CFG构建器符号推理示例图。
图4是本发明实施例所述方法中基于多示例机制的漏洞学习器结构图。
图5是本发明与现有方法的合约分析时间开销对比图。
图6是本发明与现有方法的合约分析内存开销对比图。
图7是本发明实施例所述方法中定位缺陷合约源代码语句的案例研究图。
图8是本发明实施例所述方法中The Dao安全事件合约代码。
图9是本发明实施例所述方法中block-other-parameters漏洞合约代码。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下通过附图及实施例对本发明作进一步详细说明。但是应该理解,此处所描述的具体实施例仅用以解释本发明,并不用于限制本发明的范围。
本发明为解决漏洞规则制定困难、易被绕过等问题,同时响应合约字节码分析、漏洞序列报告等需求,公开了一种基于多示例学习和注意力机制的以太坊智能合约字节码分析方法,利用合约编译器实现合约源码的编译,构建合约的程序控制流图(CFG),结合深度优先遍历算法提取多条较长合约执行序列;构建基于自注意力机制的双向长短期循环神经网络模型,基于多示例机制设计融合实例(执行序列)和包(合约)级别识别效果的损失函数,结合预训练的模型完成合约训练数据的优化,实现漏洞特征的自动化学习;通过测试合约各组成实例,完成合约安全性的快速检测,最终输出包含缺陷合约代码语句、执行序列、修复建议等有效信息的合约分析报告。
具体来讲,图1描述了本发明提出的合约字节码分析方法的总体架构。该方法将智能合约的Solidity源代码、字节码或操作码作为输入,并最终输出合约漏洞(如重入、时间序列依赖)及其严重性,以及相应触发漏洞的操作码序列。它包含六个组件,即合约输入器、CFG构建器、实例构建器、漏洞学习器、漏洞识别器和结果输出器。合约输入器负责生成合约操作码,CFG构建器构造一种包含三种区块类型的CFG。然后,实例构建器执行深度优先遍历以获得运行时操作码序列(称为实例)。漏洞学习器通过在由良性和恶意(易受攻击)合约组成的数据集上训练检测器以自动提取漏洞特征。漏洞识别器使用先前针对各漏洞训练的检测器识别易受攻击的合约实例,并输出缺陷执行序列的自注意力权重(重要性)分布。最后,结果输出器基于权重分布,结合合约编译汇编语言源码(ASM)文件反向定位缺陷代码语句,输出包含缺陷执行序列、关键操作码片段、修复建议等有效信息的合约分析报告,便于合约审计者和开发者执行二次验证和利用,例如:建立缺陷路径符号约束,基于符号约束求解技术,验证路径可达性实现检测结果的自动化验证,利用符号求解的参数实现合约漏洞的调用复现,通过验证调用参数是否满足缺陷约束以监控并识别合约异常执行行为。
组件1:合约输入器,完成合约代码的输入。
图1左侧为合约输入器,用户可以输入合约的源代码、字节码和操作码。具体来说,操作码直接作为CFG构建器的输入,需要将源代码编译成字节码并得到汇编语言源码(ASM)文件,然后使用Geth提供的API反汇编成操作码。图2为一个合约转换的例子。当多个关联合约作为输入时,编译器可以统一解析它们以生成它们的字节码;当这些合约相互独立时,他们可以被分别编译。值得注意的是,CFG构建器可以利用多线程操作来提高构建的效率。
组件2:CFG构建器,完成合约CFG的转换。
首先,CFG构建器将操作码拆分为几个基本块。每一个基本块都是一个代码序列,除了入口和出口外没有分支。首先将操作码分成几个块,并根据其退出指令定义块的类型。如果最后一条指令是JUMPI,则块类型定义为条件块。如果最后一条指令属于停止类型(STOP、REVERT和RETURN),则块类型为终端块。不属于上述两种类型的块将被分配为无条件块。
其次,CFG构建器对每个块中的指令进行符号推理,以生成合约的CFG。值得注意的是,与其他基于堆栈的机器(JVM)不同,EVM操作码的跳转位置需要在指令推理期间计算。具体来说,在推理指令时,EVM堆栈顶部的几个符号状态将被读取,并且计算之后的符号结果将会被放回EVM堆栈中。由此,本发明可以得到块之间的跳转关系,即有条件跳转和无条件跳转,相应的对应有条件类型块和无条件类型块。
如图3所示,有4个block,每个block包含几条指令。块1中的指令代表代码if(val==0)。块2和块3分别将值(1或0)放入EVM堆栈。块4中的指令用于将值(0或1)返回给环境。每行最左边的数字表示指令的索引ID,中间是需要推理的指令。所有指令将根据它们的索引ID依次推理。如果指令是“PUSH”,最右边的部分将有一个压入EVM堆栈的值。同时,有一个程序计数器(PC)实时记录当前执行的ID。具体来说,PC从块1中的ID 10开始。在EVM执行JUMPDEST指令之前,EVM堆栈中有一个符号“val”,它表示“iszero”函数的输入值。JUMPDEST标记跳转的有效目的地,并且不读取或推送任何值。然后PC指向ID11,EVM将值1推送到EVM堆栈。接着,“0”被压入EVM堆栈,PC指向13。DUP3复制第3个堆栈项,即符号“val”被推入EVM堆栈。EQ从EVM堆栈中读取两个值。如果两个值相等,则EVM将1压入堆栈,否则将0压入堆栈。之后,ISZERO从EVM堆栈顶部读取一个值。如果值等于0,则将1压入堆栈,否则压入0。JUMPI(ID 17)从堆栈中读取两个值,即跳转位置和条件表达式。根据表达式的结果,PC将有条件地分别跳转到ID为23和18的位置。最终,块4返回值0或1并使用STOP指令完成执行(终端)。
组件3:实例构建器,完成合约执行序列的提取。
为了让本发明方法发现易受攻击的执行路径,实例构建器将专注于合约实际执行的每个操作码序列(称为实例),而不是所有操作码的整个集合。具体来讲,提取操作码执行序列的过程为:CFG构建者构建合约的CFG。然后,实例构建者根据CFG从初始块(即没有输入的起始块,标志着合约执行的开始)执行深度优先遍历来获得操作码序列。当满足三个条件之一时,停止搜索执行路径。①连续的ncycle个块为已搜索过的块,这将被认为是一个循环执行路径。②路径长度超过限制nblock。③最后一个块的类型是终端,表示该路径结束。最后,由于序列空间爆炸和机器性能限制,实例构建器将输出合约的nseq个选定实例用于后序分析。选择的方案有多种。例如,随机选择或有序分配nseq个实例。本发明建议使用长度较长的nseq个实例,因为它们可能包含更多的语义信息。
组件4:漏洞学习器,实现合约正常和漏洞实例的特征表示。
为了在字节码级别检测合约漏洞,本发明利用多示例学习机制从实例构建器提取的实例中自动识别恶意行为。图4介绍了漏洞特征学习和漏洞实例检测的过程,包括实例标签初始化、模型训练与分类、实例优化三个部分。下述以一个漏洞为例,描述学习器的工作流程。
1.实例标签初始化。在漏洞特征学习阶段,训练数据集由多个良性和恶意合约的实例组成,可以形象地描述为包。但是,由于很难理解每个合约实例的操作码和标签,本发明只能判断合约是否是恶意的(即存在漏洞),无法获取其实例的具体标签。换句话说,恶意合约至少包含一个恶意实例,但是所有实例的标签是未知的,使得面向实例识别的模型无法训练。该问题也称为细粒度标签缺失分类问题。为此,本发明首先将实例的标签初始化为与它们的包一致的标签,并将所有实例整合为训练数据集D0。如图4的第1步所示,D0包含具有初始标签和包信息的若干实例。
2.模型训练和分类。为了区分良性和恶意实例,本发明基于双向LSTM(Bi-LSTM)设计了基于包-实例和模型自注意力机制的Bi-LSTM(Bi2-LSTM)模型,一方面利用序列模型关注实例中操作码的上下文联系,另一方面在捕捉显著实例片段的同时考虑包和实例的学习效果。值得注意的是基于包-实例注意力机制,本发明还可以雇佣其他的机器学习模型(GRU、CNN等深度学习模型和随机森林、SVM知识向量机等传统机器学习模型)。以Bi2-LSTM为例,该模型包含以下过程。
①实例编码。给定一个由T个操作码opseq={x1,…,xT}组成的实例,每个操作码xi通过汇编操作转换成字节码ei。然后将编码后的字节码数值向量Copseq={e1,…,eT}作为Bi-LSTM网络的输入。
②Bi-LSTM网络。对于操作码序列建模任务,考虑未来和过去的上下文往往是有益的。为此,Bi-LSTM网络通过引入第二层以扩展单向LSTM网络,其中两层的连接以相反的时间顺序流动。如图4的第2步所示,Bi2-LSTM层包含左右两个顺序的LSTM单元子网络,分别代表前向和后向传递。在LSTM单元的前向传递的第tth时间步操作中,遗忘门ft和输入门vt可进行如下计算:其中/>是当前隐藏状态,et表示LSTM单元的第tth个输入。接着,临时存储单元/>可计算为:并且下一个细胞的状态可以更新为/>最后,输出门ot和下一个隐藏状态可以被计算为/>和/>值得注意的是,上述所有的W和b都是模型自学习的参数。LSTM单元的反向传递操作的数据流与上述类似,Bi-LSTM层对第tth时间步输入的最终输出值为/>
③模型自注意力机制。令H是由Bi-LSTM层输出向量[h1,h2,…,hT]组成的矩阵,其中T是序列长度。序列的表示r作为输出向量的加权,计算为:r=Hα*。其中H∈RT,w是训练的参数向量,w*为该向量的转置。w、α、r的维度分别为1、T和1。用于分类的最终序列对表示为h*=tanh(r)。更重要的是,权重α反映了模型推理过程中对于t时间步输入xt的重要性,可进一步用于结果输出器计算关键序列片段。
⑤基于Bag-instance混合注意力机制的训练。如图4模型训练部分所示,漏洞学习器利用Bi2-LSTM对所有包的每个实例进行分类,并将交叉熵作为实例特征学习的损失lossins。具体来说,包Cj的平均lossins可以计算为其中p(x)表示带有标签y(x)(0和1分别表示良性和恶意)的实例x被预测为恶意的概率。更重要的是,判断包是否是恶意的关键为包中是否含有恶意实例。为此,漏洞学习器将预测包中最像恶意实例(即p(x)最大的实例)的结果作为包的预测结果,进一步基于包Cj的标签ybag计算交叉熵损失lossbag=-ybag logpbag+(ybag-1)log(1-pbag),其中/>)。融合上述两个损失构成包-实例混合注意机制,使模型能够在包(合约)识别的指导下发现包中的恶意实例,Bi2-LSTM的综合训练损失定义为loss=λlossins+lossbag。其中较大的权重值λ∈(0,1]∈Q+表示学习器专注于实例,Q+表示正有理数集,相反更注意包。这种机制可以在模型训练过程中缓解不可避免的错误实例标签的影响。
3.实例优化。如图4第3步所示,训练数据集在Bi2-LSTM训练后更新,然后被再次用于迭代训练。具体来说,漏洞学习器使用经过训练的模型来识别原始数据集D0,并过滤得到一些可区分的实例以构建新的训练数据集。此时,数据集由两部分组成,一部分是预测良性包中最像良性的实例,即对于包Ci,选择实例的qb%的升序排列中具有较小p(x)的序列另一部分为预测恶意包中最像恶意的实例,即对于排序包Cj,挑选qm%的升序排列中具有较大p(x)的序列/>qm的值使模型能够考虑由多个实例触发的漏洞,例如提取合约权限和窃取余额的实例组合。
组件5:漏洞识别器,完成合约检测器的部署和漏洞检测。
漏洞识别器使用多个针对各漏洞训练的Bi2-LSTM模型来检测合约风险。具体来说,对于每个漏洞,可以在预先收集的数据集上训练识别具有相应漏洞特征的合约实例的检测器。请注意,在漏洞检测期间,漏洞识别器仅使用Bi2-LSTM模型完成对实例构建器输出实例的预测,不需要执行标签初始化、实例优化等训练操作。同时,合约样本的实例提取只需要一次。然后模型执行快速推理,因此多个检测器只需要很少的时间开销并且优于许多SOTA方法,此外,由于不同的模型在推理过程中是独立的,因此可以使用并行计算等技术来提高性能。更重要的是,由于漏洞学习器的可扩展性,可以根据数据集轻松训练检测器以识别新漏洞。
组件6:结果输出器,完成缺陷合约代码语句定位、检测结果报告生成等操作。
漏洞检测后,结果输出器生成合约安全分析报告,包括安全结论和修复建议。具体来说,当合约不存在任何具有漏洞特征的实例时输出“安全”的结论和相应的证据(即分析细节)。否则,指出合约中存在的漏洞及相应严重性(High、Medium、Low、Info和Opt)。其中,每个漏洞对应一个事先定义的严重性,该严重性与漏洞的触发难度和影响程度相关。在生成结果时,结果输出器会根据合约漏洞查看事先定义的合约漏洞-严重性表以匹配到相应的漏洞严重性。更重要的是,漏洞实例及其关键片段可以进一步用于进行符号约束求解和缺陷源代码映射,从而使本发明方法具备执行漏洞二次验证和利用的能力。另外,还可以根据以上信息输出可能的建议,使开发人员能够修复漏洞并提高合约安全性。
定位有缺陷的源代码语句。在对合约进行模型预测后,结果输出器从漏洞识别器中获取带有标签的合约实例及其权重向量α。根据下述公式计算了最大的m个权重值的索引向量L并提取了相应的操作码opskey。当合约分析者提供合约源代码时,可以从合约输入器获得ASM文件并映射源代码中这些操作码的开始和结束位置(即行和列)。然后,通过截取特定位置的源代码,得到有缺陷的合约代码语句。
opskey=[xt]t∈L,begin,end←ASM(opskey)
实例的符号约束求解。已识别的缺陷实例描述了合约执行期间的状态转换。受符号执行技术的启发,这些实例可以进一步用于构建合约执行路径需满足的符号约束条件。该过程与Oyente等工具是一致的。然后,基于Z3等可满足性模理论(SatisfiabilityModulo Theories,SMT)求解器对构建的符号约束进行计算,如果发现约束条件不可满足,则相应的实例是不可执行的,即为误报。相反,若约束可被满足,即可以解决到符号约束的参数,则实例是可执行的。因此,通过该方法,不可执行的实例将被纠正为正常,从而消除一些误报。与基于符号执行的方法相比,该发明方法可以被视为漏洞检测规则的自动化制定者和合约执行路径的快速过滤器(类似于强化学习),它可以执行快速的推理以修剪正常路径并提高验证效率。
漏洞的二次验证和利用。本发明方法除了可以让开发者通过实例可行性检测和缺陷语句定位快速判断分析结果的正确性,还可以支持目前基于机器学习方法无法提供的其它服务。例如,审计人员可以使用符号约束计算出的参数调用漏洞合约来触发诸如整数溢出integer-overflow之类的漏洞。此外,他们还可以提取交易中合约调用的参数来验证是否满足漏洞路径建立的符号约束,以进一步识别异常的合约调用行为。具体来说,当约束被满足时,说明合约的调用输入可触发相应的漏洞执行路径,该合约执行可被判定为异常行为。因此,本发明方法可以通过实施约束求解来保护合约从开发到销毁的整个生命周期的安全。
分析与评估:
测试环境:
基于表1所示的30种严重漏洞,本发明将本发明方法的检测结果与9种SOTA方法的检测结果进行了比较。表2展示了这些方法所能支持检测的漏洞,其中本发明的方法被称为VulHunter。根据方法使用的技术可将他们分为4类,即模式匹配(Slither、SmartCheck和Securify)、符号执行(Oyente、Mythril和DefectChecker)、模糊测试(SMARTIAN)和机器学习(TMP和Contractward)。
表1漏洞ID、名称及严重类型
表2各方法支持检测的漏洞类型
表3显示了实验中五个数据集的详细信息。Datasets_1~2为带有部分/完整标签的开源数据集,适用于评估方法的检测精度。其中,Dataset_1包含38,600个以太坊合约源代码,不包括空的和无法编译的合约。根据表1中提到的漏洞严重程度类型,Dataset_1中的30种漏洞数量为High(13,149),INFO(19,659),OPT(38,314)等。Dataset_2包含579个只有字节码的合约,标记有8种已知漏洞。本发明通过调用Etherscan API下载了13,413个实际使用的合约Solidity代码。这些合约构成了Dataset_3(大小为284.3MB)。此外,183,710个以太坊字节码合约被收集作为Dataset_4。与源代码相比,字节码数量的压倒性胜利反映了EVM字节码分析的必要性。Dataset_3~4被用来讨论以太坊区块链中的漏洞数量。此外,Dataset_5包含29个知名漏洞事件的合约源代码,用于进一步评估本发明方法的真实性。
表3数据集的细节
所有实验均在运行Ubuntu 18.04并配备Intel Core i7-10875H和8GB RAM的计算机上进行。本发明方法主要用Python实现,大约有12K行代码,同时Bi2-LSTM网络由PyTorch实现。solc 0.4.24等多个Solidity版本被使用将源代码编译成字节码,基于EVM的pyevmasm0.2.3被利用将字节码反汇编为操作码。
测试指标:
本发明将漏洞合约的发现定义为一个问题。通过将方法的检测结果与漏洞标签进行比较,本发明可以判断检测是否准确。因此该检测可以看作为二元分类,方法发现的所有问题可被标记为真阳性(TP)、假阳性(FP)、真阴性(TN)和假阴性(FN)。TP和TN表示正确预测有漏洞和没有漏洞的合约结果。相反,FP和FN描述错误的检测。此外,准确度(ACC)、精确度(P)、召回率(R)和F-Measure(F1)被用于评估每种方法。
其中,#TP、#TN、#FP和#FN指相应标记的合约数量。
实验测试结果:
①方法准确度测试及对比
本发明比较了方法和TMP等方法检测合约源代码和合约字节码的能力。具体来说,本发明在这些合约上执行了各个方法,将检测到的所有漏洞提取到JSON文件中,并使用合约的真实标签来计算各检测的性能指标。为了平衡训练数据集,评估良性和恶意合约的不同比例对本发明方法训练的影响,本发明设置了2:1和5:1两个比例,同时考虑了样本数量的最低要求。结果呈现在表4和表5中,以说明了每种方法的性能。
这两个表都包含三个部分:一是一些漏洞示例的指标,例如ACC和F1;二是每个漏洞严重性的总平均AVG和净平均NAVG指标,其中NAVG仅涵盖方法可以识别的漏洞类别;三是每种方法的AVG和NAVG指标。
首先,在2:1的实验中,如表4所示的第一部分:本发明方法(表中显示为VulHunter)在大多数漏洞上都优于其他方法。例如,本发明方法以较高的ACC和F1识别漏洞send-transfer和low-level-calls。这可以归因于其优越的学习能力,它捕捉到了漏洞的显着特征。同时还有一些漏洞,如reentrancy-eth,本发明方法略低于Slither等其他方法。这是因为这些漏洞可以通过预定义的规则来描述,进而使用模式匹配技术来检测。由于机器学习的可变性,本发明可以通过调整一些可变参数来增强检测效果。例如,增加提取实例的数量可以使分类器Bi2-LSTM关注易受攻击的路径,从而促进漏洞的发现。值得注意的是,本发明方法不依赖于手动预定义规则,更容易检测新的漏洞。它比其他基于机器学习的方法(如TMP和ContractWard)能够更好地识别大多数的漏洞。这源于本方法能够专注于合约运行时的执行序列(类似于DefectChecker等基于符号执行的方法),并在合约执行过程中准确捕捉良性和恶意样本的细微特征。相比之下,TMP和ContractWard通过全局观察合约字节码,对漏洞特征并不敏感,他们检测的召回率和F1较低。
表4各工具检测准确性对比(2:1)
由表5同样可以得出与上述类似的结论。本发明方法仍然可以检测到更多漏洞并优于其他方法。随着训练集的良性:恶意的比例增长为5:1,即良性样本增多,模型倾向于学习良性特征,从而提高了识别的ACC(方法整体的ACC提高了2.33%)。并且,被稀释的恶意特征使模型收敛偏向于良性样本,从而降低了召回率。尽管Slither等方法不需要预训练,但由于数据集的变化,这种现象也适用于它们。甚至数据分布的变化严重影响了Contractward的检测效果,例如漏洞timestamp识别失败(P=0和R=0)。这反映了该方法的检测鲁棒性需要进一步提高。通过不同数据集比例对本方法检测结果的影响,审计人员可以根据采集数据集中的识别要求和样本分布情况,按适当的比例进行抽样,以达到特定的模型训练效果。例如,尽可能多地报告可疑漏洞可以在良性和恶意合约之间设置一个较小的比率,以执行更高的召回率。相反,可以设置较大的比例以正确检测更多正常合约,进而减轻人工审核的压力。
表5各工具检测准确性对比(5:1)
其次,本发明利用7种支持字节码分析的方法来检测合约字节码。如表6所示,检测结果与上述结论一致,即本发明方法可以准确检测出大多数漏洞。对于reentrancy-eth等漏洞,基于符号执行的方法(DefectChecker、Oyente和Mythril)通过执行符号推理获得了更高的精度,其中DefectChecker的性能最好,然而召回率不高可能是受到不完善预定义规则的影响。相比之下,本发明方法能够自动捕捉正常和漏洞合约的独特特征,从而同时考虑准确率和召回率,并保持较高的F1值。此外,由于程序分析报错,Securify和SMARTIAN未能分析大多数的合约。他们可以通过优化自己的实现代码来进一步提高检测效果。ContractWard的有限分析表明,它的模型需要改进以专注于合约运行时的细微特征。总之,本发明方法凭借全面的实例提取方法和精心设计的模型,可以实现卓越的字节码检测。
表6各工具检测准确性对比2(2:1)
②以太坊公有链智能合约漏洞分析示例
为了探索本发明方法的优越性能,本发明展示了以太坊上部署的合约和漏洞事件合约的检测结果。如表7所示,本发明方法发现了其他方法漏报和误报的一些问题。
表7以太坊上合约的审计结果对比
表8描述了漏洞安全事件合约的检测信息,包括安全事件、漏洞名称、合约地址、经济损失、检测结果等。表中显示了本发明方法可以精确检测合约漏洞。
表8漏洞安全事件合约的审计结果对比
③时间及内存开销对比
本发明分析了各以太坊合约分析方法的执行开销。首先,本发明选取了100个大小约为121KB的合约,比如地址为0xce5b23f11c486be7f8be4fac3b4ee6372d7ee91e的合约(3049行)。然后使用oscillo来监控检测这些合约的10种方法的时间和内存开销。如图5所示,基于机器学习(例如本方法和TMP)和基于模式匹配(例如SmartCheck和Slither)的方法通常比符号执行方法(例如Oyente和Mythril)和模糊测试方法(SMARTIAN)需要更少的时间开销。但也有例外,例如,由于DefectChecker的轻量级设计,其时间开销与SmartCheck相似。同时模式分析方法Securify平均需要250s来分析一个121KB的合约,这比Oyente等方法还要多,这可以归因于Securify繁琐的内部检测机制。相反,本发明方法利用机器学习技术平均4.4秒就可以完成一个合约的检测。需要注意的是,大部分的时间开销都是用于提取实例(3.7秒)和加载模型(0.65秒),这些都可以通过程序并行得到进一步优化。此外,模型执行快速推理(30个模型只需要0.05秒),因此扩展模型以检测更多类型漏洞的时间开销同样是较低和可接受的。
如图6所示,由于Oyente等基于符号执行的方法需要遍历和执行数千条搜索路径,因此它们通常需要比基于机器学习和基于模式匹配的方法更多的内存开销。同时,基于大量测试用例的合约的实际运行在基于模糊测试的方法中也会引入了过多的内存消耗。与基于模式匹配的方法内存开销相似,本发明的方法主要由三部分组成:提取的实例、预训练模型以及推理过程中的中间变量。较低的内存开销反映了基于机器学习方法的主要优势,即可以在资源有限的设备中准确地分析合约。此外,这种现象为本发明方法带来了巨大的发展潜力。例如,设备上剩余的空间可以用来部署一条私有链,执行本方法识别到的漏洞操作码序列,从而确保它们可以准确触发漏洞,以进一步提高方法的准确率,降低误报。
④基线模型的选取及评估
除了上述优越的性能外,本发明方法还具有不同的检测能力,因为它的漏洞学习器可以使用各种基线模型。为了说明这个问题,本发明在Dataset_1中的合约上运行了本发明方法和其他10个有监督的机器学习(即深度学习和传统的机器学习)模型。所有模型都在图4所示的框架下运行,并使用包-实例混合注意力机制。此外,Bi2-LSTM和Bi2-GRU分别基于Bi-LSTM和Bi-GRU配备了自模型注意力。表9展示了他们的部分结果和总标准差。
表9结果和总标准差
它反映了以下事实或规律:1.本发明方法可以很好地兼容多种监督模型,无论是深度学习还是传统机器学习。所有模型都取得了令人满意的结果(例如ACC>82%),并且优于TMP(81.84%)中的图神经网络(GNN)、ContractWard(70.06%)中的XGBoost(XGB)。此外,深度学习模型具有强大的迭代学习和泛化能力,这使得它们在海量数据集上的整体效果通常优于传统的机器学习模型。值得注意的是,一些优秀的传统机器学习模型具有良好的性能,例如随机森林(RF)和XGB分别获得了88.87%和87.67%的准确率。更重要的是,它们易于解释,而且大多数都是轻量级的,可以在小型数据集上进行训练。2.在本发明的框架中,更优秀的模型往往会获得更好的效果。例如,深度学习模型的性能排名是Bi2-LSTM>Bi-LSTM>LSTM和Bi2-GRU>Bi-GRU>GRU。此外,基于LSTM的模型略好于基于GRU的模型(例如Bi-LSTM>Bi-GRU),这是因为LSTM比GRU多了一个门控单元并且更容易拟合样本。对于传统的机器学习模型也是这样,例如随机森林优于决策树(DT)。因此,本发明方法可以在未来通过优化或采用更优的模型来进一步提高其性能。3.每个模型都有不同的特点,可以更好地检测到一些漏洞。例如,决策树凭借其便利性和随机性检测实现了88.57%的高召回率,而随机森林通过使用多个决策树进行投票实现了93.85%的高准确率。此外,由于独特的模型结构和推理方式,其他模型在某些漏洞上观察到更多可用的特征,例如针对重入漏洞(reentrancy-eth),卷积神经网络CNN获得了很高的准确率和准确率(ACC=94.47%和P=100%),随机森林获得了最大的召回率和F1分数(R=90.59%和F1=94.48%)。尽管如此,由于能够按顺序感知前后元素,Bi2-LSTM拥有更优越的整体性能,例如ACC=90.04%和F1=85.60%。更重要的是,自注意力机制是定位有缺陷字节码片段和源代码语句的关键。未来随着Captum等工具的发展,其他模型也可以尝试可视化重要性分布,更好地帮助用户。
综上,本发明方法可以采用多个深度学习模型(例如GRU和CNN)和传统机器学习模型(例如RF和SVM)模型作为其检测器,并在可接受的标准偏差下实现令人满意的性能。此外,各种模型为其带来了不同的能力。它可以优化或利用优越的模型来改进其检测指标,合约审计员可以根据时间要求和硬件限制选择不同的模型来完成他们的目标。例如,在硬件资源允许的情况下,本发明方法可以与决策树相结合来识别更多的漏洞,与随机森林相结合来减少人工二次验证的工作量,与Bi2-LSTM相结合,尽可能地兼容这两个需求。
⑤模型参数设置及调整
为了测试不同的超参数对本发明方法性能的影响,以检测reentrancy-eth漏洞为例,更改模型中的各参数设置以测试其检测性能的变化。表10主要展示了实例生产过程中的超参数评估结果。nblock和ncycle的趋势相似。随着它们值的增长,实例的有效长度逐渐增加,这使得模型可以观察到更多的信息以提高ACC等指标。但是,由于实例长度限制为T=512,当有效长度达到最大值时,指标将趋于稳定。同时,它们还随着实例数量nseq的增加而得到改进,因为模型观察到了更多的合约执行路径,有助于他们做出决策。此外,模型输出1/恶意的概率随着nseq的增加而增加,从而在nseq超过临界值时提升召回率并略微降低准确率。对于实例选择策略,选择最长的实例更为实用,因为分类器可以考虑更多的语义信息。
表10实例制作参数分析
本发明还在构建模型时使用了不同的参数测试。如表11所述,ACC等性能指标在T=768时得到改进,而在T=256时降低,这可以归因于分类器关注到更多可用信息有利于做出决策。请注意,实例并不是越长越好,因为过多的字节可能会稀释有效信息并产生相反的效果。epoch也有类似的趋势,随着训练轮数的增加,模型逐渐收敛。但是,过多的轮次可能会导致过拟合问题。较低的λ使得模型专注于整体合约标签的学习,更倾向于提高检测ACC。相反,它偏向于对个体实例的检测,这样会发现更多的漏洞,但不可避免地会出现一些FP,从而导致ACC下降。此外,qb和qm可以在迭代过程中调整良性和恶意实例的数量,较大的qb可以增强良性实例的学习。同时较大的qm提高了召回率,但降低了准确率,这归因于漏洞合约中的正常实例被错误标记。最后,神经元数量对检测结果的影响不明显,适当的取值可以缓解过拟合问题。值得注意的是,这些实验中的检测时间和内存开销相对稳定,并且对设备的要求较低。因此,检测器可以根据它们的要求(例如偏向于精度或召回率)和硬件限制在实例提取和模型构建过程中选定/分配合适的参数。
表11检测模型参数分析
⑤在源代码和字节码级别助力合约漏洞分析和策略研制
合约检查的最终目的是修复潜在的合约安全威胁,而不仅仅是发现它们。然而,当前基于机器学习的方法忽略了这一意图,只能输出合约是否存在漏洞。为此,本发明方法准确识别漏洞,并输出特定的缺陷源代码语句、关键操作码片段和合约的漏洞执行序列,以及通用的修复方法,为合约开发人员提供卓越见解和建议指导。
The Dao漏洞事件。如图8所示,第3-6行的代码描述了合约函数“withdrawRewardFor”的实现。由于特征表示的多样性,本发明方法从十个合约执行序列中识别出两个具有可重入特征的序列,而Mythril、SMARTIAN和TMP等方法则不能完成此操作。图7(a)可视化重入漏洞(reentrancy-eth)检测器针对输入实例的注意力权重分布,本发明方法分别从两个有缺陷的实例中得到关键操作码CALL(权重99.94%)和CALL(权重89.55%)。然后它通过映射ASM文件定位到合约源码中相应有缺陷的语句“msg.sender.call.value”。攻击者可以针对该语句进行攻击,同时审计人员可以通过更改该语句来修复漏洞。同时,从字节码角度,审计者或攻击者可以围绕关键操作码获得有缺陷的交集子实例序列[PUSH1 0x14,SLOAD,PUSH10x16,SLOAD...MLOAD...GAS CALL...0x16SSTORE...0x14 SSTORE],可以表示一些关于漏洞的有用信息。其中,0x14、0x16分别对应状态变量“balances”、“totalSupply”的Slot ID。通过对这些操作码的分析,可以总结出reentrancy-eth漏洞的三个特点:1.CALL指令消耗的GAS不受限制,即没有具体的值2300,代表它属于一个call().value()函数;2.由MLOAD指令加载的变量“reward”不是常数零;3.具有相同Slot ID的状态变量在调用call函数之前被读取,并在执行call函数后被更新。
根据以上特点,攻击者可以创建图7中所示的攻击合约DAOAtack。它可以通过调用函数“ReAttack()”一次又一次地执行“splitDAO()”来触发回退函数,导致三个状态变量“balances”、“totalSupply”、“paidOut”没有及时更新(即第6-8行暂时无效)。因此,该金额可以持续提取,直到合约余额变为零或GAS耗尽。为了修复该漏洞,合约开发者可以将SSTORE指令的位置提前到CALL指令之前,防止攻击者进行二次调用。此外,建议合约开发者使用``transfer()”函数而不是``call().value()”,因为它可以限制2300的GAS开销并在传输错误时回滚所有交易。相似地,根据定位到的缺陷代码语句也可以得到等效的源代码特征。尽管如此,鉴于以太坊上的大多数合约只公开了字节码,在字节码级别观察有用的信息可能有点难以理解但更有意义。值得注意的是基于模式匹配、符号执行和模糊测试的合约分析工具可以进一步使用关键字节码或源代码片段、分布来制定和改进漏洞检测规则/逻辑/预言Oracle。
为了修复该漏洞,开发者可以将SSTORE指令的位置提前到CALL指令之前,防止攻击者}进行二次重入调用。此外,建议他们在源代码中使用transfer()函数而不是call.value(),从而可以限制2300的GAS开销,并在转账失败时回滚所有交易。此外,本发明方法生成的分析报告包含漏洞描述、位置、关键字节码分布和通用修复方法示例等附加信息,能够帮助他们更方便地开发定制化的漏洞修复策略。
block-other-parameters漏洞检测。合约Revolution(4.74E+13Wei)是以太坊上的一个活跃的合约。部分源码如图9所示。如图7(b)所示,本发明方法识别出6个具有区块参数依赖(block-other-parameters)漏洞特征的执行序列,并且分别以权重[84.28%,84.28%,3.94%,3.94%,84.28%,84.28%]准确地发现函数closingLottery()使用了区块参数变量的操作码。同时,围绕关键操作码的公共子序列为[ISZERO,EXP,DIFFICULTY,TIMESTAMP,SHA3...MOD...PUSH1 0x8,SLOAD,PUSH1 0x7,SLOAD,NUMBER,SUB...LT,ISZERO...DIV,MUL]。其中,0x8和0x7分别代表存储变量“trials”和“trial”的地址。两个变量都需要使用SLOAD指令从存储中读取。此外,该函数使用DIFFICULTY和NUMBER等与区块相关的指令来生成随机数。由于这些变量可以被矿工和节点提前知道,因此可以进一步推断随机数,进而破坏合约的公平性以及丢失余额。因此,与上述情况类似,本发明方法会报告源代码和字节码中的这些缺陷的位置,并建议开发人员1.将业务数据作为随机数生成器的种子;2.选择多个伪随机数据的组合;3.使用在线或离线随机预言机。
此外,本发明方法还检测到了Pets合约(2.50E+16Wei)中的漏洞,而SmartCheck和TMP等方法都漏掉了。该合约使用block.number在“getRandomNumber”函数(第81行)中生成随机数,这使得攻击者可以通过与节点合作提前预测随机数。合约所有者在合约开发过程中需要避免这些问题。值得注意的是,由于本发明方法专注于合约执行路径(即操作码序列或实例),可以基于符号执行方法(例如Oyente)构建漏洞路径的符号约束,进而利用Z3求解器计算这些约束以验证路径是否可行,并获得恢复攻击路径的输入。例如,本发明可以使用通过整数溢出漏洞(integer-overflow)路径约束求解的输入来调用合约,从而导致数值溢出并获得意想不到的结果。这些功能都是现有基于机器学习方法无法实现的。
本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
Claims (11)
1.一种基于多示例和注意力机制的智能合约分析方法,其特征在于,所述方法包括:
获取智能合约的操作码;
基于所述操作码,构建所述智能合约的程序控制流图;
对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例;
对所述实例进行编码,并基于注意力机制的双向长短期循环神经网络对编码结果进行分类,以得到该实例的安全结论以及权重;
基于各实例的安全结论以及权重,得到所述智能合约的分析结果。
2.如权利要求1所述的方法,其特征在于,所述获取智能合约的操作码,包括:
将智能合约的源代码编译成字节码;
使用Geth提供的API对所述字节码,以得到智能合约的操作码。
3.如权利要求1所述的方法,其特征在于,所述基于所述操作码,构建所述智能合约的程序控制流图,包括:
将所述操作码拆分为若干个基本块;其中每一基本块表示为一个没有分支的代码序列;
根据所述代码序列的退出指令定义基本块的类型;所述类型包括:条件块、终端块和无条件块;
基于以太坊虚拟机堆栈对每个基本块中的指令执行符号推理,将条件块划分为有条件跳转块和无条件跳转块;
依据各基本块的类型,构建所述智能合约的程序控制流图。
4.如权利要求3所述的方法,其特征在于,所述对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例,包括:
在所述程序控制流图获得没有输入的初始块;
从所述初始块执行深度优先遍历;
在遍历过程中出现连续的ncycle个基本块为已搜索过的基本块的情况下,结束遍历,并基于当前的操作码序列生成一实例;
在遍历过程中的路径长度超过限制数量的情况下,结束遍历,并基于当前的操作码序列生成一实例;
在遍历过程中触及终端块的情况下,结束遍历,并基于当前的操作码序列生成一实例。
5.如权利要求1所述的方法,其特征在于,训练所述基于注意力机制的双向长短期循环神经网络,包括:
构建原始数据集;所述原始数据集由若干个合约样本组成;
获取所述合约样本中的实例样本;
通过将实例样本中的操作码转换成字节码,得到实例样本编码结果;
基于注意力机制的双向长短期循环神经网络的Bi-LSTM层,构建所述实例样本编码结果的向量矩阵H;
基于注意力机制的双向长短期循环神经网络的注意力层,对所述向量矩阵H进行注意力计算,以得到用于分类的最终序列对表示h*和该实例样本的权重向量;
基于注意力机制的双向长短期循环神经网络的分类器,对所述最终序列对表示h*进行分类,得到该实例的分类结果;
根据所述分类结果计算交叉熵损失,以更新所述注意力机制的双向长短期循环神经网络;
基于更新后的注意力机制的双向长短期循环神经网络,对原始数据集进行优化,并返回至所述构建原始数据集;
直至训练周期结束,得到训练后的注意力机制的双向长短期循环神经网络。
6.如权利要求1所述的方法,其特征在于,所述基于各实例的安全结论以及权重,得到所述智能合约的分析结果,包括:
获取所述智能合约的汇编语言源码;
针对所述安全结论为存在漏洞的实例,计算最大的m个权重值的索引向量并提取相应的关键操作码;
获取所述关键操作码在所述汇编语言源码中的起始位置和终止位置,以得到所述智能合约的缺陷代码语句;
根据各实例的安全结论,得到漏洞执行序列;
基于各实例的所述关键操作码、缺陷代码语句和漏洞执行序列,生成所述智能合约的分析结果。
7.如权利要求6所述的方法,其特征在于,所述方法还包括:
基于漏洞执行序列构建符号约束;
利用可满足性模理论求解器对符号约束进行计算,得到该实例的符号约束参数;
基于所述符号约束参数,验证该实例的约束路径是否满足可行性;
在满足可行性的情况下,基于符号约束与符号约束参数,识别漏洞还原和异常调用行为;
在不满足可行性的情况下,判定该安全结论中的漏洞为误报。
8.如权利要求1所述的方法,其特征在于,所述基于各实例的安全结论以及权重,得到所述智能合约的分析结果,包括:
构建合约漏洞-严重性表-通用漏洞修复示例;其中,严重性包括:High、Medium、Low、Info和Opt;
针对所述安全结论中漏洞类型,得到所述实例的漏洞严重性和通用的漏洞修复示例,以生成所述智能合约的分析结果。
9.一种基于多示例和注意力机制的智能合约分析装置,其特征在于,所述装置包括:
数据获取模块,用于获取智能合约的操作码;
流图构建模块,用于基于所述操作码,构建所述智能合约的程序控制流图;
实例生成模块,用于对所述程序控制流图执行深度优先遍历,以得到由T个操作码组成的实例;
实例分析模块,用于对所述实例进行编码,并基于注意力机制的双向长短期循环神经网络对编码结果进行分类,以得到该实例的安全结论以及权重;
结果生成模块,用于基于各实例的安全结论以及权重,得到所述智能合约的分析结果。
10.一种电子设备,其特征在于,所述电子设备包括:处理器以及存储有计算机程序指令的存储器;所述处理器执行所述计算机程序指令时实现如权利要求1-8任一项所述方法。
11.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现如权利要求1-8任一项所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310167280.4A CN116361806A (zh) | 2023-02-27 | 2023-02-27 | 基于多示例和注意力机制的智能合约分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310167280.4A CN116361806A (zh) | 2023-02-27 | 2023-02-27 | 基于多示例和注意力机制的智能合约分析方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116361806A true CN116361806A (zh) | 2023-06-30 |
Family
ID=86912458
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310167280.4A Pending CN116361806A (zh) | 2023-02-27 | 2023-02-27 | 基于多示例和注意力机制的智能合约分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116361806A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820405A (zh) * | 2023-08-31 | 2023-09-29 | 浙江大学 | 一种基于复用分析的evm字节码控制流图构建方法 |
-
2023
- 2023-02-27 CN CN202310167280.4A patent/CN116361806A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820405A (zh) * | 2023-08-31 | 2023-09-29 | 浙江大学 | 一种基于复用分析的evm字节码控制流图构建方法 |
CN116820405B (zh) * | 2023-08-31 | 2023-12-01 | 浙江大学 | 一种基于复用分析的evm字节码控制流图构建方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Tann et al. | Towards safer smart contracts: A sequence learning approach to detecting security threats | |
Zhuang et al. | Smart contract vulnerability detection using graph neural networks | |
Harer et al. | Automated software vulnerability detection with machine learning | |
Nix et al. | Classification of Android apps and malware using deep neural networks | |
Le et al. | Deep specification mining | |
Zhang et al. | Ethploit: From fuzzing to efficient exploit generation against smart contracts | |
Wang et al. | In-memory fuzzing for binary code similarity analysis | |
Huang et al. | Hunting vulnerable smart contracts via graph embedding based bytecode matching | |
CN112800423B (zh) | 一种二进制代码授权漏洞检测方法 | |
Wei et al. | Singularity: Pattern fuzzing for worst case complexity | |
Saccente et al. | Project achilles: A prototype tool for static method-level vulnerability detection of Java source code using a recurrent neural network | |
Jeon et al. | AutoVAS: An automated vulnerability analysis system with a deep learning approach | |
Sendner et al. | Smarter Contracts: Detecting Vulnerabilities in Smart Contracts with Deep Transfer Learning. | |
Ferrag et al. | Securefalcon: The next cyber reasoning system for cyber security | |
CN114969755A (zh) | 一种跨语言的未知可执行程序二进制漏洞分析方法 | |
CN116361806A (zh) | 基于多示例和注意力机制的智能合约分析方法及装置 | |
Wei et al. | Toward identifying APT malware through API system calls | |
Alrabaee | A stratified approach to function fingerprinting in program binaries using diverse features | |
Dahl et al. | Stack-based buffer overflow detection using recurrent neural networks | |
Baldoni et al. | Unsupervised features extraction for binary similarity using graph embedding neural networks | |
Liu et al. | A smart contract vulnerability detection mechanism based on deep learning and expert rules | |
Fan et al. | VDoTR: vulnerability detection based on tensor representation of comprehensive code graphs | |
Ngo et al. | Ranking warnings of static analysis tools using representation learning | |
Mi et al. | An automated vulnerability detection framework for smart contracts | |
Tang et al. | SeVulDet: A semantics-enhanced learnable vulnerability detector |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |