您现在的位置是:首页 >技术交流 >Toward Vulnerability Detection for Ethereum Smart Contracts Using Graph-Matching Network网站首页技术交流
Toward Vulnerability Detection for Ethereum Smart Contracts Using Graph-Matching Network
使用图匹配网络检测以太坊智能合约的未来漏洞
发表时间:2022/10/6
阅读时间:2023/5/5
二区
一、摘要
随着基于区块链的智能合约在去中心化应用中的蓬勃发展,智能合约的安全问题已经变成了关键问题(critical issue),因为有漏洞的智能合约已经造成了很严重的经济损失。现有的研究已经探索了基于fuzzing、符号执行、形式化验证和静态分析。
在这篇论文中,我们提出了两种静态分析方法,叫做ASGVulDetector 和BASGVulDetector,他们分别从源代码和字节码两方面来检测智能合约的漏洞。
首先,我们设计了一种新颖的中间(intermediate)表示,名为抽象语法图(ASG),以便从程序中捕获句法和语义特征(syntactic and semantic features)ASG基于语法信息(AST),但是利用代码结构进一步丰富(CFG,DFG)。
然后我们应用两种不同的训练模型,例如GNN、GMN,来学习ASG的嵌入向量 并且测量合约对的相似性(图匹配)。这种方法下,有漏洞的智能合约通过计算与有标签的智能合约的相似性来进行识别。
我们进行了广泛的实验,来评估我们的方法与最先进的竞争对手的先进性。具体而言,与其他三款检测工具相比,在F1方面,ASGVulDetecter平均要提升12.6%,而BASGVulDetecter比其他几款支持字节码的工具F1分数平均高25.6%。我们还研究了GMN模型在检测智能合约漏洞方面的有效性和优势。
二、介绍
在区块链的新兴技术的推动下,首次提出于19世纪90年代的(the concept of which was first raised in the 1990s)智能合约已被重新激活并应用于各种商业领域,例如,金融贸易,供应链,电子投票等等。
从技术上来讲,智能合约是运行在区块链上的可执行代码,用于促进(facilitate)、执行(execute)、强制执行(enforce)不可信双方之间的协议。这些代码和协议条款记录在一个分布式公共账本(ledger),继承了区块链的不可变性和分布式特性。在部署完之后,智能合约由交易事件触发,并使去中心化应用能够在区块链提供的虚拟执行环境中运行。例如,以太坊[1]为智能合约提供了一个生态系统,以使用solidity和以太坊虚拟机(EVM)开发去中心化应用程序。前者是编写智能合约的特定编程语言,而后者是集成到以太坊中执行合约字节码的图灵完全虚拟机。
像其他的计算机程序,智能合约也存在(suffer from,遭受)安全漏洞。事实上,智能合约出现过很多安全事故,造成了巨大的金融损失。在2016年,由于以太坊的重入漏洞造成的臭名昭著的DAO攻击造成了3.6百万ETC的损失(价值6千万人民币)。2017年,Parity Multisig钱包使用的智能合约库中的一个漏洞导致3000万元人民币的损失和价值1.5亿元人民币的ETC被冻结[6]。2018年,攻击者利用BEC智能合约中的整数溢出漏洞,将大量代币转移到恶意账户,导致超过9亿元人民币的瞬时蒸发[7]。上述案例并不孤立,智能触点的安全漏洞每年都会被披露[8]。更糟糕的是,随着去中心化金融(即DeFi)的普及,对智能合约的攻击和金融损失正在激增[9]。因此,安全漏洞已成为智能合约应用程序中的一个关键问题。
【5】Izhar, M.M.; Louis, S.C.; Alana, G.; Elgar, G.; Gabrielle, F.; Ryan, S.; M, K.H.; Marek, L. Understanding a revolutionary and flawed grand experiment in blockchain: The DAO attack. J. Cases Inf. T echnol. 2019, 21, 19–32.
【6】Destefanis, G.; Marchesi, M.; Ortu, M.; Tonelli, R.; Bracciali, A.; Hierons, R. Smart contracts vulnerabilities: A call for blockchain software engineering? In Proceedings of the 2018 International Workshop on Blockchain Oriented Software Engineering, Campobasso, Italy , 20 March 2018; pp. 19–25.
【7】Enmei, L.; Wenjun, L. Static analysis of integer overflow of smart contracts in ethereum. In Proceedings of the 2020 4th International Conference on Cryptography , Security and Privacy , Nanjing, China, 10–12 January 2020; pp. 110–115.
【8】Liu, Z.; Qian, P .; Wang, X.; Zhu, L.; He, Q.; Ji, S. Smart Contract Vulnerability Detection: From Pure Neural Network to Interpretable Graph Feature and Expert Pattern Fusion. In Proceedings of the 30th International Joint Conference on Artificial Intelligence, Montreal, QC, Canada, 19–26 August 2021; pp. 2751–2759.
与其他情况相反,智能合约面临的安全漏洞问题面临更多的挑战,他们可以总结为三个方面:
- 智能合约是公开可获得的,并且具有不断增长的财务价值,这使得他们成为攻击者极具诱惑力的目标
- 尽管智能合约能够通过只发布字节码来进行混淆(obfuscate),但他仍然可以被反编译以进行安全分析,这使得他成为攻击者选择的目标
- 由于区块链不可变的性质,智能合约的漏洞(defect,瑕疵)无法被改正,这表明了漏洞检测的重要性,尤其是被部署到区块链上之前
最近,许多研究工作都集中在检测智能合约的安全漏洞上,他们大部分都受传统软件测试中的流行方法所启发或者继承于这些方法。例如,fuzzing,一种自动化的软件测试技术,涉及提供无效、意外或者随机的数据作为计算机程序的输入,以探索智能合约执行的应用空间,从而检测深层漏洞。
符号执行(symbolic excetion),另一种软件测试技术,它通过用符号化而不是具体化的输入执行程序,也被用于寻找智能合约的漏洞。
fuzzing和符号执行,都要求智能合约能够被实际执行,这需要一个特定的测试环境。
与他们相反,**形式化验证(formal verification)**建立了一个数学模型来判断(determine,决定)部署之前软件行为的正确性。由于智能合约的代码通常很小,形式化验证的方法很适合于这种情况,因此越来越受到学术界和solidity语言委员会的关注。
静态分析是另一种查找漏洞的方法,她在不执行代码的情况下对其进行检测。程序特征或者中间表示被提取出来以进行漏洞检测。
在以上的方法中,静态分析被认为是一个具有竞争力且使用的方法,因为她不必须正式地进行代码执行或者复杂地形式化验证。
Among the above approaches, static analysis is considered a competitive and practical way to detect vulnerabilities in smart contracts since it does not necessitate actual code execution or complex formal specifications.
然而,了解更多地直接的漏洞特征是一个关键的因素去决定静态分析工具的有效性。大部分现有的方法更喜欢利用抽象的特征以识别漏洞的违规模式,没有充分利用句法和结构信息。
在本文中,我们建立了一个智能合约的图表示,抽象语法图(abstract semantic graph,ASG),它基于已经存在的一些图结构,例如AST、CFG、DFG。ASG的基本观点是混合这些图的信息,以保留更多的语义和语法信息。
为了从源码和字节码两方面检测智能合约的漏洞,我们提出了ASGVulDetector和BASGVulDector,它们通过利用GMN计算待检测代码和已知漏洞代码的相似性来进行检测。
我们的方法主要包括三步:
- 首先,将智能合约转化为图表示
- 其次,用图嵌入将合约转化为向量表示
- 通过GMN计算每个代码对的相似性
为了充分利用抽象代码结构,当源代码可用时,我们通过用控制流和数据流丰富AST来构建ASG,智能合约的ASG通过反编译提取,并且用控制流丰富基本快序列。
在此基础上,我们将图神经网络(GNN)和GMN两种训练模型应用于ASG,以研究不同模型的影响。为了验证所提出方法的有效性,我们在智能合约数据集上进行了广泛的实验,并将其与竞争对手的漏洞检测工具进行了比较。本文的主要贡献总结如下。
- 我们设计了一种新颖的智能合约图表示方法ASG,他同时可以适用于源代码和字节码,并且能够同时利用语义信息和结构特征
- 我们应用了一种基于ASG的图匹配网络来检测智能合约的漏洞。我们采用了两种不同的训练模型,GNN和GMN,以分析他们之间表现得不同
- 我们分别为智能合约在源代码和字节码层面的检测实现了两个工具ASGVulDector和BASGVulDector,并进行了大量实验以评估他们的有效性和先进性
三、背景
1.智能合约概述
智能合约是一个储存在区块链上的简单的程序,并且会在预定义的条件满足时执行。
2.智能合约的四类漏洞
- 重入漏洞(Reentrancy)
- Timestamp Dependency
- Block info Dependency
- Tx.Orign Attack
3.图匹配网络
图结构化对象在许多现实世界的应用程序中广泛存在,GNN是一类有效的深度学习方法,用于学习表示以及基于图结构对象执行监督预测,例如社交媒体网络、车辆网络和程序代码结构【27】。
GMN是GNN的扩展,其目标是图相似性学习。【33】
[27] Zhuang, Y .; Liu, Z.; Qian, P .; Liu, Q.; Wang, X.; He, Q. Smart Contract Vulnerability Detection Using Graph Neural Networks. In Proceedings of the 29th International Joint Conference on Artificial Intelligence, Yokohama, Japan, 11–17 July 2020; pp. 3283–3290.
[33] Li, Y .; Gu, C.; Dullien, T.; Vinyals, O.; Kohli, P . Graph Matching Networks for Learning the Similarity of Graph Structured Objects. In Proceedings of the 36th International Conference on Machine Learning, Long Beach, CA, USA, 9–15 June 2019; pp. 3835–3845.
GMN把一对图作为输入,并且以一定计算效率为代价,通过交叉图注意力机制来计算他们之间的相似性。
四、相关工作
Fuzzing…
Symbolic execution…
Formal verification…
静态分析(static analysis)是一种不需要执行代码就可以检测程序漏洞的方法,本文列举了smartcheck、slither等静态分析工具,以及钱鹏等人提出的DR-GNN。
尽管上述的研究为智能合约的漏洞检测提供了很有前途的方法,但仍然存在一定的局限性(limitation)和挑战性(challenge)。通常,模糊化和符号化执行必须具体地或象征性地执行智能合约,这需要沙盒环境,并且有执行开销。基于形式验证的技术受到内置函数的罕见形式规范的限制。静态分析是发现错误的有效方法,但通常依赖于中间表示的准确性来对代码进行特征化。
此外,用于检测漏洞的模式或模型对漏洞检测的性能至关重要。大多数现有的静态分析方法都需要源代码来执行漏洞检测。
五、方法论
框架
我们方法的基本思想是ASG,具有更多的代码结构特征的拓展句法信息,并且有望保留更多的语法和语义信息。
此外,GMN已经被证明对于图结构对象来说是一种有效的模型
如图三所示,数据集包括善意和恶意两种合约。
模型训练的工作流还可以继续分为两步:
- 首先由代码生成ASG,当源码可获得时,ASG基于AST生成,并由控制流、数据流进行丰富。否则,它包括用控制流反编译和扩充基本块序列。
Otherwise, it consists of decompiling and augmenting basic block sequences with control flow.
- 第二步是使用GNN计算智能合约的向量表示,然后使用GMN学习图对的相似性。
值得注意的时,我们提出的两种工具ASGVuldetector和BASGVuldetector仅仅在图生成步骤不同,接下来的其他步骤用相同的方法实现。
为了减少检测的假阳性率,每一种漏洞应该被单独的通过一个训练模型判断。
每一种类的漏洞预测应该通过相同的步骤,如图3b所示:
- 在样本合约被送入工具之前,应该选择训练模型的漏洞类型。(自己翻译的)
- 样本合约应该经过ASG生成、图嵌入过程,最终生成一个智能合约的向量表示
- 最终,在训练模型中根据与已知漏洞的相似性来评估
感觉对GNN、GMN之间的关系描述不清,既然生成的是智能合约的向量,那便没法用GMN。假如说GNN仅仅执行了一个节点嵌入的工作,那么评估部分为什么会说生成的是智能合约的向量(GMN的输入应该是两个图,不应该是两个向量)
2.ASG生成
图表示有更多的能力来保留一个程序的语义特征。
已经存在的大量的图表示,包括AST、CFG、DFG,分别来自不同的方面,语义、控制流、数据流。AST提供了一个源代码的抽象语法结构,他的叶子节点表示操作数,非叶子节点表示操作符,这样更容易发现关键的语义特征。然而,不论怎么说,控制流和数据流分别表示了语句的顺序和变量的处理流,更可能揭示运行时程序的行为。
ASG的基本思想是将上述多个视图组合成一个视图,以便在这种新型的智能合约中间表示中保留更多的句法和语义信息。
这样,使用单个图而不是多个图来训练神经网络模型更可行、更高效。
2.1 源代码的ASG
给出的智能合约的源代码可以通过一些成熟的编译工具编译成源代码,例如SolidityParser和solc-ast。(pysolc)
正如观察到的,AST提供了一个源码的细粒度语法表示。然而,随着程序规模的增加,他的AST可能变得极其复杂,直接利用AST做基础图将会导致大大增加节点和边的数量,这会导致后续的模型训练过程出现梯度爆炸等棘手的问题。
在这种情况下(In this case),ASG采用语句级别的粒度(granularity),他是基于源码的单独一行,如图4中橙色圆圈数字所示。
形式上,ASG是一个抽象语义图(abstract semantic graph),,其中V表示源代码中的语句,E中的边表示两节点之间的控制流或数据流。
控制流反应了智能合约中的语句的顺序,与其他语言相似,solidity使用if,while,for,continue和break等关键词来控制语句的顺序,而剩余的没有这些关键词的语句将顺序执行。控制流也是从源码中提取出来的,因此能够相应地(accordingly)引入ASG。
数据流图是源码地另一个正交表示,它描述了在多个操作之间地数据依赖关系。然而,数据依赖依赖于语句之间地执行顺序。因此,数据依赖的搜索必须考虑到通向数据依赖关系端点的每个控制路径。
ASG的生成算法1所示。
2.2字节码的ASG
3.图相似性学习
与传统的深度神经网络(CNN、RNN)相比,GNN更适合处理图结构的数据,然而,图匹配网络通过基于交叉图注意力的匹配机制来增强它。
在这个论文里,我们使用GNN进行图嵌入,然后使用GMN学习合约图对的相似性。
由这张图来看,图匹配网络也是产生两个向量,上文没问题,只是描述有问题
六、评价
1.数据集
收集了5735个开源智能合约,其来源包括SmartBug、SolidiFI,其他有标签的合约(没指明,并且不回邮件)
2.评估数据