CN116089957A - 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 - Google Patents
一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 Download PDFInfo
- Publication number
- CN116089957A CN116089957A CN202211710575.3A CN202211710575A CN116089957A CN 116089957 A CN116089957 A CN 116089957A CN 202211710575 A CN202211710575 A CN 202211710575A CN 116089957 A CN116089957 A CN 116089957A
- Authority
- CN
- China
- Prior art keywords
- grammar
- vector
- intelligent contract
- abstract syntax
- control flow
- 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
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/33—Querying
- G06F16/3331—Query processing
- G06F16/334—Query execution
- G06F16/3344—Query execution using natural language analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/30—Information retrieval; Database structures therefor; File system structures therefor of unstructured textual data
- G06F16/35—Clustering; Classification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/253—Grammatical analysis; Style critique
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/30—Semantic analysis
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Artificial Intelligence (AREA)
- Software Systems (AREA)
- Health & Medical Sciences (AREA)
- Computer Security & Cryptography (AREA)
- Computer Hardware Design (AREA)
- Data Mining & Analysis (AREA)
- General Health & Medical Sciences (AREA)
- Audiology, Speech & Language Pathology (AREA)
- Computing Systems (AREA)
- Databases & Information Systems (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Molecular Biology (AREA)
- Mathematical Physics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种基于语法和语义特征融合的智能合约漏洞检测方法及装置,首先,收集数据集与数据预处理,获取以太坊智能合约,使用加权随机采样方法平衡训练数据集;其次,通过Python中的第三方软件包py‑solc‑x和evm_cfg_builder将智能合约源代码转化为抽象语法树和控制流图,运用卷积神经网络和图神经网络从抽象语法树和控制流图中提取合约的语法特征和语义特征;最后,对语法特征和语义特征进行拼接得到语法和语义特征融合向量,利用融合向量对智能合约进行漏洞检测。语法和语义融合向量能够较为准确地描述智能合约中与漏洞相关的特征,模型从中学习漏洞模式,从而有效、快速的检测出智能合约漏洞。
Description
技术领域
本发明涉及区块链和信息安全技术领域,尤其涉及一种基于语法和语义特征融合的智能合约漏洞检测方法及装置。
背景技术
智能合约由Nick Szabo于1995年提出,定义为“执行合约条款的计算机交易协议”。智能合约以数字形式定义一个合同,当合约参与方满足合约所需的条件时,合约就会自动执行。与传统合约相比,智能合约可以提高交易效率,具有去中心化、不可篡改等特性。智能合约提供了优于传统合约的安全方法,但如其他编程语言一样,智能合约也存在着一些安全漏洞。在以太坊上,绝大部分智能合约负责管理用户的数字资产交易,如果智能合约存在漏洞将会造成数字资产的损失。同时区块链不可篡改的特性使得智能合约一旦产生漏洞就很难修复,因此在智能合约部署上链之前对其进行漏洞检测具有必要性。
早期的漏洞检测方法按照检测时是否执行代码分为静态分析和动态分析两种方法。静态分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行自动扫描,发现隐含的程序问题;动态分析方法借助调试器工具,在调试器中运行目标程序,对运行程序的运行状态、内存使用状况和执行路径进行分析,从而发现程序中存在的漏洞。静态分析和动态分析两种方法对智能合约进行检测时都需要依赖专家预先人工定义的规则,检测效率低、时间长。近年来,考虑到深度学习在特征学习方面的优异特性,研究人员开始使用深度学习方法进行漏洞检测,自动从源代码中提取有效特征,不再需要依赖于专家定义的漏洞特征。目前的方法多集中在对源代码单一特征表示的研究,一些模型直接使用程序源代码或二进制文件作为输入,提取与字符流相关的标识符、函数名和运算符等关键特征信息;或将源代码转为抽象语法树,从抽象语法树中提取源代码的语法特征。但由于源代码中特征具有多样性,对源代码进行单一的代码表征不能保留其丰富的语法和语义信息,因此在运用深度学习方法进行漏洞检测时需要考虑如何构建合适的数据表征方式最大程度的提取与漏洞相关的特征信息。
发明内容
本发明的目的是提供一种基于语法和语义特征融合的智能合约漏洞检测方法及装置,解决目前智能合约漏洞检测模型中代码表征单一的问题,以联合方式提取智能合约源代码特征,增强代码表征能力,提高智能合约漏洞检测的准确性。
为了实现上述目的,本发明采用以下技术方案:
本发明一方面提出一种基于语法和语义特征融合的智能合约漏洞检测方法,包括:
步骤1:收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
步骤2:将智能合约源代码转为抽象语法树(Abstract Syntax Tree,AST)形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
步骤3:将源代码编译为字节码,通过字节码获取智能合约的控制流图(ControlFlow Graph,CFG),使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
步骤4:使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
步骤5:获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
进一步地,所述步骤1中,加权随机采样方法包括:
计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
进一步地,所述步骤2包括:
步骤2.1:获取智能合约的抽象语法树:使用python第三方软件包py-solc-x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
步骤2.2:对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
步骤2.3:对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
步骤2.4:对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
步骤2.5:对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
进一步地,所述步骤3包括:
步骤3.1:获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
步骤3.2:控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
步骤3.3:通过TF-IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
进一步地,所述步骤4包括:
步骤4.1:将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
步骤4.2:使用Text CNN提取抽象语法树的语法特征,包括:
1)输入抽象语法树特征向量;
2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
步骤4.3:使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;
步骤4.4:将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;
步骤4.5:将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
步骤4.6:对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
本发明另一方面提出一种基于语法和语义特征融合的智能合约漏洞检测装置,包括:
数据获取与数据预处理模块,用于收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
语法表征学习模块,用于将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
语义表征学习模块,用于将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
模型学习模块,用于使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
漏洞检测模块,用于获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
进一步地,所述数据获取与数据预处理模块中,加权随机采样方法包括:
计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
进一步地,所述语法表征学习模块具体用于:
获取智能合约的抽象语法树:使用python第三方软件包py-solc-x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
进一步地,所述语义表征学习模块具体用于:
获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
通过TF-IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
进一步地,所述模型学习模块具体用于:
将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
使用Text CNN提取抽象语法树的语法特征,包括:
1)输入抽象语法树特征向量;
2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;
将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;
将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
与现有技术相比,本发明具有的有益效果:
本发明通过智能合约的抽象语法树和控制流图提取特征获取智能合约的语法和语义特征,通过语法和语义融合向量构造特征空间。首先,收集数据集与数据预处理。获取以太坊智能合约,使用加权随机采样方法平衡训练数据集。其次,通过Python中的第三方软件包py-solc-x和evm_cfg_builder将智能合约源代码转化为抽象语法树和控制流图,运用卷积神经网络和图神经网络从抽象语法树和控制流图中提取合约的语法特征和语义特征。最后,对语法特征和语义特征进行拼接得到语法和语义特征融合向量,利用融合向量对智能合约进行漏洞检测。语法和语义融合向量能够较为准确地描述智能合约中与漏洞相关的特征,模型从中学习漏洞模式,从而有效、快速的检测出智能合约漏洞。
附图说明
图1为本发明实施例一种基于语法和语义特征融合的智能合约漏洞检测方法的流程示意图;
图2为本发明实施例抽象语法树示例;
图3为本发明实施例控制流图示例;
图4为本发明实施例一种基于语法和语义特征融合的智能合约漏洞检测装置的结构示意图。
具体实施方式
下面结合附图和具体的实施例对本发明做进一步的解释说明:
如图1所示,一种基于语法和语义特征融合的智能合约漏洞检测方法,包括以下步骤:
步骤A:收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
步骤B:将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
步骤C:将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
步骤D:使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
步骤E:获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
进一步地,步骤A包括:
收集数据集,获取数据集漏洞标签,对数据进行预处理;对于数据集D={D1,…,Dn},n为智能合约数量,标签集Y={Y1,…,Yn},Yi∈{0,1},Yii为0表示智能合约不存在漏洞,Yii为1表示智能合约存在漏洞。数据集中的正负样本比例不同,若无漏洞的源代码数量与有漏洞的源代码数量之比大于2。则使用加权随机采样方法处理数据集以平衡正负样本数量。具体来说,计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
进一步地,步骤B中,获取源代码的抽象语法树,并对抽象语法树规范化、序列化和向量化。抽象语法树可以保留源代码的语法结构信息,表示每个语句的语法和细节信息,例如定义的函数数量、变量类型等。利用抽象语法树进行特征提取,可以获取到比源代码文本更多的语法特征。
所述的步骤B包含以下具体步骤:
B1:获取智能合约的抽象语法树:使用py-solc-x(python第三方软件包)构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树,如图2所示;
B2:对抽象语法树进行规范化。抽象语法树中包含用户定义的合约名称、函数名称、变量名称和变量值,并且在不同的合约中用户定义的名称和值都不相同,这会影响漏洞检测的准确率,因此需要对抽象语法树进行规范化。规范化的具体操作为:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
B3:对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列。抽象语法树的token序列与源代码的token序列相比,其token数量通常更多。为了更利于模型训练,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
B4:对合约的抽象语法树进行向量化:智能合约源代码通常是文本表示,不能直接用于深度神经网络模型进行训练。运用Word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
B5:由于合约源代码长度不同,转换后的特征向量具有不同长度,因此需要对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量。当向量长度小于L时用零填充,向量长度大于L时进行截断。
进一步地,步骤C中,获取智能合约的控制流图和控制流图的节点特征。控制流图以过程为导向,能够反映一个过程中所有基本块的许多信息和执行流向。通过控制流图可以遍历函数所有的执行路径,发现程序中存在的控制依赖和数据依赖。
所述的步骤C包含以下具体步骤:
C1:获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过evm_cfg_builder(python第三方软件包)将opcode转换为控制流图,如图3所示;
C2:控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
C3:通过TF-IDF加权平均词向量获取控制流图的节点特征;具体是将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
进一步地,步骤D中,通过步骤B和步骤C获取到源代码的抽象语法树和控制流图的向量化表示后,训练模型提取源代码的语法特征和语义特征,融合语法特征和语义特征进行漏洞检测。
所述的步骤D包含以下具体步骤:
D1:在语法表征阶段获取到的抽象语法树为file级别,语义表征中获取到的控制流图为contract级别,在获取抽象语法树的语法特征时先将整个抽象语法树进行拆分,将智能合约的抽象语法树拆分为多个小的contract抽象语法树;
D2:使用Text CNN提取抽象语法树的语法特征,D1步骤具体如下:
(1)输入抽象语法树特征向量;
(2)定义多个一维卷积核,分别对输入向量执行卷积计算,具有不同宽度的卷积核能够捕获不同数目的相邻词元之间的局部特征;
(3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量T_i(1≤i≤n);
D3:使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,图嵌入向量能够保留控制流图的整体结构信息和源代码的语义信息,该向量作为源代码的语义特征向量;使用消息传递机制进行图训练,消息传递机制分为的公式如下:
h表示图节点的特征向量,下标v或u表示节点的索引,上标t表示图神经网络的第t层,g表示控制流图的语义特征;
D4:将对应的语法特征向量Ti(1≤i≤n)和语义特征向量Gi(1≤i≤n)进行拼接,得到特征向量Vi(1≤i≤n);
D5:将拼接后的特征向量Vi输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
D6:对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
进一步地,步骤E包括:
在训练得到漏洞检测模型后,对待检测智能合约进行漏洞检测。检测阶段首先对测试合约执行步骤B和步骤C,通过获取AST、CFG、AST标准化、AST序列化并利用学习到的嵌入矩阵,得到源代码的抽象语法树特征向量和控制流图节点特征,然后运用模型学习阶段获取的漏洞检测模型,将该向量和特征作为输入,对智能合约进行检测,判断是否存在漏洞(“1”)或无漏洞(“0”)。
为验证本发明效果,进行如下实验:
作为一种可实施方式,本方法使用Eth2Vec数据集进行模型训练。Eth2Vec数据集包含5000份真实以太坊环境中的智能合约文件,共有22879份智能合约源代码。Eth2Vec数据集的6种漏洞类型标记结果如表1所示,可以观察到数据集中的正负样本比例相差较大。未声明可见性与算术运算漏洞正负样本数量较均衡,其他三种类型漏洞的正负样本比例相差较大。重入漏洞和时间戳依赖的数据集最不均衡,正例样本数不足400。不平衡的数据集会影响模型的训练结果,不利于模型学***衡样本数量。
表1数据集比例
本方法在智能合约漏洞检测上的实验结果和性能比较。为了验证模型的性能,将本方法与目前的检测方法进行比较。首先,本专利方法与传统的漏洞检测方法比较。Conkas是一个智能合约静态分析工具,使用符号执行检测漏洞。Conkas可以检测Arithmetic、Timestamp Dependency和Re-Entrancy Vulnerability等漏洞类型。其次,与基于深度学***衡,但可学习到的漏洞特征依然太少,所以对Reentrancy漏洞检测的召回率相较于其他漏洞类型偏低。整数上溢和整数下溢漏洞的召回率达到97.79%和88.51%,性能分别提升10.28%和13.31%。
表2模型总体性能
为了验证语法表征部分(步骤B)对抽象语法树语法特征提取的有效性,该模块与LSTM-AST、GRU-AST进行了比较。将模型中的语法特征提取部分替换为LSTM和RNN,其他部分保持不变。LSTM-AST表示用LSTM替换语法表征中的特征提取部分,提取抽象语法树的语法特征。GRU-AST表示用GRU提取抽象语法树的语法特征。在源代码的语法特征提取中,考虑到源代码的AST序列较长且词序信息不明显,我们选择TextCNN进行语法特征提取。实验结果如表3所示,语法表征部分相比于替换后的模型在implicitVisibility、integerOverflow、IntegerUnderflow漏洞检测上精度和召回率提升2%-7%。在TimeDependency和Reentrancy漏洞检测上精度分别提升了8%和22%,召回率提升了5%和8%。实验结果表明,语法表征部分能够有效的获取源代码的语法特征,与序列模型相比,其在AST语法特征提取方面获得了更均衡和稳定的性能。
表3语法表征结果
将单代码表征与多特征代码表征进行比较,以验证每个方法步骤的有效性和融合代码表征的有效性。验证语法表征部分的有效性时仅使用源代码的抽象语法树进行语法表征进行漏洞检测。对语义表征部分(步骤3)的有效性验证,同样只使用模型中的语义表征部分对控制流图进行特征提取,通过源代码的控制流图表示形式进行漏洞检测。实验结果如表4所示。使用抽象语法树比使用控制流图进行漏洞检测的表现要更好,其在四个指标上都高于控制流图。这是因为在语义表征部分中,在将每个块的语义信息表示为一个固定长度的特征向量时丢失了一部分特征信息。另外,多特征代码表征在召回率指标上提升最多,模型在正确识别漏洞代码上具有更高的性能和准确性。使用抽象语法树和控制流图进行融合学习实现了最高的精度和召回率,这验证了本专利方法提出的语法表征和语义表征部分可以捕获源代码的更多特征以进行漏洞检测。
表4融合代码表征结果
在上述实施例的基础上,如图4所示,本发明另一方面提出一种基于语法和语义特征融合的智能合约漏洞检测装置,包括:
数据获取与数据预处理模块,用于收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
语法表征学习模块,用于将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
语义表征学习模块,用于将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
模型学习模块,用于使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
漏洞检测模块,用于获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
进一步地,所述数据获取与数据预处理模块中,加权随机采样方法包括:
计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
进一步地,所述语法表征学习模块具体用于:
获取智能合约的抽象语法树:使用python第三方软件包py-solc-x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
进一步地,所述语义表征学习模块具体用于:
获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
通过TF-IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
进一步地,所述模型学习模块具体用于:
将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
使用Text CNN提取抽象语法树的语法特征,包括:
1)输入抽象语法树特征向量;
2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;
将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;
将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
综上,本发明通过智能合约的抽象语法树和控制流图提取特征获取智能合约的语法和语义特征,通过语法和语义融合向量构造特征空间。首先,收集数据集与数据预处理。获取以太坊智能合约,使用加权随机采样方法平衡训练数据集。其次,通过Python中的第三方软件包py-solc-x和evm_cfg_builder将智能合约源代码转化为抽象语法树和控制流图,运用卷积神经网络和图神经网络从抽象语法树和控制流图中提取合约的语法特征和语义特征。最后,对语法特征和语义特征进行拼接得到语法和语义特征融合向量,利用融合向量对智能合约进行漏洞检测。语法和语义融合向量能够较为准确地描述智能合约中与漏洞相关的特征,模型从中学习漏洞模式,从而有效、快速的检测出智能合约漏洞。
以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,包括:
步骤1:收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
步骤2:将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
步骤3:将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
步骤4:使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
步骤5:获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
2.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤1中,加权随机采样方法包括:
计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
3.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤2包括:
步骤2.1:获取智能合约的抽象语法树:使用python第三方软件包py-solc-x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
步骤2.2:对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
步骤2.3:对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
步骤2.4:对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
步骤2.5:对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
4.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤3包括:
步骤3.1:获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
步骤3.2:控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
步骤3.3:通过TF-IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
5.根据权利要求1所述的一种基于语法和语义特征融合的智能合约漏洞检测方法,其特征在于,所述步骤4包括:
步骤4.1:将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
步骤4.2:使用Text CNN提取抽象语法树的语法特征,包括:
1)输入抽象语法树特征向量;
2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
步骤4.3:使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;
步骤4.4:将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;
步骤4.5:将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
步骤4.6:对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
6.一种基于语法和语义特征融合的智能合约漏洞检测装置,其特征在于,包括:
数据获取与数据预处理模块,用于收集智能合约源代码,分别统计存在漏洞的智能合约的数量与不存在漏洞的智能合约的数量,若无漏洞合约数量与有漏洞合约数量之比大于2,则使用加权随机采样方法平衡智能合约数据集;
语法表征学习模块,用于将智能合约源代码转为抽象语法树形式,经过标准化和序列化操作将抽象语法树转化为token序列,使用词嵌入模型Word2vec对token序列的每个token进行嵌入表示;
语义表征学习模块,用于将源代码编译为字节码,通过字节码获取智能合约的控制流图,使用Word2vec向量化控制流图节点中的每个操作码,然后对控制流图节点的操作码加权求和获取控制流图的节点特征;
模型学习模块,用于使用文本分类模型Text CNN从抽象语法树token序列中获取语法特征;使用图神经网络学习控制流图的语义和结构嵌入获取语义特征;结合语法向量和语义向量,利用多层感知机对语法和语义特征融合向量进行学习以训练检测器;
漏洞检测模块,用于获取待检测合约的抽象语法树和控制流图,利用嵌入矩阵和训练得到的检测器实现智能合约源代码的漏洞检测。
7.根据权利要求5所述的一种基于语法和语义特征融合的智能合约漏洞检测装置,其特征在于,所述数据获取与数据预处理模块中,加权随机采样方法包括:
计算每个智能合约的权重,权重为该合约所对应的类别的合约总数的倒数,然后利用每个合约的权重值对合约进行采样,构造数据集。
8.根据权利要求5所述的一种基于语法和语义特征融合的智能合约漏洞检测装置,其特征在于,所述语法表征学习模块具体用于:
获取智能合约的抽象语法树:使用python第三方软件包py-solc-x构建智能合约的抽象语法树,将智能合约源代码转换为树状结构的抽象语法树;
对抽象语法树进行规范化:获取智能合约中用户定义的合约名称列表、函数名称列表和变量名称列表,将用户定义的合约名称、函数名称、变量名称表示为contract_c、function_f、var_v,c、f、v表示合约名称、函数名称、变量名称在列表中的索引,并在抽象语法树中进行替换;
对合约的抽象语法树进行序列化:按照深度优先遍历抽象语法树的所有节点,将树状结构的抽象语法树转化为token序列,在进行序列化操作时仅保留抽象语法树的一些关键信息,忽略表示代码位置、节点id的一些次要信息;
对合约的抽象语法树进行向量化:运用word2vec将智能合约源代码对应的token序列向量化,将每个token表示为一个具有相同维度的向量,从而将序列化后的抽象语法树表示为向量形式,得到抽象语法树特征向量;
对特征向量进行截断和填充,将其表示为一个具有固定长度L的向量,当向量长度小于L时用零填充,向量长度大于L时进行截断。
9.根据权利要求5所述的一种基于语法和语义特征融合的智能合约漏洞检测装置,其特征在于,所述语义表征学习模块具体用于:
获取智能合约的控制流图:首先将智能合约编译为opcode,然后通过python第三方软件包evm_cfg_builder将opcode转换为控制流图;
控制流图中的每个块包含了源代码的操作码,通过Word2vec对操作码进行词嵌入表示,获得每个操作码的向量表示;
通过TF-IDF加权平均词向量获取控制流图的节点特征:将每个操作码按照TF-IDF获取权重,根据权重将控制流图节点的操作码加权平均,控制流图的每个节点得到一个固定长度的向量,将该向量作为图节点的特征。
10.根据权利要求5所述的一种基于语法和语义特征融合的智能合约漏洞检测装置,其特征在于,所述模型学习模块具体用于:
将智能合约的抽象语法树拆分为多个小的contract级别的抽象语法树;
使用Text CNN提取抽象语法树的语法特征,包括:
1)输入抽象语法树特征向量;
2)定义多个不同宽度的一维卷积核,分别对输入向量执行卷积计算,捕获不同数目的相邻词元之间的局部特征;
3)在所有输出通道上执行自适应平均池化,然后将所有标量汇聚输出连接为向量,最终获得智能合约的语法特征向量;
使用图神经网络对控制流图进行图嵌入表示,得到代表整个控制流图的图嵌入向量,将该向量作为源代码的语义特征向量,使用消息传递机制进行图训练;
将对应的语法特征向量和语义特征向量进行拼接,得到语法和语义特征融合向量;
将语法和语义特征融合向量输入多层感知机进行二分类,“0”为无漏洞,“1”为有漏洞;
对模型训练多次,不断调整和优化模型参数,得到一个性能较优的漏洞检测模型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211710575.3A CN116089957A (zh) | 2022-12-29 | 2022-12-29 | 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211710575.3A CN116089957A (zh) | 2022-12-29 | 2022-12-29 | 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116089957A true CN116089957A (zh) | 2023-05-09 |
Family
ID=86201937
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211710575.3A Pending CN116089957A (zh) | 2022-12-29 | 2022-12-29 | 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116089957A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116578988A (zh) * | 2023-05-23 | 2023-08-11 | 海南大学 | 一种智能合约的漏洞检测方法和装置、存储介质 |
CN116628707A (zh) * | 2023-07-19 | 2023-08-22 | 山东省计算中心(国家超级计算济南中心) | 一种可解释性的基于多任务的源代码漏洞检测的方法 |
CN116702157A (zh) * | 2023-06-21 | 2023-09-05 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
CN117473170A (zh) * | 2023-12-27 | 2024-01-30 | 布比(北京)网络技术有限公司 | 基于代码表征的智能合约模版推荐方法、装置及电子设备 |
CN117573084A (zh) * | 2023-08-02 | 2024-02-20 | 广东工业大学 | 一种基于逐层融合抽象语法树的代码补全方法 |
CN117574214A (zh) * | 2024-01-15 | 2024-02-20 | 中科链安(北京)科技有限公司 | 智能合约分类模型训练方法、智能合约分类方法及装置 |
CN117614681A (zh) * | 2023-11-24 | 2024-02-27 | 烟台大学 | 智能合约的重入漏洞检测方法、***、设备和存储介质 |
-
2022
- 2022-12-29 CN CN202211710575.3A patent/CN116089957A/zh active Pending
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116578988A (zh) * | 2023-05-23 | 2023-08-11 | 海南大学 | 一种智能合约的漏洞检测方法和装置、存储介质 |
CN116578988B (zh) * | 2023-05-23 | 2024-01-23 | 海南大学 | 一种智能合约的漏洞检测方法和装置、存储介质 |
CN116702157A (zh) * | 2023-06-21 | 2023-09-05 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
CN116702157B (zh) * | 2023-06-21 | 2023-12-26 | 烟台大学 | 一种基于神经网络的智能合约漏洞检测方法 |
CN116628707A (zh) * | 2023-07-19 | 2023-08-22 | 山东省计算中心(国家超级计算济南中心) | 一种可解释性的基于多任务的源代码漏洞检测的方法 |
CN117573084A (zh) * | 2023-08-02 | 2024-02-20 | 广东工业大学 | 一种基于逐层融合抽象语法树的代码补全方法 |
CN117573084B (zh) * | 2023-08-02 | 2024-04-12 | 广东工业大学 | 一种基于逐层融合抽象语法树的代码补全方法 |
CN117614681A (zh) * | 2023-11-24 | 2024-02-27 | 烟台大学 | 智能合约的重入漏洞检测方法、***、设备和存储介质 |
CN117614681B (zh) * | 2023-11-24 | 2024-05-24 | 烟台大学 | 智能合约的重入漏洞检测方法、***、设备和存储介质 |
CN117473170A (zh) * | 2023-12-27 | 2024-01-30 | 布比(北京)网络技术有限公司 | 基于代码表征的智能合约模版推荐方法、装置及电子设备 |
CN117473170B (zh) * | 2023-12-27 | 2024-04-09 | 布比(北京)网络技术有限公司 | 基于代码表征的智能合约模版推荐方法、装置及电子设备 |
CN117574214A (zh) * | 2024-01-15 | 2024-02-20 | 中科链安(北京)科技有限公司 | 智能合约分类模型训练方法、智能合约分类方法及装置 |
CN117574214B (zh) * | 2024-01-15 | 2024-04-12 | 中科链安(北京)科技有限公司 | 智能合约分类模型训练方法、智能合约分类方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN116089957A (zh) | 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置 | |
CN108446540B (zh) | 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与*** | |
CN113641586B (zh) | 软件源代码缺陷检测方法、***、电子设备及储存介质 | |
CN109697162B (zh) | 一种基于开源代码库的软件缺陷自动检测方法 | |
Cheng et al. | Static detection of control-flow-related vulnerabilities using graph embedding | |
US11403286B2 (en) | Bridge from natural language processing engine to database engine | |
CN111124487B (zh) | 代码克隆检测方法、装置以及电子设备 | |
CN111552969A (zh) | 基于神经网络的嵌入式终端软件代码漏洞检测方法及装置 | |
Huang et al. | Towards automatically generating block comments for code snippets | |
CN106228068A (zh) | 基于混合特征的Android恶意代码检测方法 | |
CN112685738B (zh) | 一种基于多级投票机制的恶意混淆脚本静态检测方法 | |
CN113297580B (zh) | 基于代码语义分析的电力信息***安全防护方法及装置 | |
CN112115326B (zh) | 一种以太坊智能合约的多标签分类和漏洞检测方法 | |
CN110825642B (zh) | 一种基于深度学习的软件代码行级缺陷检测方法 | |
CN114611115A (zh) | 一种基于混合图神经网络的软件源码漏洞检测方法 | |
CN116225526A (zh) | 一种基于图表示学习的代码克隆检测方法 | |
CN111723192A (zh) | 代码推荐方法和装置 | |
EP4049141A1 (en) | Automated exception featurization and search | |
CN116975881A (zh) | 一种基于llvm的漏洞细粒度定位方法 | |
Zhou et al. | Attending via both fine-tuning and compressing | |
CN114356744A (zh) | 基于机器学习的应用程序界面遍历方法及设备 | |
Antonelli et al. | Leveraging AI to optimize website structure discovery during Penetration Testing | |
CN111562943B (zh) | 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置 | |
Eppa et al. | Machine learning techniques for multisource plagiarism detection | |
Liu et al. | Prompt Learning for Multi-Label Code Smell Detection: A Promising Approach |
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 |