
5.1 引用
Kolluri A, Nikolic I, Sergey I, et al. Exploiting the laws of order in smart contracts[C]//Proceedings of the 28th ACM SIGSOFT International Symposium on Software Testing and Analysis. ACM, 2019: 363-373.
5.2 摘要
我们研究了基于区块链的智能合约中的一系列错误,我们称之为事件排序(EO)错误。这些bug与合同事件的动态排序密切相关,即在区块链上调用其功能,使数百万美元以太币的潜在利用成为可能。已知的此类错误示例和检测它们的早期技术仅限于少量的事件序列。我们的工作提供了一种新的EO bug的一般类型,即查找在此类事件的长排列中产生的并发属性。
检测我们的EO错误公式的技术挑战是路径和状态空间分析中固有的组合爆炸,即使对于简单的合约也是如此。我们提出了偏序降阶技术,自动提取合同的先发生关系,以及基于动态符号执行技术的其他几种优化。我们构建了一个名为EthRacer的自动工具,它不需要用户提示,可以直接在以太坊字节码上运行。它标记了一万多个合约中的7-11%,平均每个合约大约分析了18.5分钟,得到了分析师可以作为实证来运行的紧凑的事件序列。这些实证非常紧凑,确认只需要几分钟的人力。一半的标记合同都有细微的EO漏洞,包括价值数亿美元的ERC-20合同。因此,EthRacer可以有效地检测现有工具所忽略的一类细微但危险的bug。
5.3 技术介绍
本文研究了智能合约中由于其固有的并发执行模型而产生的一类漏洞。多个用户可以同时调用合同,多个提交的事务的顺序由矿工通过协商一致的协议不确定地决定。契约可以同步调用其他契约,并异步调用链服务,这些服务不会以预先确定的顺序返回。由于以太坊契约是有状态的,因此在调用之间合同数据的突变会持续存在。因此,预测一组调用契约的事务的结果需要对并发交互事务的不确定性或顺序进行推理。开发人员通常在编写合同时假定合同的执行顺序是特定的,缺少只有在复杂的交错中才能观察到的不良行为。这种推理对人类审核员来说是经典的困难。因此,允许开发人员、审计人员和智能合约用户增加对合约按预期运行的信心的工具是有用的。
以太坊智能合约中的某些并发错误是已知的。但是,由于意外的事件顺序(即对通过事务和回调调用的合同函数的调用)而产生的错误的完全通用性还没有经过系统测试,也没有完全理解。最主要的挑战是,分析多个事件下的合同分布在多个事务中,会导致状态空间中的组合放大,需要进行检查。因此,通过检查通常单个或一对事件的属性,现有的工具被设计为避免搜索大的路径空间。例如,可以通过检查函数是否可以在单个事务执行中调用自身来找到臭名昭着的重入错误(例如the Dao),而Oyente工具报告的事务排序错误检查一对事件。在这项工作中,我们为多个事件下的以太坊智能合约开发了新的高效分析技术。
我们的工作将以前的几个类或错误概括为更广泛的并发错误类别,我们称之为事件排序(EO)错误。核心思想是检查更改合同的输入事件(函数调用)的顺序是否会导致不同的输出。如果合同在重新排序的输入事件下显示不同的输出,则将其标记为EO错误; 否则,事件重新排序不会对输出产生影响,因此合同是EO安全的。我们对EO错误的表述加深了传统编程语言中契约与并发对象之间的联系。具体来说,我们展示了如何直接将合同事件与共享内存对象的原子操作并置。这导致契约的短语属性直接作为传统的并发属性。例如,我们观察到对脱链服务的异步调用遵循调用/返回模式,并且可能导致违反线性化。此外,我们表明合同容易受到事件竞争的影响,因为同步属性的执行不当。我们发现数百个具有先前未知错误的实时合同,强调程序员通常需要这些属性,但未能在实现中强制执行。为了解决组合路径和状态爆炸,我们开发了许多优化技术。进一步推断“合同与并发对象”类比,我们表明偏序降阶技术可以应用于合同分析。具体来说,如果两个函数只能以某种顺序调用(或者是异常结果),或者重新排序一组函数会产生相同的输出,那么事件组合就会反复枚举这些序列。
如果由同一组具体事件组成的两个不同的跟踪产生不同的输出,则合同中存在EO错误。这些错误可能是由于违反了线性化和同步特性而产生的。我们试图检查给定的智能合约是否存在EO错误。请注意,我们的问题公式比以前的工作更为普遍,后者引入了称为交易排序错误(TOD)的一个子类同步错误。TOD错误只捕获一组交易,并且仅限于合同余额的差异。我们的EO bug公式也与可重入性bug的概念不同,例如臭名昭著的DAO,因为它不符合事件的重排序。当一个契约在单个事件的两个不同值下显示不同的输出时,就会出现可重入性错误,其中一个输出一个事务,该事务随后可能导致一个关键函数重新进入自身。可重入性错误由多个工具检测,这些工具分析单个事件的不同值运行。我们的目标是有效地检查在多个事务中重新排序合同的输入事件是否会导致不同的输出。

图 1 EthRacer的主要组成部分
我们设计了一种新的分析技术和一种称为EthRacer的自动工具来寻找此类合同。如图3所示,EthRacer直接在以太坊智能合约的EVM字节码上工作,作为公共区块链数据的输入。当检测到EO违规时,EthRacer的输出至少是两个记录道,由至少两个不同的事件组成,具体来说,当在来自给定区块链状态的以太坊虚拟机(EVM)上执行时,这些事件显示不同的输出。我们采用一种动态测试方法来发现EO错误。这主要是因为我们的目标是产生具体的实证,从而分析师可以重现以检查和确认EO漏洞。发现重排序错误的技术障碍是分析的路径和状态空间组合爆炸。为了说明这一点,我们考虑一个基线解决方案,他需要可以解释契约在单个输入事件的不同值下的行为,这种分析的一种最先进的有效技术是基于动态符号执行(DSE)。符号分析是对一组被编码为符号路径约束的事件值进行分析的原因,这有助于识别部分有序的事件,而不是模糊的具体值。
我们第一个观察是合同函数通常以具有某种有效执行的预定顺序的方式编写。以不同的顺序执行它们只会导致合同抛出异常。这可以作为事件之间的部分顺序或作为发生之前(hb)关系捕获。如果以一个顺序执行它们而另一个无效,则两个事件e1和e2处于hb关系。洞察力是,如果我们发现事件对e 1和e 2处于hb(e1, e2)关系中,那么涉及这些事件的无效顺序的所有3个排列将导致异常.
第二个观察是,某些事件产生相同的输出,而不管它们在任何跟踪中出现的顺序如何。在我们的实验中,一个简单但高效的优化是识别不写或不读全局状态的事件运行。这样的事件可以在不改变输出的情况下任意地重新排序,因此不需要测试简单地重新排序这些事件的排列。同样,不写入任何共享全局状态的事件也可以任意重新排序。因此,也不考虑提取HB关系。
最后的一个观察主要涉及优化线性化违规。 此优化旨在优先搜索涉及异步回调的事件跟踪,并减少可能是良性的标记EO错误。 如果我们只考虑每个Oraclize预言机及其匹配的回调按顺序或原子方式执行的跟踪,那么这些命令可能会产生预期的(良性)输出。 这种跟踪,其中对应于不同用户请求的事件不是“无序的”,被定义为可线性化的。
我们用EthRacer来衡量10000多个合同中EO漏洞的普遍性。其中只有不到1%的实时合同附有源代码,因此我们的工具不需要源代码,直接分析以太坊字节码。这使得第三方可以在没有来源的情况下对合同进行审计和测试。我们采用动态测试方法,构造输入并系统地尝试所有可能的函数顺序,直到达到预算的时限。结果表明,大多数合同在输出方面没有表现出差异,并且当合同在重新订购时表现出不同的输出时,它们在超过50%的情况下可能会出现意外行为。在对一万多个合同的分析中,我们发现共有789个(7.89%)违反了同步特性,47个(11%)违反了线性化特性。因此,我们的属性公式捕捉到一个微妙的、危险的EO bug类,而不会过度触发警报。
5.4 本文主要贡献
我们研究了以太坊智能合约中的事件排序错误,利用它们与并行程序中两个经典概念的相似性:线性化和同步关系。我们为这些违规行为提供了一个正式的模型,并且开发了一个用于检测EO错误的自动化工具EthRacer。我们还演示了如何从代码中推断内在关系发生在关系之前,以及如何在搜索错误时使用这种关系来缩小搜索空间。
本文由南京大学软件学院2018硕士巫浩然翻译转述。
添加新手交流群:币种分析、每日早晚盘分析
添加助理微信,一对一亲自指导:YoYo8abc