本文是一篇计算机论文,本文提出了基于BERT和TextCNN的智能合约漏洞检测方法。该方法可以使用大量未标记的数据进行预训练,同时只需少量标注数据进行微调,从而解决智能合约标注数据稀缺的问题。
第一章 绪论
1.1 研究背景与意义
随着比特币等数字加密货币的日益普及,区块链[1]技术逐渐进入人们的视野。区块链是一种全新的去中心化基础架构和分布式计算范式,通过共识协议在区块链网络中由节点们共同控制。区块链技术在金融领域、医疗领域、物联网服务等领域都取得了成功的应用, 智能合约作为区块链技术最广泛的应用之一, 在区块链生态系统中处于至关重要的地位,已经成为学术研究的热门话题。
根据成都链安《2022年Q3全球区块链生态安全报告》显示,从2022年年初到9月份,因攻击事件造成区块链生态的损失的金额已达到惊人的23亿1791万美元。只2022年第三季度,区块链生态领域攻击事件就超过37起,总损失超过4亿504万美元,其中以太坊损失金额位于各区块链平台第一位,损失高达3亿7428万美元。报告显示,合约漏洞利用依然是最常见的攻击手法,在2022年第三季度中,约有15起事件源于合约漏洞利用,占总数量的40.5%。合约漏洞造成总顺势达2亿160万美元,占总损失的50.9%。
1.2 国内外研究现状
1.2.1 智能合约漏洞检测研究现状
智能合约是区块链技术的核心应用之一,它们被广泛应用于各种领域,例如数字货币、金融、电子商务等。然而,智能合约中的漏洞和错误会导致严重的后果,例如资金损失和安全威胁。因此,智能合约检测成为了当前研究的热点之一。智能合约的代码一旦发布,就无法修改。因此,智能合约的安全性至关重要。为了确保智能合约的安全性,研究人员提出了各种智能合约检测方法和工具。现阶段智能合约的漏洞检测方法主要包括形式化验证[3,4]、符号执行[5,6]、模糊测试[7]、机器学习方法。
智能合约形式化验证方法是一种通过数学方法对智能合约进行验证的技术。它基于数学逻辑、自动机理论、模型检测等形式化方法,以精确严谨的方式对智能合约的正确性进行验证,避免人为疏忽和错误带来的风险。Deajun等人[8]使用智能合约端到端的形式化验证,发现了编译器隐藏的细微错误。Singe等人[9]对解决智能合约七个问题的形式化方法进行综述。但形式化验证通常需要复杂的推理和大量的数学验证,适用范围和自动化程度都很低。
智能合约符号执行方法是一种自动化测试技术,它通过在输入和操作参数上构造符号而不是具体的值来分析程序行为,从而对智能合约进行验证。与传统的测试方法相比,符号执行方法需要生成操作码的控制流程图,能够覆盖更多的程序路径,发现更多的漏洞。刘宇航等人[10]使用符号执行方法,在源代码和字节码层面进行代币买卖漏洞挖掘,实验证明,该方法可以有效检测买卖后门漏洞以及owner权限转移漏洞。Mossberg等人[11]构建了一个智能合约符号执行框架Manticore,该架构能够同时支持传统和特定的执行环境。但符号执行方法性能较低,不能很好地处理大型程序或复杂算法,无法处理程序的一些非确定性问题,并且存在的路径爆炸问题使得测试变得复杂,十分耗时。
第二章 相关技术与知识背景
2.1 智能合约漏洞
智能合约是一种在区块链网络上执行的自动执行代码,是一种预先编写的代码,不需要任何中介。它们具有数据存储和程序执行的功能,并且是不可变的。智能合约在网络上存储,并通过验证其中的所有节点共同执行。智能合约被部署到区块链上后,就不能被更改或删除,因此可以提供可靠和不可篡改的环境。智能合约可以用来实现各种应用,如自动执行的购买协议,投票系统,资产管理等。但由于以太坊兴起太快,存在没有标准的智能合约开发流程、开发人员素质不高的问题,导致以太坊智能合约漏洞普遍存在,可能对区块链系统造成严重破坏。智能合约一旦部署到区块链上就不能被修改,所以如果智能合约存在漏洞,将不能对其进行修复。这可能导致一系列问题如资产损失、系统瘫痪和敏感信息泄露等问题。因此,为避免合约漏洞,需要继进行智能合约代码的安全漏洞。本节针对以太坊智能合约出现的一些常见漏洞进行原理分析。并根据SWC(Smart Contract Weakness Classification and Test Cases)智能合约漏洞库进行讲解。
2.1.1 可重入漏洞
可重入攻击(Reentrancy),SWC ID为SWC-107,在安全漏洞词典中被定义为CWE-841型漏洞,即工作流程执行不当导致的问题。当智能合约在还没有改变合约内部交易状态前进行以太币交易,就会存在此类漏洞,当攻击者进行以太币交易时会自动调用fallback函数,这是以太坊智能合约的特殊机制,而fallback函数由用户自己编写,由于合约中没有先改变交易状态的而直接进行交易,所以攻击者只需要在fallback函数中嵌套的调用withdraw函数,就会导致循环转账而不改变合约中用户余额状态信息,从而偷光合约中所有人的以太币。可重入漏洞导致的事件,最著名的莫过于2016年的The DAO基金盗币事件,损失超过价值6000多万美元的以太币,以太坊团队试图通过软分叉的方式控制损失,但这一行为也使得相当一部分用户对以太坊失去信任,最终导致以太坊的硬分叉。含有可重入漏洞部分代码示例如图2-1所示.
2.2 智能合约漏洞检测相关技术
由于区块链具有不可篡改性,因此上链前需要对智能合约中存在的漏洞进行检测,避免部署上链的智能合约存在漏洞。根据对智能合约检测方法不同[33,34],可以分为形式化验证、符号执行、模糊测试以及机器学习四类智能合约漏洞检测的方法,如图2-10所示,并分别介绍了对应方法及相关检测工具。
2.2.1 形式化验证
形式化验证方法是基于数学方法对程序进行严谨的、精确的数学推理,从而实现对智能合约的漏洞检测和挖掘。采用形式化验证方法检测智能合约漏洞是当前的热门研究领域之一。目前已在核电、航天等高安全要求的领域取得了成功应用,常见的形式化验证方法包括定理证明、模型检测、规约语言、形式化建模等方法。
定理证明是在符号逻辑中通过演绎推理提供证明的方法,通过在证明的每个步骤引入公理并提供陈述,使用谓词逻辑进行推导,最终得到想要的结果。常见的通过定理证明方法衍生出的形式化验证工具主要有F*框架[35]、Event-B[36]等。
第三章 基于词嵌入和Shapelet时序特征的智能合约漏洞检测........................ 27
3.1 数据集预处理 ........................ 27
3.1.1 数据集 ............................. 27
3.1.2 获取操作码 ..................... 29
第四章 基于BERT和TextCNN的智能合约漏洞检测方法 ......................... 51
4.1 BERT 模型 ......................... 51
4.2 TextCNN模型 ......................... 53
4.3 基于BERT和TextCNN的智能合约漏洞检测方法 ...................... 55
第五章 总结与展望.......................... 64
5.1 研究工作总结 ............................ 64
5.2 研究工作展望 ............................ 65
第四章 基于BERT和TextCNN的智能合约漏洞检测方法
4.1 BERT 模型
BERT是一种基于Transformer架构的自然语言处理模型。它是一种预训练语言模型,可以在未标记的文本数据上进行训练,然后在下游NLP任务中进行微调,以提高其性能。在传统的NLP任务中,使用词袋模型(Bag-of-Words)来表示文本,这种方法将文本视为单独的词语,而忽略了它们之间的顺序和联系。与传统的基于规则或特征工程的NLP方法相比,BERT模型更加通用,可以应用于多种NLP任务,例如文本分类、命名实体识别、句子关系判断和问答等。
BERT的架构采用了Transformer的编码器结构,其中包含多个Transformer块。Transformer块由多个自注意力层和全连接层组成。自注意力层可以让模型自动地对不同单词之间的重要性进行加权,从而更好地捕捉语义信息。全连接层可以帮助模型提取更高层次的语义信息。BERT算法是一种预训练模型,其基本架构由两个阶段组成:预训练阶段和微调阶段。
第一阶段:预训练阶段
BERT预训练的输入是一段文本序列,其输出是每个单词对应的上下文相关的向量表示。BERT的预训练阶段包含两个任务:MLM(Masked Language Model)和NSP(Next Sentence Prediction)。
在MLM任务中,对输入文本中的一些单词进行随机遮盖,然后要求模型预测这些被遮盖的单词。这个过程可以让模型学习到单词之间的语义关系,从而使得模型在处理文本任务时能够更好地理解上下文语境。首先MLM任务随机将输入句子中的一些词汇标记为[MASK],然后使用上下文中的其它词汇来预测这些被标记的词汇。例如,如果句子是“我喜欢吃__果”,Bert可能会将“苹”标记为[MASK],然后使用上下文中的其它词汇来预测“苹”是正确的词汇。这个任务是为了让Bert学习到上下文信息对于词汇理解的重要性,并且鼓励模型学习到词汇间的关联性。
第五章 总结与展望
5.1 研究工作总结
本文首先介绍了智能合约漏洞检测领域的相关背景、常见的智能合约漏洞以及常见的智能合约漏洞检测技术。针对现有智能合约漏洞检测方法的存在和时序特征和语义特征提取不充分的问题,本文基于时序特征和文本分类的智能合约漏洞检测方法进行研究。首先,本文提出了一种新的漏洞检测方法,该方法基于词嵌入和Shapelet时序特征的自动提取分类,同时结合机器学习方法构建漏洞检测模型。同时,针对Shapelet算法复杂度高的问题,本文提出了基于BERT和TextCNN的智能合约漏洞检测方法。该方法可以使用大量未标记的数据进行预训练,同时只需少量标注数据进行微调,从而解决智能合约标注数据稀缺的问题。
综上所述,本文主要的工作如下:
(1)使用词嵌入技术对智能合约操作码进行语义编码。在智能合约漏洞检测中,操作码的编码质量将直接影响着后续智能合约漏洞检测的效果。本文采用自然语言处理的词嵌入技术对操作码进行语义编码并嵌入到多维空间,获得操作码的语义向量特征表示,在不损失操作码命令语义特征的同时,使得操作动作相近的智能合约命令和函数在编码后的向量空间中欧氏距离也相近,解决了Shapelet方法应用于文本时序特征提取时的距离计算问题。
(2)采用时序分析方法,提出基于Shapelet时序特征的智能合约漏洞检测方法。本文首次将Shapelet特征提取方法引入智能合约漏洞检测模型中。提出了基于Shapelet-Transform的时序特征自动提取方法,获取智能合约操作码的时序特征,并结合机器学习方法构建漏洞检测模型,在不损失分类精度的前提下,提供了良好的可解释性,得到的Shapelet时序特征也可以为后续的代码漏洞定位提供依据。
(3)针对(2)方法存在的复杂度高的问题,采用自然语言处理技术,提出了基于BERT和TextCNN的智能合约漏洞检测方法。将自然语言处理的预训练模型BERT和文本分类方法TextCNN引入智能合约漏洞检测领域中,解决了Shapelet算法复杂度高的问题,且分类精度高于2)方法。同时该方法为智能合约数据集存在的标记数据少,而未标记数据集多的现状提供解决方案。
参考文献(略)