论文部分内容阅读
近年来,区块链作为一种新兴技术,引起了国内外学者的广泛关注和研究热情。区块链通过集成加密算法、分布式数据存储和共识机制等多种技术,在无需可信第三方条件下,即可实现远距离点对点的价值传输。区块链技术通过智能合约的运行,大大延伸了该技术适用的业务场景,业务场景从最初的金融领域扩展到物联网、医疗、能源及智能制造等实体领域。由于智能合约语言尚未成熟,开发人员素质参差不齐,智能合约不可避免地会存在漏洞。最近频频爆发的智能合约安全事件,不仅造成了巨大的社会经济损失,还严重降低了人们对区块链智能合约的信任程度。目前智能合约漏洞检测的主要方法有形式化验证、符号执行或符号分析、模糊测试等。然而,形式化验证有不能完全自动化的缺点;符号执行或符号分析往往需要探索合约中所有的可执行路径或符号化地分析合约中的依赖关系图,因此时间开销大,执行效率低,不适合大批量合约漏洞检测;模糊测试方法生成的测试样例具有较强的随机性,易导致代码覆盖率低,往往无法有效检测出智能合约代码中的所有漏洞,且同样具有检测周期长的缺点。面对与日俱增的智能合约数量,现有方法不堪重负。为了保证合约漏洞检测的准确率并提高检测的效率,本文提出了一种基于机器学习算法的自动化合约漏洞检测方法,通过提取智能合约的有效特征及训练多标签分类模型,实现了对整数上溢、整数下溢、交易顺序依赖、未检查返回值、时间戳依赖和代码重入6种智能合约漏洞准确且高效的自动化检测。经过大量实验证明,本文方法更适用于大批量合约漏洞检测的应用场景。为了获得足够的智能合约数据以开展研究,本文设计并实现了一个自动化大批量爬取智能合约数据的网络爬虫工具,并对该工具进行了多线程优化,大大提高了数据采集的速率。经过一段时间爬取,采集到大量以太坊智能合约数据,包括合约的Solidity源码、Solidity版本、代币名称、合约地址等有用信息,构建了一个全面且时新的智能合约数据集。本论文通过研究合约源码Solidity语言、以太坊虚拟机字节码和操作码之间的关联性,并深入分析操作码与智能合约漏洞的内在联系,提出了操作码抽象规则。本论文通过n-gram算法从操作码数据流中提取bigram特征,并通过定义的特征计算公式计算bigram特征对应的特征值,构建特征矩阵。本文使用XGBoost、Ada Boost、随机森林、支持向量机和k近邻等分类算法,结合SMOTE或SMOTETomek数据平衡方法,在数据集上做了大量的实验。实验证明,基于SMOTETomek平衡训练集学习的XGBoost多标签分类模型对智能合约漏洞的检测效果最好,评价指标micro-F1和macro-F1值分别高达98.48%和96.41%。同时本方法大大提升了检测的效率,平均约4秒检测一个合约。基于上述实验结果,本文设计并实现了一个B/S架构的智能合约漏洞检测系统,允许用户上传智能合约源码或者字节码,系统在线进行数据处理。本系统通过训练好的机器学习模型对智能合约进行检测,并显示检测结果。