CN117614681B - 智能合约的重入漏洞检测方法、系统、设备和存储介质 - Google Patents

智能合约的重入漏洞检测方法、系统、设备和存储介质 Download PDF

Info

Publication number
CN117614681B
CN117614681B CN202311578102.7A CN202311578102A CN117614681B CN 117614681 B CN117614681 B CN 117614681B CN 202311578102 A CN202311578102 A CN 202311578102A CN 117614681 B CN117614681 B CN 117614681B
Authority
CN
China
Prior art keywords
vulnerability
block
reentrant
control flow
reentry
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
CN202311578102.7A
Other languages
English (en)
Other versions
CN117614681A (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 CN202311578102.7A priority Critical patent/CN117614681B/zh
Publication of CN117614681A publication Critical patent/CN117614681A/zh
Application granted granted Critical
Publication of CN117614681B publication Critical patent/CN117614681B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L63/00Network architectures or network communication protocols for network security
    • H04L63/14Network architectures or network communication protocols for network security for detecting or protecting against malicious traffic
    • H04L63/1433Vulnerability analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/24Classification techniques
    • G06F18/243Classification techniques relating to the number of classes
    • G06F18/24323Tree-organised classifiers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L41/00Arrangements for maintenance, administration or management of data switching networks, e.g. of packet switching networks
    • H04L41/14Network analysis or design
    • H04L41/142Network analysis or design using statistical or mathematical methods
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L63/00Network architectures or network communication protocols for network security
    • H04L63/20Network architectures or network communication protocols for network security for managing network security; network security policies in general
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L9/00Cryptographic mechanisms or cryptographic arrangements for secret or secure communications; Network security protocols
    • H04L9/40Network security protocols

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • General Engineering & Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Signal Processing (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Mathematical Physics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Optimization (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Probability & Statistics with Applications (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Mathematical Analysis (AREA)
  • Algebra (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及网络安全技术领域,具体为智能合约的重入漏洞检测方法、系统、设备和存储介质,该检测方法基于源代码中转账操作函数,对源代码进行字符转化后,得到的更新源代码用于构建抽象语法树;接着,根据抽象语法树中语句入队类型对基本块进行分类,并构建控制流图;然后,将控制流图经合取范式转化处理,将待检合取范式文件与历史重入漏洞合取范式文件结合,进行布尔可满足性处理,得到漏洞检测结果,该检测方法不仅能够检测到更多的真阳性合约,还显著减少了误报数量,准确度和灵活性均较高。

Description

智能合约的重入漏洞检测方法、系统、设备和存储介质
技术领域
本发明涉及网络安全技术领域,具体为智能合约的重入漏洞检测方法、系统、设备和存储介质。
背景技术
相比于其他传统的智能合约漏洞,重入漏洞发生较为频繁,容易影响智能合约和区块链生态系统的长期安全与稳定发展。重入漏洞的检测方法包括多种,例如:符号执行、形式化验证、模糊测试、中间表示和深度学习。符号执行是一种将程序变量视为符号,系统地探索所有可能执行路径的方法。然而由于源代码中的语义信息与CALL操作之间存在不一致性,这可能会影响路径条件的检查,从而导致漏洞检测产生误报。形式化验证是通过数学证明来验证智能合约是否按照预期的方式运行的方法,然而这种技术需要专业的数学证明和推理知识才能够有效应用。模糊测试的测试核心思想是:通过测试用例来模拟实际的重入过程,然而模糊测试的结果完全取决于测试用例生成器产生的测用例质量。中间表示检测的核心思想是:将转化后的代码形式与设定的规则进行匹配。然而这种方法在对源代码进行转换时可能存在精度损失,并且设定的规则可能无法完全适应不断更新的智能合约。深度学习将智能合约代码信息转化为神经网络模型的输入,并使用经过训练的模型来检测智能合约漏洞,然而这种方法没有考虑与重入漏洞相关的合约之间的交互信息,导致重入漏洞检测不完备,可能会产生误报。
发明内容
本发明的目的是提供了一种智能合约的重入漏洞检测方法、系统、设备和存储介质。
本发明技术方案如下:
一种智能合约的重入漏洞检测方法,包括如下操作:
S1、获取待检智能合约的源代码,所述源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于所述更新源代码,得到抽象语法树;
S2、将所述抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取所述特征基本块的类型,根据所述类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于所述更新基本块,得到待检控制流图;
S3、获取历史重入漏洞合约,所述历史重入漏洞合约执行所述S1和S2的操作,得到历史重入漏洞控制流图;所述历史重入漏洞控制流图和待检控制流图转化经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
S4、所述待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
所述S1中特征字符转化处理的操作具体为:获取所述转账操作函数中修饰符的函数体,得到第一函数体;将所述转账操作函数中的第一字符,替换为所述第一函数体,得到所述更新源代码。
所述S2中,所述根据类型,在对应特征基本块后添加相应后继块的操作,具体包括:若特征基本块为转账块,所述特征基本块的后继块包括回退块,以及所述特征基本块,对应的语句顺序执行的下一个基本块;若特征基本块为状态块或检查块,所述特征基本块的后继块包括,所述特征基本块,对应的语句顺序执行的下一个基本块;若特征基本块为分支块,所述特征基本块的后继块包括,所述特征基本块,对应的分支条件为真和假的基本块。
删除所述S2中,所述待检控制流图中,与分支块、转账块、回退块、检查块和状态块没有关系的基本块,得到优化待检控制流图;所述优化待检控制流图用于执行所述S3中得到待检合取范式文件的操作。
所述S3中得到历史重入漏洞合取范式文件的操作具体为:获取所述历史重入漏洞控制流图中,重入过程内基本块的重入描述,以及与重入过程有关的基本块的约束关系,得到重入基本块描述和相关基本块约束关系;将所述重入基本块描述和相关基本块约束关系分别转换为字符序列,组合后得到所述历史重入漏洞合取范式文件。
所述S3中得到待检合取范式文件的操作具体为:基于获取的所述待检控制流图中基本块的类型,分配给对应更新基本块相应编号;将所有具有编号形式的更新基本块,与预设约束关系字符结合后,进行排列组合,得到多个排列情况序列,形成所述待检合取范式文件。
所述S4中得到漏洞检测结果的操作具体为:将所述待检合取范式文件中每个排列情况序列,分别添加在所述历史重入漏洞合取范式文件中后,分别进行布尔可满足性求解,得到多个布尔可满足性求解报告;若多个布尔可满足性求解报告中,均显示求解不成功,则漏洞检测结果为不存在重入漏洞;若多个布尔可满足性求解报告中,显示一个或多个求解成功,则漏洞检测结果为不存在重入漏洞。
一种智能合约的重入漏洞检测系统,包括:
抽象语法树生成模块,用于获取待检智能合约的源代码,所述源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于所述更新源代码,得到抽象语法树;
待检控制流图生成模块,用于将所述抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取所述特征基本块的类型,根据所述类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于所述更新基本块,得到待检控制流图;
历史重入漏洞合取范式文件和待检合取范式文件生成模块,用于获取历史重入漏洞合约,所述历史重入漏洞合约执行所述抽象语法树生成模块和待检控制流图生成模块的操作,得到历史重入漏洞控制流图;所述历史重入漏洞控制流图和待检控制流图转化经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
漏洞检测结果生成模块,用于所述待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
一种智能合约的重入漏洞检测设备,包括处理器和存储器,其中,所述处理器执行所述存储器中保存的计算机程序时实现上述的智能合约的重入漏洞检测方法。
一种计算机可读存储介质,用于存储计算机程序,其中,所述计算机程序被处理器执行时实现上述的智能合约的重入漏洞检测方法。
本发明的有益效果在于:
本发明提供的一种智能合约的重入漏洞检测方法,基于源代码中转账操作函数,对源代码进行字符转化后,得到的更新源代码用于构建抽象语法树;接着,根据抽象语法树中语句入队类型对基本块进行分类,并构建控制流图;然后,将控制流图经合取范式转化处理,将待检合取范式文件与历史重入漏洞合取范式文件结合,进行布尔可满足性处理,得到漏洞检测结果,该检测方法不仅能够检测到更多的真阳性合约,还显著减少了误报数量,准确度和灵活性均较高。
附图说明
通过阅读下文优选实施方式的详细描述,本申请的方案和优点对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。
在附图中:
图1为实施例中检测方法的流程示意图;
图2为实施例中特征字符转化处理的代码图;
图3为实施例中构建待检控制流图的代码图;
图4为实施例中构建合取范式文件的流程示意图;
图5为实施例中构建基本块之间约束关系的代码图;
图6为实施例中待检合取范式文件的示意图;
图7为实施例中NSCEC类型合约代码切片图;
图8为实施例中通过RT/S类型合约代码切片图;
图9为实施例中NCF类型合约代码切片图;
图10为实施例中AC类型合约代码切片图;
图11为实施例中CSVER类型合约代码切片图;
图12为实施例中STV类型合约代码切片图;
图13为实施例中IC类型合约代码切片图;
图14为实施例中RL类型合约代码切片图。
具体实施方式
下面将结合附图更详细地描述本公开的示例性实施方式。
本实施例提供了一种智能合约的重入漏洞检测方法,参见图1,包括如下操作:
S1、获取待检智能合约的源代码,所述源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于所述更新源代码,得到抽象语法树;
S2、将所述抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取所述特征基本块的类型,根据所述类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于所述更新基本块,得到待检控制流图;
S3、获取历史重入漏洞合约,所述历史重入漏洞合约执行所述S1和S2的操作,得到历史重入漏洞控制流图;将所述历史重入漏洞控制流图和待检控制流图经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
S4、所述待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
S1、获取待检智能合约的源代码,源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于更新源代码,得到抽象语法树。
特征字符转化处理的操作具体为:获取转账操作函数中修饰符的函数体,得到第一函数体;将转账操作函数中的第一字符,替换为第一函数体,得到更新源代码。
特征字符转化处理的具体操作参见图2,首先,根据待检智能合约内的函数调用关系,定位转账操作函数,并评估该转账操作函数是否对待检智能合约的资产有不利影响;若没有不利影响,则不需要进一步的检测;如果有不利影响,基于定位到的转账操作函数,评估其可见性;如果不可见,则不需要进一步的检测;如果可见,检查转账操作函数中是否存在修饰符;如果不存在修饰符,立即返回到初始的源代码SC和源代码对应的初始抽象语法树AST(第3行);如果存在修饰符,首先按位置顺序收集这些修饰符,并创建一个名为MList的列表(第5行),随后逐个迭代每个修饰符(第6行),然后继续更新源代码SC的重建过程(第7-10行):第7行为获取修饰符的函数体,第一函数体FTM,第8行为检索转账操作函数的函数体,第二函数体FTB,第9行为第二函数体FTB中的第一字符-‘_;’替换为第一函数体FTM,因此完成了基于源代码中的转账操作函数,进行特征字符转化处理,得到更新源代码SC的过程。
使用最终获得的重建了更新源代码来构建抽象语法树(第12行),基于智能合约的源代码构建抽象语法树为常用现有技术,为节省篇幅,因此不在此过度叙述。最后,第13行通过返回重建的更新源代码和更新源代码来结束S1的操作。S2、将抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取特征基本块的类型,根据类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于更新基本块,得到待检控制流图。
根据类型,在对应特征基本块后添加相应后继块的操作,具体包括:若特征基本块为转账块,特征基本块的后继块包括回退块,以及特征基本块,对应的语句顺序执行的下一个基本块;若特征基本块为状态块或检查块,特征基本块的后继块包括,特征基本块,对应的语句顺序执行的下一个基本块;若特征基本块为分支块,特征基本块的后继块包括,特征基本块,对应的分支条件为真和假的基本块。
S2的具体操作参见图3,首先,逐个将将抽象语法树中,更新转账操作函数FT中的语句入队作为特征基本块(第2行),并根据语句执行,构建特征基本块之间的连接关系,进行迭代(第3-4行)。接下来,解析特征基本块内的语句并确定当前特征基本块的类型T(第5行)。在构建待检控制流图过程中,重点关注三种类型的特征基本块对应的语句:(1)与完整重入过程的构建相关的转账类型,对应特征基本块为转账块;(2)与约束关系的构建相关的状态类型或检查类型,对应特征基本块为状态块或检查块;(3)与完整重入过程和约束关系的构建都相关的分支类型,对应特征基本块为分支块。
如果当前语句是转账类型(第6行),为当前语句创建一个特征基本块为转账块B(第7行)。然后,为一个空语句创建一个回退块BF(第8行),并将回退块BF添加为转账块B的后继(第9行)。最后,使用GetNextBlk来获取语句顺序执行的下一个语句的基本块(第10行),并将其添加为转账块B的后继(第11行)。
如果当前语句是状态类型或检查类型(第12行),为当前语句创建一个与其类型对应的特征基本块,为状态块B或检查块B(第13行)。然后,使用GetNextBlk来获取语句顺序执行的下一个语句的基本块BN(第14行),并将其添加为状态块B或检查块B的后继(第15行)。
如果当前语句是分支类型(第16行),为当前语句创建一个特征基本块为分支块B(第14行)。接下来,使用GetNextBlk来获取分支条件为真(TB)和假(FB)的块(第18行),并将真(TB)和假(FB)的块添加为分支块B的后继(第19-20行)。
其中,本实施例定义:
转账块为一个包含特定转账语句(例如call,value等)的基本块,用于在智能合约中执行资产转移。转账块有两个后继块,一个为回退块,因为转账会自动触发调用者的函数fallback,另一个后继块的类型可以是转账块、检查块、状态块、回退块和分支块中的任意一种。
检查块为一个包含用于检查状态变量并确定函数调用成功或失败的语句的基本块。每个检查块只有一个后继块,类型可以是转账块、检查块、状态块、回退块和分支块中的任意一种。
状态块为一个包含用于更改变量状态的语句的基本块,更改变量状态的语句用于在程序执行期间修改数据状态,通常用于更新变量值或执行与状态变更相关的其他操作。每个状态块只有一个后继块,类型可以是转账块、检查块、状态块、回退块和分支块中的任意一种。
回退块为一个用于表示函数fallback的基本块,回退块是一个抽象的基本块,用于表示调用者的函数fallback,用于处理在合同交互期间没有匹配特定函数的情况。回退块只有一个转账块作为其唯一的前驱块,但其唯一的后继块的类型可以是转账块、检查块、状态块、回退块和分支块中的任意一种。
分支块为一个包含分支语句的基本块。分支块。分支块是一个包含分支语句(例如if,else if等)的基本块,用于基于分支条件或不同情景选择不同的执行路径。分支块有两个后继块,分支条件为真(TB)和假(FB)的后继块,类型可以属于转账块、检查块、状态块、回退块和分支块中的任意一种。
S2中得到待检控制流图的过程中,还包括将包含转账操作函数的基本块,链接为回退块的后继。即,将转账操作函数FT的起始块链接为回退块BF的后继,形成完整的重入过程(第23-24行)。最后,从所有代码块构建控制流图并返回它(第25-26行)。
同时,为提升控制流图的精简性,提高计算效率,删除待检控制流图中,与分支块、转账块、回退块、检查块和状态块没有关系的基本块,得到优化待检控制流图;优化待检控制流图用于执行S3中得到待检合取范式文件的操作。S3、获取历史重入漏洞合约,历史重入漏洞合约执行所述S1和S2的操作,得到历史重入漏洞控制流图;将历史重入漏洞控制流图和待检控制流图经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件。
得到历史重入漏洞合取范式文件的操作为:获取历史重入漏洞控制流图中,重入过程内基本块的重入描述,以及与重入过程有关的基本块的约束关系,得到重入基本块描述和相关基本块约束关系;将重入基本块描述和相关基本块约束关系分别转换为字符序列,组合后得到历史重入漏洞合取范式文件。
将重入基本块描述转化为字符序列的操作为:获取重入过程中每个重入基本块的类型,以及重入过程与每个重入基本块的约束关系,得到的所有重入基本块类型,以及所有重入约束关系,形成重入基本块类型集和重入约束关系集;分别将重入基本块类型集和重入约束关系集中,每一个重入基本块类型以及对应的重入约束关系进行字符具体化处理,得到所有重入过程与每个重入基本块的字符序列,组合后形成重入基本块序列。
具体过程可参见图4,首先,使用HasRE表示重入事件的发生,即重入过程,并获取重入过程中每个重入基本块的类型,分配给不同类型的重入基本块以及重入过程不同编号,例如,数字1到7对应于类型块A到G,8对应重入过程HasRE。图4右侧显示了重入过程中的6个重入基本块A→B→C→D→G→A的描述,可以表示为集合S1:{HasRE→A,HasRE→B,HasRE→C,HasRE→D,HasRE→G};接着获取重入过程HasRE与每个重入基本块的约束关系,并用相应符号表示约束关系,将重入过程编号、每个重入基本块编号、每个重入过程与重入基本块的约束关系符号,组合后形成序列,得到如图4右侧上部虚线框内显示的重入基本块序列。
两个基本块之间的约束关系,是基于两个基本块内变量之间的逻辑关系得到的。即,第一基本块中的变量,与第二基本块中变量之间的逻辑关系,是第一基本块与二基本块变量之间的约束关系。状态块修改状态变量,可能存在修改相同状态变量的互斥关系,例如“布尔锁”(图4中的块B和F)。对状态变量的修改也可能影响检查块,导致互斥或蕴含关系。例如,在图4中,A和B之间存在互斥关系;只有在notEntered是True时,才会将notEntered分配给False。C和E之间存在蕴含关系,这种关系在转账逻辑中很常见。转账导致的余额修改可能会影响对后续转账中余额不足的验证。因此,本实施例设定,两个变量,在下一个转账操作在转账后不满足所需余额的情况下,它们之间存在蕴含关系。也许,状态块和检查块之间存在一致性关系。例如,如果B与F互斥,A与B斥,那么A与F之间存在一致性关系。构建基本块之间约束关系的具体操作可参见图5,先从历史重入漏洞控制流图中获取所有状态块StateBlocks和检查块CheckBlocks(第2-3行)。接下来,解析状态块之间的潜在互斥约束关系(第4-8行),然后解析状态块与检查块之间的潜在互斥或蕴含约束关系(第9-14行),最后将检索得到的所有约束关系结果返回给历史重入漏洞控制流图(第15-16行)。
将相关基本块约束关系转换为字符序列的操作为:将不在重入过程内,但与重入过程内重入基本块有关的基本块,作为相关基本块;将获取的相关基本块与重入基本块的约束关系进行字符具体化,得到相关基本块约束序列。
获取相关基本块约束序列的具体过程参见图4的中constraints部分,其中B与F为互斥,A与B互斥,E与C为互斥或蕴含,根据上述基本块之间的约束关系,分别为它们分配对应的编号和字符,得到相关基本块约束序列。最后,将相关基本块约束序列,与重入基本块序列拼接组合后,形成如图4左侧所示的历史重入漏洞合取范式文件。
得到待检合取范式文件的操作为:基于获取的待检控制流图中更新基本块的类型,分配给对应更新基本块相应编号;将所有具有编号形式的更新基本块,与预设约束关系字符结合(拼接组合)后,进行排列组合,得到多个排列情况序列,形成待检合取范式文件。参见图6的排列情况序列表,首先根据更新基本块的类型,分配相应1至7的序号,接着根据更新基本块之间可能出现的约束关系,进行约束关系字符分配以及排列组合,由此得到多个不同合约逻辑描述情况的排列情况序列,每一行为一个排列情况序列,代表待检智能合约可能出现的一种逻辑描述情况,0为每个排列情况序列结尾语句。
S4、待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
得到漏洞检测结果的操作具体为:将待检合取范式文件中每个排列情况序列,分别添加在历史重入漏洞合取范式文件中后,分别进行布尔可满足性求解,得到多个布尔可满足性求解报告;若多个布尔可满足性求解报告中,均显示求解不成功,则漏洞检测结果为不存在重入漏洞;若多个布尔可满足性求解报告中,显示一个或多个求解成功,则漏洞检测结果为不存在重入漏洞。
本实施例选择使用Python 3.8开发的SAT求解器来实现布尔可满足性处理的操作。为了解决使用SAT求解器解决所有场景可能导致的性能问题,将不同情况分成多个批次,并将它们分配给多个进程,以在布尔可满足性处理中实现并行执行。
为验证本实施例的检测方法(以下简称:本实施例方法)的检测效果,做了如下实验:
为了评估本实施例方法的有效性,设计了如下实验,目的是来回答以下三个研究问题:
问题1:本实施例方法在检测八种类型的假阳性合同中,性能如何?
问题2:本实施例方法与现有智能合约检测检测方法相比,表现如何?
问题3:本实施例方法在检测不同版本的智能合约时,是否灵活?实验中,在配备有8个Intel(R)Xeon(R)Gold 6161CPU@2.20GHz处理器和200GB物理内存的Ubuntu 20.04服务器上进行了实验。配置了16个工作进程,并为每个源文件设置了5分钟的超时时间。
数据集
实验所使用的数据集包含了21212个经过手工审核的智能合约,这个数据集中,有41个合同存在重入漏洞。选择它作为实验数据集的原因如下:首先,这个数据集在规模上足够大(21212个智能合约),并且它们都来自以太坊上的实际部署。其次,该数据集已经由专家和知识渊博的志愿者进行了手工审核和标记,确保了高度的可靠性。最后,它在2023年发布,相对于其他数据集,更具有与当前以太坊上运行的智能合约相关性。
实验设置
对于问题1,首先从数据集中选择了八个假阳性合同,然后使用本实施例方法进行漏洞检测,并记录检测结果。最后,提取了在选择的智能合同中触发假阳性问题的代码片段,并分析了本实施例方法如何解决这八种假阳性问题。
对于问题2,将本实施例方法与现有检测方法(包括:Oyente、Mythril、Securify(V1)、Securify(V2)、Sailfish和Smartain)在实验数据集中进行比较,以验证本实施例方法的优越性。同时,实验中选择使用precision和综合性能指标“ability”来评估精度及其综合能力。其中,综合性能指标TP/P代表检测到的有漏洞的合同在所有有漏洞的合同中的比例。P代表数据集中有漏洞的合同数量,这是特定数据集中的一个常数。因此,较大的TP(检测到有漏洞的合同数量)表示该方法检测到了更多有漏洞的智能合约。TP/R代表检测到有漏洞的合约与报告的有漏洞的合约之比。因此,当TP较大且R(报告的有漏洞的合约)较小时,表示该方法检测精度较高。为了全面考虑这两个方面,将它们相乘来表示检测方法的检测能力。较高的“ability”值表示检测方法在两个方面表现良好,而较低的值则表明检测方法在其中一个方面可能存在不足。
对于问题3,在问题2的漏洞检测过程中收集了数据,以确定可以检测和获取结果的合约版本范围。最终,统计了每个检测方法检测不同版本合约的支持级别。
关于问题1的实验结果
如表1所示,本实施例方法能够检测到存在于现有检测检测方法中的8种典型的假阳性合约,并进一步解释了本实施例方法来避免它们的实现原理。
表1本实施例方法对8种假阳性合约的检测能力
没有状态改变的外部调用(NSCEC)和通过transfer/Send(RT/S)。如图7所示,声明了一个名为getTokenBalance的函数来查询令牌合约tokenAddr中某个地址的余额(第9行)。然而,在调用balanceOf函数之后,合约的状态(即以太坊余额、存储变量等)保持不变。因此,即使恶意令牌token重新进入此函数,也无法影响智能合约的执行。至于图8中的transfersFunds函数,2300燃气限制不足以调用合约或对任何存储变量执行写操作。这意味着攻击者无法发起重入攻击。对于这两种情况,本实施例方法可以在构建待检控制流图的第一步中防止假阳性。这是因为在定位转账函数时,我们不考虑涉及transfersFunds和send函数的情况。此外,getTokenBalance函数(图8中)不涉及任何转账操作。
外部不可调用(NCF)。正如图9所示,当一个函数被指定为“internal”可见性范围时,即使它包含内部转账操作,攻击者仍然无法从合约外部调用该函数。因此,在构建待检控制流图中,本实施例方法通过解析合约的抽象语法树来检查函数的可见性范围。如果函数的可见性范围表明它不能被外部调用,那么合约就没有重入漏洞。
地址控制(AC)、改变状态变量而无损失(CSVER)、特殊价值转移(STV)。在图10中的代码片段说明了AC类型的误报。在第6行,存在一个外部调用,调用了合约的函数transferFrom,地址为“dai”。然而,可以观察到地址“dai”在第2行和第3行是硬编码的,不能被其他函数修改。与“dai”地址对应的智能合约已记录在以太坊上,第6行的外部调用不能被其他恶意智能合约重新进入。此外,transferFrom的函数发起者地址为msg.sender,即使转账成功,也不会影响当前合约的余额。图11中第3行的代码操作与图10中的类似。在图12中,第14行发生了一次转账操作,但转账金额是由函数调用者传递的msg.value确定的。因此,即使发生重入漏洞,也不会影响合约的余额。在构建待检控制流图的中,在确定转账操作函数后,通过AST验证了发起者、接收者和转账金额,以防止在这种情况下报告重入。
识别控制(IC)、重入锁(RL)如图13和图14所示,IC和RL是防止重入最常用的方法,它们都涉及复杂的逻辑关系。因此,为了准确评估智能合约中的复杂逻辑是否容易受到重入漏洞的影响,本实施例方法采取以下步骤:首先,在构历史重入漏洞控制流图之前,本实施例方法通过重构智能合约的源代码来包括与重入锁相关的代码逻辑。其次,为了更准确地评估重入流程是否会发生,本实施例方法构建了一个历史重入漏洞控制流图,该图包括整个重入流程以及状态块和检查块之间的约束关系。最后,本实施例方法对历史重入漏洞控制流图进行编码并使用SAT求解来验证所有可能情况下重入漏洞的发生。这种方法不仅有助于避免误报,还增强了重入漏洞检测的准确性。
关于问题2的实验结果
表2呈现了本实施例方法与6种现有先进的检测方法的检测结果,包括精确度Precision和定义的能力指标ability。首先,本实施例方法检测出41个脆弱合约中的34个,超过了目前现有技术最好的检测方法Mythril 8个合约。其次,在检测到的正例合约中,本实施例方法显示出最少的假阳性(TP num)。其精确度(Precision)为72.34%,超过了目前现有技术精确度最高的Smartain。最后,本实施例方法的检测能力明显优于现有检测方法,本实施例方法获得了59.98%的能力分数,比第二名Smartian提高了54.47%。
表2本实施例方法与6种现有检测方法的检测结果比较
关于问题3的实验结果
检测合约版本的支持情况见表3。与Mythril和Smartian一样,本实施例检测方法可以检测所有版本的智能合约。由于本实施例方法在源代码级别构建控制流图,其构建过程仅受抽象语法树和源代码的限制。然而,由于Solidity 0.5.0及以上版本存在重大语法变化,一些现有检测方法(如Oyente、Securify(V1)和Securify(V2))在分析版本上存在限制。Oyente和Securify(V1)不能分析大多数版本在0.5.0以上的智能合约,而Securify(V2)只能分析0.5.8以上版本的智能合约。Sailfish无法分析0.7.0以上版本的智能合约。类似的情况也发生在Sailfish、Securify(V1)和Securify(V2)中。
表3本实施例方法与6种现有检测方法的合约检测版本支持度比较
本实施例还提供一种智能合约的重入漏洞检测系统,包括:
抽象语法树生成模块,用于获取待检智能合约的源代码,源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于更新源代码,得到抽象语法树;
待检控制流图生成模块,用于将抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取特征基本块的类型,根据类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于更新基本块,得到待检控制流图;
历史重入漏洞合取范式文件和待检合取范式文件生成模块,用于获取历史重入漏洞合约,历史重入漏洞合约执行抽象语法树生成模块和待检控制流图生成模块的操作,得到历史重入漏洞控制流图;历史重入漏洞控制流图和待检控制流图转化经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
漏洞检测结果生成模块,用于待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
本实施例还提供一种智能合约的重入漏洞检测设备,包括处理器和存储器,其中,处理器执行存储器中保存的计算机程序时实现上述的智能合约的重入漏洞检测方法。
本实施例还提供一种计算机可读存储介质,用于存储计算机程序,其中,计算机程序被处理器执行时实现上述的智能合约的重入漏洞检测方法。
本实施例提供的一种智能合约的重入漏洞检测方法,基于源代码中转账操作函数,对源代码进行字符转化后,得到的更新源代码用于构建抽象语法树;接着,根据抽象语法树中语句入队类型对基本块进行分类,并构建控制流图;然后,将控制流图经合取范式转化处理,将待检合取范式文件与历史重入漏洞合取范式文件结合,进行布尔可满足性处理,得到漏洞检测结果,该检测方法不仅能够检测到更多的真阳性合约,还显著减少了误报数量,准确度和灵活性均较高。

Claims (10)

1.一种智能合约的重入漏洞检测方法,其特征在于,包括如下操作:
S1、获取待检智能合约的源代码,所述源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于所述更新源代码,得到抽象语法树;
S2、将所述抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取所述特征基本块的类型,根据所述类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于所述更新基本块,得到待检控制流图;
S3、获取历史重入漏洞合约,所述历史重入漏洞合约执行所述S1和S2的操作,得到历史重入漏洞控制流图;所述历史重入漏洞控制流图和待检控制流图经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
S4、所述待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
2.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,所述S1中特征字符转化处理的操作具体为:
获取所述转账操作函数中修饰符的函数体,得到第一函数体;
将所述转账操作函数中的第一字符,替换为所述第一函数体,得到所述更新源代码。
3.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,所述S2中,所述根据类型,在对应特征基本块后添加相应后继块的操作,具体包括:
若特征基本块为转账块,所述特征基本块的后继块包括回退块,以及所述特征基本块对应的语句顺序执行的下一个基本块;
若特征基本块为状态块或检查块,所述特征基本块的后继块包括,所述特征基本块对应的语句顺序执行的下一个基本块;
若特征基本块为分支块,所述特征基本块的后继块包括,所述特征基本块对应的分支条件为真和假的基本块。
4.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,删除所述S2中,所述待检控制流图中,与分支块、转账块、回退块、检查块和状态块没有关系的基本块,得到优化待检控制流图;所述优化待检控制流图用于执行所述S3中得到待检合取范式文件的操作。
5.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,所述S3中得到历史重入漏洞合取范式文件的操作具体为:
获取所述历史重入漏洞控制流图中,重入过程内基本块的重入描述,以及与重入过程有关的基本块的约束关系,得到重入基本块描述和相关基本块约束关系;将所述重入基本块描述和相关基本块约束关系分别转换为字符序列,组合后得到所述历史重入漏洞合取范式文件。
6.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,所述S3中得到待检合取范式文件的操作具体为:
基于获取的所述待检控制流图中基本块的类型,分配给对应更新基本块相应编号;将所有具有编号形式的更新基本块,与预设约束关系字符结合后,进行排列组合,得到多个排列情况序列,形成所述待检合取范式文件。
7.根据权利要求1所述的智能合约的重入漏洞检测方法,其特征在于,所述S4中得到漏洞检测结果的操作具体为:
将所述待检合取范式文件中每个排列情况序列,分别添加在所述历史重入漏洞合取范式文件中后,分别进行布尔可满足性求解,得到多个布尔可满足性求解报告;
若多个布尔可满足性求解报告中,均显示求解不成功,则漏洞检测结果为不存在重入漏洞;
若多个布尔可满足性求解报告中,显示一个或多个求解成功,则漏洞检测结果为不存在重入漏洞。
8.一种智能合约的重入漏洞检测系统,其特征在于,包括:
抽象语法树生成模块,用于获取待检智能合约的源代码,所述源代码中的转账操作函数经特征字符转化处理,得到更新源代码;基于所述更新源代码,得到抽象语法树;
待检控制流图生成模块,用于将所述抽象语法树中,更新转账操作函数的语句入队作为特征基本块,获取所述特征基本块的类型,根据所述类型,在对应特征基本块后添加相应后继块,得到更新基本块;基于所述更新基本块,得到待检控制流图;
历史重入漏洞合取范式文件和待检合取范式文件生成模块,用于获取历史重入漏洞合约,所述历史重入漏洞合约执行所述抽象语法树生成模块和待检控制流图生成模块的操作,得到历史重入漏洞控制流图;所述历史重入漏洞控制流图和待检控制流图经合取范式转化处理,分别得到历史重入漏洞合取范式文件和待检合取范式文件;
漏洞检测结果生成模块,用于所述待检合取范式文件中每个排列情况序列,分别与历史重入漏洞合取范式文件结合后,经布尔可满足性处理,得到漏洞检测结果。
9.一种智能合约的重入漏洞检测设备,其特征在于,包括处理器和存储器,其中,所述处理器执行所述存储器中保存的计算机程序时实现如权利要求1-7任一项所述的智能合约的重入漏洞检测方法。
10.一种计算机可读存储介质,其特征在于,用于存储计算机程序,其中,所述计算机程序被处理器执行时实现如权利要求1-7中任一项所述的智能合约的重入漏洞检测方法。
CN202311578102.7A 2023-11-24 2023-11-24 智能合约的重入漏洞检测方法、系统、设备和存储介质 Active CN117614681B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311578102.7A CN117614681B (zh) 2023-11-24 2023-11-24 智能合约的重入漏洞检测方法、系统、设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311578102.7A CN117614681B (zh) 2023-11-24 2023-11-24 智能合约的重入漏洞检测方法、系统、设备和存储介质

Publications (2)

Publication Number Publication Date
CN117614681A CN117614681A (zh) 2024-02-27
CN117614681B true CN117614681B (zh) 2024-05-24

Family

ID=89954290

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311578102.7A Active CN117614681B (zh) 2023-11-24 2023-11-24 智能合约的重入漏洞检测方法、系统、设备和存储介质

Country Status (1)

Country Link
CN (1) CN117614681B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022078632A1 (en) * 2020-10-13 2022-04-21 NEC Laboratories Europe GmbH Method and system for supporting smart contracts in a blockchain network
CN115408689A (zh) * 2021-05-26 2022-11-29 北京大学 一种重入漏洞的检测与修复方法、系统
CN116089957A (zh) * 2022-12-29 2023-05-09 河南大学 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置
CN116933267A (zh) * 2023-07-18 2023-10-24 烟台大学 一种符号执行的智能合约漏洞检测方法、系统和设备

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022078632A1 (en) * 2020-10-13 2022-04-21 NEC Laboratories Europe GmbH Method and system for supporting smart contracts in a blockchain network
CN115408689A (zh) * 2021-05-26 2022-11-29 北京大学 一种重入漏洞的检测与修复方法、系统
CN116089957A (zh) * 2022-12-29 2023-05-09 河南大学 一种基于语法和语义特征融合的智能合约漏洞检测方法及装置
CN116933267A (zh) * 2023-07-18 2023-10-24 烟台大学 一种符号执行的智能合约漏洞检测方法、系统和设备

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
RA: Hunting for Re-Entrancy Attacks in Ethereum Smart Contracts via Static Analysis;Yuchiro Chinen等;《2020 IEEE International Conference on Blockchain(Blockchain)》;20201211;327-336 *
基于局部图匹配的智能合约重入漏洞检测方法;张玉健等;《信息网络安全》;20220831(第08期);1-7 *

Also Published As

Publication number Publication date
CN117614681A (zh) 2024-02-27

Similar Documents

Publication Publication Date Title
US8312440B2 (en) Method, computer program product, and hardware product for providing program individuality analysis for source code programs
US20130055207A1 (en) Demand-driven analysis of pointers for software program analysis and debugging
CN110474900B (zh) 一种游戏协议测试方法及装置
Wu et al. Mutation testing for ethereum smart contract
Li et al. Deeplv: Suggesting log levels using ordinal based neural networks
US10970449B2 (en) Learning framework for software-hardware model generation and verification
CN114996126A (zh) 一种针对eosio智能合约的漏洞检测方法及系统
CN115022026A (zh) 一种区块链智能合约威胁检测装置及方法
Reger Automata based monitoring and mining of execution traces
CN116431476A (zh) 一种基于代码上下文变异的jvm模糊测试方法
CN116383833A (zh) 软件程序代码的测试方法及其装置、电子设备、存储介质
Nelaturu et al. Correct-by-design interacting smart contracts and a systematic approach for verifying ERC20 and ERC721 contracts with VeriSolid
CN114036526A (zh) 漏洞测试方法、装置、计算机设备和存储介质
CN116702157B (zh) 一种基于神经网络的智能合约漏洞检测方法
Gruner et al. Cross-domain evaluation of a deep learning-based type inference system
CN117614681B (zh) 智能合约的重入漏洞检测方法、系统、设备和存储介质
Moscato et al. Dynamite: A tool for the verification of alloy models based on PVS
CN110688368A (zh) 一种构件行为模型挖掘方法与装置
CN115828264A (zh) 智能合约漏洞检测方法、系统及电子设备
US20220308984A1 (en) Source code fault detection
CN111190813B (zh) 基于自动化测试的安卓应用网络行为信息提取系统及方法
CN113688403A (zh) 一种基于符号执行验证的智能合约漏洞检测方法及装置
Narayan et al. Mining specifications using nested words
CN116305131B (zh) 脚本静态去混淆方法及系统
Adil et al. Using model checking to detect SQL injection vulnerability in Java code

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