Abstract

摘要:随着金融市场上首次代币发行(ICO)的蓬勃发展,智能合约在消费者中迅速普及。 然而,智能合约漏洞使它们成为导致巨大损失的恶意攻击的主要目标。 因此,研究界正在将各种软件工程技术应用于智能合约以解决这些问题。 一般来说,为了检测智能合约中的漏洞,基于变异和模糊的测试方法已被广泛研究,并且确实在基准数据集上取得了可喜的性能。 使用变异方法生成测试输入本质上依赖于智能合约程序中可用的测试用例。 然而,在我们的初步研究中,我们观察到 218 个已确定的开源智能合约项目存储库中有 56.4% 没有提供任何测试用例进行验证。 模糊测试输入会导致随机值,缺乏实际用途。 我们的工作解决了这个问题:我们提出了一种方法,SMARTGIFT,它通过从现实世界的智能合约的交易记录中学习来生成用于测试智能合约的实用输入。 利用收集的超过 6 万条交易记录,SMARTGIFT 能够为 77% 的智能合约功能生成相关的测试输入,大大优于传统的模糊测试方法(仅 60% 的功能成功)。 我们通过使用测试输入替换最先进的智能合约漏洞检测器 ContractFuzzer 的测试输入,进一步证明了测试输入的实用性:借助 SMARTGIFT 的输入,ContractFuzzer 现在可以在其基准测试中检测到 154 个漏洞中的 131 个。
索引词——测试输入生成、智能合约、深度学习。

I. INTRODUCTION

区块链 [1] 技术实现了一个重要的里程碑,实现了用于记录加密货币 [2] 交易的去中心化和分布式数字分类账(例如,比特币 [3]、以太坊 [4] 和莱特币 [5] ])。 在这种情况下,智能合约利用区块链技术来实现执行合约条款的计算机化交易协议,越来越多地受到行业和研究团体的研究 [6]、[7]。 为参与者提供智能合约,以减少发起合约时对可信中间人的需求,从而减少可能的欺诈损失,仲裁和执行成本,以及恶意或意外例外 [8]。

作为一个不需要任何外部信任授权的自动执行程序,智能合约有望用于与数据驱动交易相关的各种交互 [1]、[7]。 2018 年底,在广受欢迎的自由职业者 Guru1 平台上发布的招聘广告中,有 5-10% 与智能合约和区块链相关 [9]。 在许多国家在法庭上调查智能合约的实际法律价值的同时,越来越多的开发人员正致力于推动智能合约在金融、游戏和公证等各个领域的应用[10]。 在去中心化应用的全球开源平台 Ethereum2 中,截至 2020 年 9 月末部署了超过 200 万个智能合约账户3,总计超过 1.1 亿个以太币,价值超过 374 亿美元(以太 是数字货币和以太坊应用的货币,当时一个以太币价值超过 340 美元)。

智能合约中的安全问题可能会在现实世界中造成巨大的经济损失。 例如,臭名昭著的“DAO”攻击重入问题导致 DAO 的投资者在 2016 年 6 月损失了 350 万以太币(当时至少 6000 万美元)[11]。 同样,Parity Ethereum 软件客户端背后的团队揭示了一个关键代码缺陷(例如 Parity Freeze)如何导致价值 1.6 亿美元的以太币冻结 [12]。 这些代价高昂的攻击表明,在部署智能合约之前提高其质量至关重要,特别是因为它们一旦部署就不可更改。 不幸的是,由于底层特定领域语言(例如 Solidity4)的复杂语义以及其演变过程中潜在的破坏性变化,开发可信赖和安全的智能合约是一项极其困难的任务。 为了解决智能合约可以在其程序中携带的安全问题,文献[13]、[14]、[15]、[16]、[17]、[18]、[19]中提出了各种方法, [20]、[21]、[22]、[23]、[24]、[25]、[26]。 大量这些工作构建了有关生成测试输入以进一步测试智能合约的方法,以便在部署之前识别潜在的漏洞。

合同主要依赖于模糊测试和变异[27]、[28]、[25]、[29]、[30]、[31]、[32]、[33]。 例如,蒋等人。 [34] 提出使用有效输入域和智能合约中某些数据类型经常使用的输入来构建种子输入,以进一步模糊输入以测试智能合约的 ABI。 为了检测智能合约中的重入漏洞,ReGuard [35] 通过迭代生成随机但多样化的交易对智能合约进行模糊测试。 最近,Ma 等人。 [36] 探索了智能合约函数的反馈导向突变和参数类型来模糊测试输入。 通过分析 GitHub 和 Stack Exchange 中列出的关于智能合约的 Solidity 文档和问题,Liu 等人。 [37] 为测试输入生成定义了 15 个变异算子。 安德斯塔等人。 [38] 设计了十类变异算子,灵感来自 Solidity 智能合约中的真实故障,以生成新的测试输入。

然而,智能合约的最新测试用例(即输入)生成高度依赖于现有输入的质量,并且 ƒ 涉及高度随机性,可能会影响生成的测试输入的有效性 . 此外,智能合约测试套件中提供的测试输入在大多数情况下是不切实际的,因为它们是用简单的值设置的,或者是由开发人员随机提供的。 例如,图 1 显示了智能合约功能的测试示例,该功能摘自名为 SmartContractSlackDapp5 的去中心化应用程序 (DApp),通过 Slack 实现彩票。 在这个例子中,函数 placeBets() 通过检查两个玩家下注后是否会成功增加底池来测试函数,其中两个赌注都设置为“minStake”。 不幸的是,由于任意或随机设置,测试用例中 minStake 的值相当不切实际。 这样的测试用例不包括较小的(和现实的)赌注,这些赌注将测试会导致溢出异常的最小限制或最大值。 最后,……在我们的初步研究中,我们发现大多数智能合约开源项目不包含任何测试用例来引导进一步的输入生成。

总体而言,目前智能合约的测试实践仍有改进的空间。 特别是,开发人员确实需要实际的输入来测试他们的智能合约。 我们的直觉是,我们可以从部署平台上进行的真实交易中学习,以更好地为测试用例生成定制输入空间。 幸运的是,在去中心化的区块链平台(如以太坊)上已经部署了大量的智能合约,其中各种实际交易可以为执行智能合约提供丰富的实用和可操作的输入。 Liu 等人最近的工作。 [39] 关于识别方法命名错误的研究表明,类似的任务是由不同的开发人员独立实现和命名的。 智能合约实现应该在功能上有一些相似之处。 因此,我们基于这样的假设,即智能合约的类似功能可以通过类似的输入进行验证。 在本文中,我们建议通过学习现实世界中成功部署和执行的智能合约测试用例,为新编写的智能合约生成实用的测试输入。 我们将实际输入定义为对测试有意义的输入:它是用户在实践中使用的实际输入,并且可能为发现漏洞提供更好的覆盖率。

我们的工作调查了上述假设,并建立了一种学习方法,以通过更好的输入来改进智能合约测试。 为此,我们首先通过收集在现实世界中成功部署的智能合约的交易记录,构建具有实际输入的智能合约功能数据集。 每个函数都经过处理以获得其签名,该签名进一步用于通过 BERT [40] 深度表示学习技术生成嵌入(即数值向量)。 给定一个新的智能合约,其所有功能都将以相同的方式处理以提取其特征,这些特征将用于匹配收集到的数据集中的类似功能。 匹配相似功能的实际输入被认为是为被测智能合约的功能推导测试输入。 最后,我们实现了一个名为 SMARTGIFT(为测试智能合约生成实用输入)的原型工具来生成用于测试智能合约的实用输入。 我们还对我们方法的有效性进行了详细评估。 实验数据可在以下网址公开获得:https://github.com/chaoweilanmaohahaha/SmartGift

本文做出以下贡献:

  1. 我们对开源智能合约项目中测试用例的可用性进行了调查。 我们的主要发现测试用例很少见,这是在(不可变)部署之前对其验证的担忧。
  2. 我们提出了一种通过从函数的具体输入中学习来生成用于测试智能合约的实际输入的方法。 这些输入是从已执行的现实世界智能合约的交易记录中提取的。
  3. 我们实现了一个原型工具 SMARTGIFT,该工具通过三个实验进行评估,这些实验基于 66,528 个交易记录、145 个智能合约功能和 154 个易受攻击的智能合约。 ‚ 实验结果表明,SMARTGIFT 从其他智能合约中导出的测试输入对于测试被测智能合约中约 77% 的功能是现实的。 ƒ SMARTGIFT 的测试输入能够通过覆盖程序中的相关极端案例来发现智能合约中的问题。 „ 最后,SMARTGIFT 能够生成输入,从而使用 ContractFuzzer [34] 检测到 131 个(154 个)基准漏洞。

文章地址:https://jacquesklein2302.github.io/papers/2021-ICSME-SmartGift.pdf