CN117201138B - 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备 - Google Patents

一种基于漏洞子图的智能合约漏洞检测方法、系统和设备 Download PDF

Info

Publication number
CN117201138B
CN117201138B CN202311178702.4A CN202311178702A CN117201138B CN 117201138 B CN117201138 B CN 117201138B CN 202311178702 A CN202311178702 A CN 202311178702A CN 117201138 B CN117201138 B CN 117201138B
Authority
CN
China
Prior art keywords
vulnerability
node
subgraph
nodes
path
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.)
Active
Application number
CN202311178702.4A
Other languages
English (en)
Other versions
CN117201138A (zh
Inventor
赵相福
王奕辰
何龙
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yantai University
Original Assignee
Yantai University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Yantai University filed Critical Yantai University
Priority to CN202311178702.4A priority Critical patent/CN117201138B/zh
Publication of CN117201138A publication Critical patent/CN117201138A/zh
Application granted granted Critical
Publication of CN117201138B publication Critical patent/CN117201138B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明涉及网络安全技术领域,具体为一种基于漏洞子图的智能合约漏洞检测方法、系统和设备,该检测方法基于一些终止指令从智能合约构建控制流图,并根据漏洞关键词得到潜在漏洞节点,并基于潜在漏洞节点将控制流图拆分为多个漏洞子图,接着将漏洞子图中的直线路径和循环路径分别进行聚合,突出漏洞的关键信息,提高消息传递的效率,并对聚合漏洞子图进行边特征提取和节点特征提取,保留漏洞子图的语义信息、操作码序列的顺序和控制流程,特征提取后,使用图神经网络学习邻接矩阵和特征向量,并输出分类检测结果,得到漏洞检测结果,整个检测方法检测效率好,具有较高的准确度、精密度、召回率和F1‑score。

Description

一种基于漏洞子图的智能合约漏洞检测方法、系统和设备
技术领域
本发明涉及网络安全技术领域,具体为一种基于漏洞子图的智能合约漏洞检测方法、系统和设备。
背景技术
目前,已经发现了数十种智能合约漏洞,包括整数溢出漏洞、时间戳漏洞、delegatecall漏洞、交易顺序依赖漏洞、重入漏洞等。在部署智能合约之前检测这些漏洞可以帮助开发人员及时修补它们,从而大大降低智能合约被利用的风险。因此,如何准确地检测这些漏洞成为相关研究的热点。
智能合约的检测方法可以分为静态检测和动态检测两大类。这两个类别之间的区别在于是否需要在检测期间将智能合约部署到区块链。模糊检测是一种典型的动态检测方法。符号执行、形式验证、中间表示和机器学习(ML)属于静态检测方法。SaferSC是第一个基于ML的智能合约检测模型,使用长短期记忆网络构建以太坊操作码序列模型。然而,SaferSC主要依赖于其漏洞检测规则,其中一些规则已经过时。ContractWard使用n-gram方法提取智能合约的特征,并使用ML模型学习这些特征。然而,这种特征提取方法忽略了程序执行中的复杂关系,如跳转关系、循环关系、条件关系等。基于图的ML用于智能合约检测旨在将智能合约转换为图,并使用GNN来学习图的特征。该方法可以保留程序执行中的复杂关系。然而,从智能合约到图形的转换可能会丢失一些关键信息,从而限制了检测结果的准确性。DR-GCN将智能合约转换为合约图,并将顶点划分为主点、次点和回退点。DR-GCN中的控制流虽然丰富,但节点内部的特征却不足。
因此,现有方法的局限性在于,它们的特征提取方法可能会忽略一些与漏洞相关的关键信息,造成这些方法的检测效果不能令人满意,存在漏报率高,检测准确度低的问题。
发明内容
本发明的目的是提供了一种基于漏洞子图的智能合约漏洞检测方法、系统和设备。
本发明技术方案如下:
一种基于漏洞子图的智能合约漏洞检测方法,包括如下操作:
S1、获取智能合约的控制流图,所述控制流图经关键词提取处理,得到潜在漏洞节点;获取所述潜在漏洞节点至根节点的所有路径,得到所述漏洞子图;
S2、所述漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
S3、所述聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
S4、所述聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
所述S1中获取潜在漏洞节点至根节点的所有路径,得到所述漏洞子图的操作具体为:预设临时节点集合,所述临时节点集合中包含控制流图中根节点至潜在漏洞节点的路径上的所有节点,所有节点按照与潜在漏洞节点的位置远近进行排序输出;所述临时节点集合输出第一节点,获取所述控制流图中与第一节点连接的边,判断所述边是否存在于初始化漏洞子图,若不存在,将所述第一节点和边添加至初始化漏洞子图中,并将所述第一节点从临时节点集合中删除;所述临时节点集合中的其他节点执行所述第一节点输出后的操作,直至所述临时节点集合成为空集,输出所述初始化漏洞子图,得到所述漏洞子图。
所述S2中直线路径聚合处理的操作具体为:获取所述漏洞子图中入度和出度都为1的相邻节点,删除所述相邻节点之间的边,将所述相邻节点聚集成为一个节点,得到所述聚合漏洞子图。
所述S2中循环路径聚合处理的操作具体为:预设队列集合,所述队列集合中包含漏洞子图中根节点到潜在漏洞节点的所有路径信息;所述队列集合输出第一路径,获取所述漏洞子图中初始节点为第一路径的第一终止节点,终止节点在第一路径的路径,将所述路径添加至初始化循环路径集中,并将所述第一路径从队列集合中删除;所述队列集合的其他路径执行第一路径输出后的操作,直至所述队列集合成为空集后,输出初始化循环路径集,得到循环路径集;将所述循环路径集中的所有节点之间的边删除后,将所有节点聚集为一个节点,在所述节点上添加一个自循环边,得到所述聚合漏洞子图。
所述S3中节点特征提取的操作具体为:获取所述聚合漏洞子图中节点的相邻操作码,得到操作码对集合,所述操作码对集合经特征映射处理,得到所述特征向量。
所述节点特征提取之前,包括:将所述聚合漏洞子图中,节点的操作码进行同类别分组、冗余操作码删除处理,得到简化操作码,所述简化操作码用于执行S3中节点特征提取的操作。
所述冗余操作码删除处理的操作具体为:删除触发事件的操作码。
一种基于漏洞子图的智能合约漏洞检测系统,包括:
漏洞子图生成模块,用于获取智能合约的控制流图,所述控制流图经关键词提取处理,得到潜在漏洞节点;获取所述潜在漏洞节点至根节点的所有路径,得到所述漏洞子图;
聚合漏洞子图生成模块,用于所述漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
聚合漏洞子图特征信息生成模块,用于所述聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
漏洞检测结果生成模块,用于所述聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
一种基于漏洞子图的智能合约漏洞检测设备,包括处理器和存储器,其中,所述处理器执行所述存储器中保存的计算机程序时实现上述的智能合约漏洞检测方法。
一种计算机可读存储介质,用于存储计算机程序,其中,所述计算机程序被处理器执行时实现上述的智能合约漏洞检测方法。
本发明的有益效果在于:
本发明提供的一种基于漏洞子图的智能合约漏洞检测方法,基于一些终止指令从智能合约构建控制流图,并根据漏洞关键词得到潜在漏洞节点,并基于潜在漏洞节点将控制流图拆分为多个漏洞子图,接着将漏洞子图中的直线路径和循环路径分别进行聚合,突出漏洞的关键信息,提高消息传递的效率,并对聚合漏洞子图进行边特征提取和节点特征提取,保留漏洞子图的语义信息、操作码序列的顺序和控制流程,特征提取后,使用图神经网络学习邻接矩阵和特征向量,并输出分类检测结果,得到漏洞检测结果,整个检测方法检测效率好,具有较高的准确度、精密度、召回率和F1-score。
附图说明
通过阅读下文优选实施方式的详细描述,本申请的方案和优点对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。
在附图中:
图1为实施例中检测方法的流程示意图;
图2为实施例中控制流图示意图;
图3为实施例中构建漏洞子图的代码图;
图4为实施例中漏洞子图的聚合示意图,(a)图为漏洞子图的示意图,(b)图为漏洞子图聚合后的示意图;
图5为实施例中直线路径聚合处理的代码图;
图6为实施例中循环路径聚合处理的代码图;
图7为实施例中不同方法的节点特征提取示意图;
具体实施方式
下面将结合附图更详细地描述本公开的示例性实施方式。
本实施例提供了一种基于漏洞子图的智能合约漏洞检测方法,参见图1,包括如下操作:
S1、获取智能合约的控制流图,所述控制流图经关键词提取处理,得到潜在漏洞节点;获取所述潜在漏洞节点至根节点的所有路径,得到所述漏洞子图;
S2、所述漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
S3、所述聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
S4、所述聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
S1、获取智能合约的控制流图,控制流图经关键词提取处理,得到潜在漏洞节点;获取潜在漏洞节点至根节点的所有路径,得到漏洞子图。
将智能合约的源代码编译成字节码,字节码反汇编成操作码,得到控制流图(Control Flow Graph,CFG)。操作码的序列可以根据终止指令,如REVERT、JUMP、JUMPI、RETURN和STOP,分割成一些代码块(节点)。参见图2,CFG的每个节点表示一段可执行代码,CFG的每个边表示一个控制流。图2中的节点1,度为0,是根节点,代表了智能合约的起始点。CFG的边包括非跳转边和跳转边两种类型。在智能合约中,非跳转边表示顺序执行,跳转边表示跳转关系。
为了更好描述CFG的内容,形象化处理方法,将CFG形式化如下:
CFG=<V,E> (1)
V={v0,v1,v2,...} (2)
E={e0,e1,e2,...} (3)
e=<vfrom,vto> (4)
v=<id,ops> (5)
ops=[op0,op1,op2,...] (6)
p(vi,vj)=[vi,ek,vl,...,vj] (7)
P(vi,vj)={p(vi,vj)|vi,vj∈V} (8)
形式上,CFG可以表示为一个对<V,E>(公式(1)),其中V和E表示一组节点(公式(2))和一组边(公式(3))。每个有向边可以表示为一个对<vfrom,vto>公式(4)),其中vfrom和vto分别表示边的起始节点和终止节点。每个节点表示为一个对<id,ops>(公式(5)),其中id和ops表示节点的身份和操作码序列(公式(6))。路径p(vi,vj)(公式(7))表示从节点vi(连同节点和前向边)到节点vj的序列。相应的,路径集P(vi,vj)(公式(8))表示从节点vi到节点vj的所有路径。V*表示潜在漏洞节点集(公式(9)),其中v*表示一个潜在漏洞节点。例如,图2中的节点2存在与整数溢出漏洞相关的操作码ADD,因此节点2为v*。
得到漏洞子图。智能合约中的许多信息可能是冗余的,并非所有信息都与漏洞有关。因此,为去除冗余信息,提出了漏洞子图(VSG)的概念。通过VSG,可以将一个智能合约检测任务拆分为多个漏洞检测子任务,提炼出与漏洞相关的关键信息。VSG定义:给定一个CFGG的根节点v0,和潜在漏洞节点vi*。相关的漏洞子图VSG(vi*)是G的子图,它只包含v0到vi的所有路径P(v0,vi)。与CFG相比,VSG的优势体现在:(1)检测VSG的准确性更高,因为从CFG中剔除了与漏洞无关的冗余信息。(2)可以关注与漏洞vi*相关的VSG,而不是整个CFG,以提高检测效率。(3)VSG通常比CFG更简化,所以在分类检测中提高了消息传递的效率。
获取潜在漏洞节点至根节点的所有路径,得到漏洞子图的操作为:预设临时节点集合,临时节点集合中包括控制流图中根节点至潜在漏洞节点的路径上的所有节点,所有节点按照与潜在漏洞节点的位置远近进行排序输出;临时节点集合输出第一节点,获取控制流图中与第一节点连接的边,判断边是否存在于初始化漏洞子图,若不存在,将第一节点和边添加至初始化漏洞子图中,并将第一节点从临时节点集合中删除;临时节点集合中的其他节点执行第一节点输出后的操作,直至临时节点集合成为空集,输出初始化漏洞子图,得到漏洞子图。
得到漏洞子图的详细过程参见图3中的代码,主要思想为针对潜在漏洞节点集V*中的每个潜在漏洞节点v*,从潜在漏洞节点v*反向进行广度优先遍历至根节点v0。该算法的输入为CFG和V*。输出为对应的VSG。第1-6行将为每个循环中的每个潜在漏洞节点构建VSG。首先,初始化VSG(第2行),并将v*添加到VSG的V'(第3行)。然后,使用VSGbuilder,一个递归函数(第6-22行),从CFG构建一个VSG(第4行)。最后,返回一个VSG(第5行)。函数VSGbuilder的作用为:利用广度优先遍历进行回溯查找。在VSGbuilder的每一次递归都向上查找一层。举个例子,第一次递归是查找与v*存在边相连的所有节点,第二次递归是查找与上一步获得的所有节点存在边相连的所有节点,以此类推找到VSG的所有节点和边,并构建VSG。VSGbuilder输入是一个节点集和一个CFG。首先,初始化临时节点集合tmp_vertexes(第八行)。其次,确定是否存在一条指向v的边e<vfrom,v>(第9-11行)。如果是,应该检查e是否已经在E'中,以确保集合元素是唯一的,并避免算法进入无限循环(第12行)。然后,将e添加到VSG的E'(第13行),并将其初始节点vfrom添加到VSG的V'(第14行),以构建VSG。之后,将vfrom添加到tmp_vertexes(第15行)。tmp_vertexes是下一个递归的输入之一(第21行)。递归的结束条件是tmp_vertexes为空集(第20行),这意味着所有路径P(v0,v*)都已遍历。
本实施例中,将漏洞子图依次经直线路径聚合处理和循环路径聚合处理后,得到聚合漏洞子图。
S2、漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图。
直线路径聚合处理的操作为:获取漏洞子图中入度和出度都为1的相邻节点,删除相邻节点之间的边,将相邻节点聚集成为一个节点,得到聚合漏洞子图。直线路径ps是一条路径,其中ps中的每个节点的出度和入度均为1。它表示一个程序按顺序执行,没有跳转指令。一个长ps会过度使用计算资源,因此,应该聚合ps。形式上,让ps=<vi1,ei1,vi2,ei2,…,vik>,其中每个vik的进出度数为1。ps可以聚合成一个节点vi1,i2,…,ik,且ps中的所有边都被删除。如图4(a)所示,包含节点2和节点3的ps可以聚合为图4(b)中的节点2,3。
直线路径聚合的详细过程参见图5中的代码,主要思想是遍历所有的边,并检查一条边相邻的两个节点是否可以聚合。该算法的输入是一个VSG,输出是一个不包含ps的VSG。首先,遍历VSG中的所有边(第1行)。如果两个相邻节点的入度和出度都为1(第2-3行),聚合这两个节点(第4行)。重复这个过程,直到所有的边都被检查过。最后,返回一个没有直线路径的VSG(第8行)。直线路径的聚合大大降低了VSG的复杂度。在保留来自VSG的关键信息的同时,聚合可以进一步提高消息传递的效率。
循环路径聚合处理的操作为:预设队列集合,队列集合中包含漏洞子图中根节点到潜在漏洞节点的所有路径信息;队列集合输出第一路径,获取漏洞子图中初始节点为第一路径的第一终止节点,终止节点在第一路径的路径,将路径添加至初始化循环路径集中,并将第一路径从队列集合中删除;队列集合的其他路径执行第一路径输出后的操作,直至队列集合成为空集后,输出初始化循环路径集,得到循环路径集;将循环路径集中的所有节点之间的边删除后,将所有节点聚集为一个节点,在节点上添加一个自循环边,得到聚合漏洞子图。进一步的,若终止节点不在第一路径上,判断获取VSG中初始节点和终止节点时是否遍历到潜在漏洞节点;若已遍历,将终止节点在第一路径的路径添加至初始化循环路径集中;若未遍历,将终止节点添加至第一路径上后,作为队列集合下一次输出的路径。
一个循环路径pc是一条路径(vi,vi)p(公式(10)),其初始节点和终止节点是同一个节点vi。它表示VSG中可以重复执行的路径。为了进一步降低VSG的大小,将环pc聚合为一个节点。
pc=(vi,vi)p (10)
形式上,让pc=<vi1,ei1,vi2,ei2,…,vik,eik,vi1>,其初始节点与终止节点相同。pc可以聚合成一个节点vi1,i2,…ik,pc中的所有边都被移除,所有不在pc中但与每个节点vik相关的边信息都被重新映射到vi1,i2,…ik,并添加一个新的自循环边。如图4(a)所示,一个pc,包括节点5和6,可以聚合为图4(b)中的节点5,6。
循环路径聚合的详细过程参见图6中的代码,主要思想为从根节点v0开始进行广度优先遍历到潜在漏洞节点v*,查找到所有的循环路径pc,组成循环路径集Pc(第3-14行),然后聚合Pc(第15-17行)。在遍历pc之前,先初始化队列集合Queue和循环路径集Pc。Queue保存漏洞子图中所有已遍历路径的队列,Pc是pc的集合(第1-2行)。初始化之后,首先从Queue弹出一个路径p(第4行和第15行),并将该路径的最后一个节点用p[vj]表示(因为公式8中路径的定义为p=[vi,ek,vl,…,vj])。其次,查找VSG中所有边(第5行),并找到初始节点为p[vj](第6行),终止节点为其他任意节点vto的边e。如果已经vto在p中,则说明有一个循环路径pc(第7行)。因此,将pc添加到Pc(第8行)。如果vto不在p中,则检查路径是否遍历到v*(第9行)。如果在,则路径已到达终点。如果没在,说明该路径尚未遍历到终点,则将vto添加到p,并将新的p加入到队列中Queue为了下一次的pc查找(第10行)。而后,将重复上述操作(第4-13行),直到Queue为空(第14行),这意味着VSG中的所有路径都已遍历。最后,聚合所有路径Pc中的pc(第15-17行)。
S3、聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息。
边特征提取的操作是获取聚合漏洞子图的邻接矩阵,边特征提取保留节点之间的关系。使用邻接矩阵直接提取边缘特征,由于聚合漏洞子图是一个有向无权图,因此邻接矩阵是不对称的,二值的。
节点特征提取的操作具体为:获取聚合漏洞子图中节点的相邻操作码,得到操作码对集合,操作码对集合经特征映射处理,得到特征向量。参见图7,每种类型的操作码都是一个独立的指令,因此每种类型都可以看作是节点的一个特征。以往常使用144维(144是现有操作码的数量)字节向量来表示节点特征,但这种方法有两个缺点:忽略操作码序列的顺序,以及同一个操作码在一个节点上多次出现将导致冲突。为了解决这两个缺点,使用连续操作码对(SOP)来获取特征向量。与opi和opi+1相关的SOPi表示为一对<opi,opi+1>,其中opi和opi+1表示两个相邻的操作码。给定一个节点v=<id,ops>,v中的ops被分割成若干个SOP,每个SOP代表节点的一个特征,将所有SOP映射到一个向量上,得到特征向量,以表示节点的特征信息。使用SOP可以减少节点间的冲突,并保留语义信息和操作码序列的顺序。
高维输入特征会提高计算复杂度,为降低节点特征的维度,节点特征提取之前,包括:将聚合漏洞子图中,节点的操作码进行同类别分组、冗余操作码删除处理,得到简化操作码,简化操作码执行所述S3中节点特征提取的操作。
同类别分组中,将操作码分组为具有相似含义的类别。例如,JUMP和JUMPI被视为JUMP,所有的push操作码,包括PUSH1、PUSH2、PUSH3等,都被视为push。表一显示了操作码简化规则。
表一操作码简化规则
冗余操作码删除处理的操作为:删除触发事件的操作码,以及删除跳转目的地的操作码。例如JUMPDEST和LOG0-LOG4。JUMPDEST是注释可能跳转目的地的元数据。但是,跳跃关系已经包含在CFG的边里,所以JUMPDEST可以被删除。LOG的目的是触发一个事件,这对于智能合约的执行并非是必要的。因此,为提高计算效率,需删除这些目的为跳转的操作码,和目的为触发事件的操作码。
进一步的,删除一些罕见的操作码对。观察了超过10万个CFG的智能合约,发现一些操作码对,如<STOP,PUSH>,<JUMP,PUSH>,从未出现过。推测该操作码对在实际操作码序列中几乎不可能出现,因此选择删除它们。
减少节点特征维度后,只剩下48种操作码,节点维数从20736个减少到874个。降维提高计算效率,同时保留与漏洞检测相关的关键信息。
S4、聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
聚合漏洞子图特征信息经图神经网络进行分类处理,得到漏洞检测结果。图神经网络可以具体为图神经网络(Graph Neural Networks,GNN),图卷积神经网络(GraphConvolutional Network,GCN),Graph SAmple and aggreGatE(简称GraphSAGE),门控图神经网络(Gated Graph Sequence Neural Networks,GGNN),图注意网(Graph AttentionNetwork,GAT),但不限于上述网络。以GNN为例,GNN是一类专门设计用于处理聚合图结构等数据的神经网络,与处理顺序或表格数据的传统神经网络不同,GNN可以捕获图中节点之间的关系。GNN通常以迭代的方式运行,根据邻居的信息更新节点表示。通过这种方式,GNN允许图中的节点与其相邻的节点交换信息,使它们能够从其局部环境中收集信息,进而检测分类处结果。
本实施例中,为优化神经网络的分类处理能力,设置学习率范围为{0.0001,0.0005,0.001,0.002,0.005,0.01},退出率范围为{0.1,0.2,0.3,0.4,0.5},batch大小范围为{$8,16,32,64,128$}。为了防止过度拟合,在{10-6,10-5,10-4,10-3,10-2,10-1}中调整了L2正则化。
为验证本实施例提供的检测方法的效果,做了如下实验。
实验设置。如表二所示,所有实验都是在一台运行Ubuntu 22.04的PC上进行的。这款电脑配备了英特尔i5处理器、16GB内存和1TB存储空间。本实施例提供的检测方法是一个基于Python的智能检测工具,所有实验都是用Python实现的。
表二实验配置
数据集。从以太坊收集了2023年之前部署的10084份智能合约,并为这些合约提供了标签。在该数据集中,3102个智能合约存在整数溢出漏洞,257个智能合约存在重入漏洞,524个智能合约存在时间戳依赖漏洞。对于这个数据集,随机选择其中的60%作为训练集,20%作为验证集,20%作为测试集并进行多次测试,报告平均结果。
标签。与传统的检测工具标记合约的方法不同,本实施例选择标记VSG。标记VSG比标记智能合约更本质,因为VSG删除了许多与漏洞无关的信息。然而,专家们并不容易读VSG并给它打上标签。为了解决这一问题,将符号执行与专家标注相结合,对VSG进行标注。与CFG相比,简洁的VSG减少了路径爆炸的危害,从符号执行的角度提高了标签的准确性。
指标。实验收集了真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)四种测量值。TP是该方法正确检测到的漏洞合约的数量。TN显示未被该方法检测到的无漏洞合约的数量(是该方法正确检测到的无漏洞合约的数量)。FP表明这些无漏洞合约被方法误认为是漏洞合约(是该方法错误将无漏洞合约当成漏洞合约的数量)。FN表示该方法无法检测到漏洞攻击的合约数量(是该方法无法检测到漏洞合约的数量)。并以准确度、精密度、召回率和F1-score展示检测效果。
表三不同方法的检测结果汇总表
为对S4中使用的图神经网络进行选择,表三比较了不同的图神经网络模型的检测性能,这些图神经网络模型包括GNN、GCN、GraphSAGE、GGNN,GAT。如表三所示,在检测整数溢出漏洞和时间戳依赖漏洞时,GraphSAGE优于其他模型,ACC和F1-score分别达到0.83和0.80。在检测重入漏洞时,GGNN优于其他工具,F1-score达到0.75。
根据表三中的实验结果,在进行如下表四和表五的实验过程中,对于整数溢出漏洞和时间戳依赖漏洞的检测,本实施例S4中分类的操作通过GraphSAGE实现,对于重入漏洞的检测,本实施例S4中分类的操作通过GGNN实现。
与基于机器学习的智能合约检测方法的检测结果比较。将本实施例提供的检测方法,与其他三种基于ML的智能合约检测工具进行比较,检测结果如表四所示。
表四本实施例检测方法与基于机器学习的智能合约检测方法的智能合约漏洞检测效果汇总表
对于SaferSC(第一个基于机器学习的智能合约检测模型,使用长短期记忆网络构建以太坊操作码序列模型)和Contractward(一个使用n-gram方法提取智能合约的特征,并使用机器学习模型学习这些特征的网络),两者检测结果是受限的,因为它们没有考虑字节码之间的复杂关系,如跳转关系、循环关系、条件关系等。因此,一个复杂的合约将限制它们的表现。对于DR-GCN,从Solidity源代码到合约图的转换存在信息丢失。例如,忽略库Safemath的信息,该库在最新版本的Solidity中被广泛使用,以避免整数溢出漏洞。相比之下,本实施例提供的检测方法的F1-score对于三种类型的漏洞都达到了0.80、0.75和0.83,高于其他工具,所以使用VSG检测智能合约漏洞可能比其他方法更好。
与非基于ML的智能合约检测工具的检测结果比较。表五是本实施例提供的检测方法和五个较为先进的检测方法的检测结果。Oyente是第一个智能合约检测工具,使用符号执行来检测漏洞,Mythril是以太坊官方推荐的基于符号执行的智能合约检测工具,Sailfish是一款基于形式验证开发的智能合约检测工具,Contractfuzzer是一款智能合约检测工具,其核心方法是模糊测试,Slither是一个基于中间表示的智能合约检测工具。
表五本实施例检测方法与其他智能合约检测方法的智能合约漏洞检测效果汇总表
对于整数溢出漏洞的检测。Mythril仅获得0.69F1-score,而本实施例提供的检测方法能获得0.80F1-score。Oyente和Mythril都使用符号执行来分析智能合约的字节码。符号执行通过构造约束路径和约束求解,理论上可以达到较好的检测效果。然而,路径爆炸问题限制了这些工具的精度,所以它们必须限制循环和递归的深度。因此,有些路径可能无法访问。Sailfish是一个基于形式化验证的检测工具。理论上,这种方法是最精确的,因为它有严格的定理证明。然而,Sailfish依靠Slither进行静态分析。Slither的可靠性问题会限制Sailfish的准确性。Slither完全依赖于专家规则,但仅使用专家规则很难准确地发现日益复杂的整数溢出漏洞。因此与传统检测工具相比,本实施例提供的检测方法达到了0.83ACC和0.80F1-score,说明本实施例提供的检测方法应用于整数溢出漏洞检测具有优异的检测结果。
对于重入漏洞的检测。重入漏洞是智能合约独有的逻辑漏洞。重入的复杂逻辑将限制大多数检测工具的准确性。Oyente,Mythril,Sailfish,Slither都是静态检测工具。在检测重入漏洞时,这些静态工具主要依赖于专家定义的规则。然而,智能合约正变得越来越复杂,其中一些规则可能已经过时。因此,这些工具的F1-score是不令人满意的。例如,Oyente的规则包含两个标准:(1)单笔交易的gas开销不超过2300。(2)在堆栈上重新执行调用命令是可行的。第一个标准背后的原因是,低于2300的gas(在区块链上执行交易的费用)只能支付一次以太币转账。一次以太币转移意味着不可能重新进入合约,从而利用智能合约的重入漏洞。第二个标准是模糊的,这是造成Oyente不准确的原因。ContractFuzzer是一个动态检测工具。它通过生成大量测试用例来检测智能合约来测试合约,这意味着不需要考虑重入漏洞的复杂逻辑。与其他工具相比,ContractFuzzer的FP为0,但FN更高,因此其PRE为1,REC为0.70。1PRE导致了F1-score值为0.82,是这些工具中最高的。本实施例提供的检测方法也是一个静态检测工具,在重入漏洞检测中实现0.77ACC和0.75F1-score。ContractFuzzer获得1PRE的原因是动态攻击不会有FP,但有更高的FN。更高的FN意味着漏洞的合约被视为无漏洞的合约。如果部署了这些漏洞合约,黑客就可以利用这些漏洞攻击这些合约。然而,更高的FP意味着更多的无漏洞的合约被误认为是漏洞的合约。因此,FN的危害在于开发者需要花更多的时间重新审查合约。在计算F1-score时,将FP和FN等同对待,但实际上,FN比FP危害更大。因此,本实施例提供的检测方法比其他静态工具更好,在现实世界中可能比动态工具更有用。
对于时间戳依赖漏洞的检测。传统工具通过检查Solidity源代码中是否存在关键字timestamp或操作码序列中是否存在操作码TIMESTAMP来检测时间戳依赖漏洞。这些关键字的出现意味着合约中使用了区块链中区块的时间戳,但并不意味着合约存在时间戳依赖漏洞。如果将时间戳用于算术计算或条件判断,则可能存在时间戳漏洞。与传统工具相比,本实施例提供的检测方法获得0.21ACC和0.16F1-score的改进。因此,实验结果有力地证明,本实施例提供的检测方法使用VSG检测时间戳漏洞可能更准确。
本实施例还提供一种基于漏洞子图的智能合约漏洞检测系统,包括:
漏洞子图生成模块,用于获取智能合约的控制流图,控制流图经关键词提取处理,得到潜在漏洞节点;获取潜在漏洞节点至根节点的所有路径,得到漏洞子图;
聚合漏洞子图生成模块,用于漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
聚合漏洞子图特征信息生成模块,用于聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
漏洞检测结果生成模块,用于聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
本实施例还提供一种基于漏洞子图的智能合约漏洞检测设备,包括处理器和存储器,其中,所述处理器执行所述存储器中保存的计算机程序时实现上述的智能合约漏洞检测方法。
本实施例还提供一种计算机可读存储介质,用于存储计算机程序,其中,所述计算机程序被处理器执行时实现上述的智能合约漏洞检测方法。
本实施例提供的一种基于漏洞子图的智能合约漏洞检测方法,基于一些终止指令从智能合约构建控制流图,并根据漏洞关键词得到潜在漏洞节点,并基于潜在漏洞节点将控制流图拆分为多个漏洞子图,接着将漏洞子图中的直线路径和循环路径分别进行聚合,突出漏洞的关键信息,提高消息传递的效率,并对聚合漏洞子图进行边特征提取和节点特征提取,保留漏洞子图的语义信息、操作码序列的顺序和控制流程,特征提取后,使用图神经网络学习邻接矩阵和特征向量,并输出分类检测结果,得到漏洞检测结果,整个检测方法检测效率好,具有较高的准确度、精密度、召回率和F1-score。

Claims (9)

1.一种基于漏洞子图的智能合约漏洞检测方法,其特征在于,包括如下操作:
S1、获取智能合约的控制流图,所述控制流图经关键词提取处理,得到潜在漏洞节点;获取所述潜在漏洞节点至根节点的所有路径,得到所述漏洞子图;
所述获取潜在漏洞节点至根节点的所有路径,得到所述漏洞子图的操作具体为:预设临时节点集合,所述临时节点集合中包含控制流图中根节点至潜在漏洞节点的路径上的所有节点,所有节点按照与潜在漏洞节点的位置远近进行排序输出;所述临时节点集合输出第一节点,获取所述控制流图中与第一节点连接的边,判断所述边是否存在于初始化漏洞子图,若不存在,将所述第一节点和边添加至初始化漏洞子图中,并将所述第一节点从临时节点集合中删除;所述临时节点集合中的其他节点执行所述第一节点输出后的操作,直至所述临时节点集合成为空集,输出所述初始化漏洞子图,得到所述漏洞子图;
S2、所述漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
S3、所述聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
S4、所述聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
2.根据权利要求1所述的智能合约漏洞检测方法,其特征在于,所述S2中直线路径聚合处理的操作具体为:
获取所述漏洞子图中入度和出度都为1的相邻节点,删除所述相邻节点之间的边,将所述相邻节点聚集成为一个节点,得到所述聚合漏洞子图。
3.根据权利要求1所述的智能合约漏洞检测方法,其特征在于,所述S2中循环路径聚合处理的操作具体为:
预设队列集合,所述队列集合中包含漏洞子图中根节点到潜在漏洞节点的所有路径信息;
所述队列集合输出第一路径,获取所述漏洞子图中初始节点为第一路径的第一终止节点,终止节点在第一路径的路径,将所述路径添加至初始化循环路径集中,并将所述第一路径从队列集合中删除;
所述队列集合的其他路径执行第一路径输出后的操作,直至所述队列集合成为空集后,输出初始化循环路径集,得到循环路径集;
将所述循环路径集中的所有节点之间的边删除后,将所有节点聚集为一个节点,在所述节点上添加一个自循环边,得到所述聚合漏洞子图。
4.根据权利要求1所述的智能合约漏洞检测方法,其特征在于,所述S3中节点特征提取的操作具体为:
获取所述聚合漏洞子图中节点的相邻操作码,得到操作码对集合,所述操作码对集合经特征映射处理,得到所述特征向量。
5.根据权利要求1或4所述的智能合约漏洞检测方法,其特征在于,所述节点特征提取之前,包括:
将所述聚合漏洞子图中,节点的操作码进行同类别分组、冗余操作码删除处理,得到简化操作码,所述简化操作码用于执行节点特征提取的操作。
6.根据权利要求5所述的智能合约漏洞检测方法,其特征在于,所述冗余操作码删除处理的操作具体为:删除触发事件的操作码。
7.一种基于漏洞子图的智能合约漏洞检测系统,其特征在于,包括:
漏洞子图生成模块,用于获取智能合约的控制流图,所述控制流图经关键词提取处理,得到潜在漏洞节点;获取所述潜在漏洞节点至根节点的所有路径,得到所述漏洞子图;所述获取潜在漏洞节点至根节点的所有路径,得到所述漏洞子图的操作具体为:预设临时节点集合,所述临时节点集合中包含控制流图中根节点至潜在漏洞节点的路径上的所有节点,所有节点按照与潜在漏洞节点的位置远近进行排序输出;所述临时节点集合输出第一节点,获取所述控制流图中与第一节点连接的边,判断所述边是否存在于初始化漏洞子图,若不存在,将所述第一节点和边添加至初始化漏洞子图中,并将所述第一节点从临时节点集合中删除;所述临时节点集合中的其他节点执行所述第一节点输出后的操作,直至所述临时节点集合成为空集,输出所述初始化漏洞子图,得到所述漏洞子图;
聚合漏洞子图生成模块,用于所述漏洞子图经直线路径聚合处理,和/或循环路径聚合处理,得到聚合漏洞子图;
聚合漏洞子图特征信息生成模块,用于所述聚合漏洞子图经边特征提取和节点特征提取,得到邻接矩阵和特征向量,组成聚合漏洞子图特征信息;
漏洞检测结果生成模块,用于所述聚合漏洞子图特征信息经分类处理,得到漏洞检测结果。
8.一种基于漏洞子图的智能合约漏洞检测设备,其特征在于,包括处理器和存储器,其中,所述处理器执行所述存储器中保存的计算机程序时实现如权利要求1-6任一项所述的智能合约漏洞检测方法。
9.一种计算机可读存储介质,其特征在于,用于存储计算机程序,其中,所述计算机程序被处理器执行时实现如权利要求1-6中任一项所述的智能合约漏洞检测方法。
CN202311178702.4A 2023-09-13 2023-09-13 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备 Active CN117201138B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311178702.4A CN117201138B (zh) 2023-09-13 2023-09-13 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311178702.4A CN117201138B (zh) 2023-09-13 2023-09-13 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备

Publications (2)

Publication Number Publication Date
CN117201138A CN117201138A (zh) 2023-12-08
CN117201138B true CN117201138B (zh) 2024-02-13

Family

ID=88995702

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311178702.4A Active CN117201138B (zh) 2023-09-13 2023-09-13 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备

Country Status (1)

Country Link
CN (1) CN117201138B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114297665A (zh) * 2021-12-31 2022-04-08 杭州趣链科技有限公司 基于深度学习的智能合约漏洞检测方法和装置
CN116340952A (zh) * 2023-03-17 2023-06-27 电子科技大学 一种基于操作码程序依赖图的智能合约漏洞检测方法
CN116702157A (zh) * 2023-06-21 2023-09-05 烟台大学 一种基于神经网络的智能合约漏洞检测方法

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US11620389B2 (en) * 2019-06-24 2023-04-04 University Of Maryland Baltimore County Method and system for reducing false positives in static source code analysis reports using machine learning and classification techniques

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114297665A (zh) * 2021-12-31 2022-04-08 杭州趣链科技有限公司 基于深度学习的智能合约漏洞检测方法和装置
CN116340952A (zh) * 2023-03-17 2023-06-27 电子科技大学 一种基于操作码程序依赖图的智能合约漏洞检测方法
CN116702157A (zh) * 2023-06-21 2023-09-05 烟台大学 一种基于神经网络的智能合约漏洞检测方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
SlightDetection:一种以太坊智能合约 安全漏洞的静态分析工具;陈霄汉等;应用科学学报;第40卷(第4期);第695-711页 *

Also Published As

Publication number Publication date
CN117201138A (zh) 2023-12-08

Similar Documents

Publication Publication Date Title
Bavishi et al. Context2Name: A deep learning-based approach to infer natural variable names from usage contexts
CN102279738B (zh) 标识强连通分量的入口和出口的技术
Gao et al. Android malware detection via graphlet sampling
US8793251B2 (en) Input partitioning and minimization for automaton implementations of capturing group regular expressions
Zou et al. Interpreting deep learning-based vulnerability detector predictions based on heuristic searching
US9336194B2 (en) Submatch extraction
Lin et al. Dimsum: Discovering semantic data of interest from un-mappable memory with confidence
CN114491529A (zh) 基于多模态神经网络的安卓恶意应用程序识别方法
Chini et al. On the complexity of bounded context switching
US20230222223A1 (en) Computer-implemented method for testing the cybersecurity of a target environment
CN114201756A (zh) 一种智能合约代码片段的漏洞检测方法和相关装置
CN116992052B (zh) 用于威胁情报领域的长文本摘要方法、装置和电子设备
CN117240632B (zh) 一种基于知识图谱的攻击检测方法和系统
Mohamed et al. Knowledge base completion using distinct subgraph paths
Le et al. DSM: a specification mining tool using recurrent neural network based language model
CN117201138B (zh) 一种基于漏洞子图的智能合约漏洞检测方法、系统和设备
US9934327B2 (en) Mining relevant approximate subgraphs from multigraphs
CN116821903A (zh) 检测规则确定及恶意二进制文件检测方法、设备及介质
CN114579965A (zh) 一种恶意代码的检测方法、装置及计算机可读存储介质
CN114301671A (zh) 网络入侵检测方法、系统、设备及存储介质
CN107656863A (zh) 一种基于关键点引导的数据流测试方法及其测试系统
Wang et al. Android malware detection via efficient application programming interface call sequences extraction and machine learning classifiers
Alrabaee et al. Compiler provenance attribution
Zhang et al. Approach to mine influential functions based on software execution sequence
Florêncio et al. Regular inference as vertex coloring

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
GR01 Patent grant
GR01 Patent grant