一、智能合同可能存在的缺陷
虽然智能合同是一种创新,但是也存在一些漏洞,一些漏洞会被恶意的一方所利用。
不充分的输入验证是一个常见的漏洞,这使得黑客可以通过提供非预期的输入而对合同的履行施加影响。另外,如果不适当地使用商业逻辑,就会在合约中出现意料之外的动作或者出现逻辑上的空白,这就会造成合约的脆弱性。此外,不安全外部呼叫(如呼叫与外界资料来源或其它契约的介面有关)若处理不当,会导致脆弱性。
当一个合同在它自己的状态改变之前,被其他合同调用的时候,这个漏洞就会出现。这就使得被叫合同可以返回到叫合同中,并且可以再次完成它的一些动作。这会引起意料之外的欺诈行为,并且让攻击者能够更改合同的状况,这样就会使钱用完或者造成其它不利的影响。
由于这种攻击的潜在性,在使用外接契约和资料来源时,开发者也应该非常小心,并且要保证适当的外接呼叫,以免造成无法预料的动作和脆弱性。他们还可以通过加强对诸如智能合同测试之类的安全过程的监控,从而在各种可能的情况下为智能合同提供保护。
二、智能合同中的再入侵是什么?
在智能合同中,如果合同在自身的状态变化结束前对其他合同或者功能进行了调用,那么就会出现“重新进入”攻击。
这使得被叫合同可以返回到叫合同中,并且可以再次运行它的一些动作,这会引起无法预料的和经常发生的不正当的动作。例如,合同 A呼叫合同 B,以传送资本,并随后改变其自身的状况。
合同 B的代码可以包括允许它返回到合同 A中的回叫功能,并且可以在合同 A的状态改变结束前再次运行传送功能。这样,黑客就可以在最初的交易完成前多次获得合同中的钱。
另一个广为人知的案例是2016年在以太坊区链上对 DAO (Distributed Autonomous Organization)的臭名昭著的袭击。攻击者在 DAO协议中使用了一种名为“重新输入”的技术,通过这种技术可以将 DAO协议中的资金递归移除,从而盗取了以太币(ETH)。
此外, Uniswap, Lendf.我, BurgerSwap, SURGEBNB, Cream Finance, Siren等一系列分散式金融协议都受到了重启缺陷的严重影响。这些违反规定的金额从350多万美元到2500多万美元不等,突出表明 DeFi中的可重复攻击的安全隐患仍然存在。
三、重入的作用机制
重新启动攻击是通过对智能合同中的功能进行有序的执行,并通过对外部的调用,使其成为一个死循环,使得攻击者能够在任务完成前多次启动某个功能,从而造成不正当的操作和非法提款。
攻击者的合同实际上“欺骗”了被攻击方的合同,直到被攻击方完成了状态更改。这个动作会造成重复提取现金或者其它的过失。
上面的图说明了如何对一个智能合同进行重新访问。攻击者的合同会在受害人的账户上使用“withdraw ()”功能,然后将其发到以太币上。攻击方的备用功能随后会被激活,通过再次递归地调用 withdraw.(1)来消耗受害人合同中的钱。这样的攻击是针对受害人在转账前没有及时更新其账户上的余额进行的。
让我们用简单的例子说明重新进入攻击是如何运作的:
智能合同与“提现”
假设存在一个数字钱包的智能合同,该合同使用户能够提取他或她的资金。除了追踪使用者的结余,本契约亦设有提款的功能,让使用者更容易取出款项。提款能力一般可以让使用者把智能合同中的令牌或者以太币取出到自己的钱包中。
用户交互与函数实现
用户根据其自己的要求提取其钱包中的资金。他们利用提取函数来输入要提取的钱的数量。
提取功能在被呼叫的时候检验使用者有充足的钱来提取。如果需求得到满足,银行就会把需要的钱汇到使用者指定的银行地址。
外部呼叫程序
这正是它的薄弱之处。合约会在提取金额在使用者的结余中反应出来以前,对外呼叫其他契约或者帐户。
递归呼叫
如果外部合同的代码包括功能,该功能能够重新呼叫初始合同(如,另外的提取功能),那么就会建立一个递归回路。这就允许在创建完成前重新调用 withdraw。
可重新使用的
攻击者随后会利用恶意合同对这个周期进行攻击。攻击者的合同在钱包合同呼叫外部合同的过程中,并且在平衡被更新之前,迅速地再一次呼叫钱包的提取功能。
退避函数。
在一些情形中,攻击者可利用智能合同的后退特征(在合同接收无数据的呼叫或 Ebitra呼叫时激活的唯一特征)。当一笔钱还在处理的时候,反复的使用后退功能,就会造成一次后退攻击。
操纵和重复提取资金
攻击者的合同能够在相同的事务中多次利用提取能力,这是由于在接收到外界呼叫之前,皮夹匹配程序推迟了对余额的更新。这样一来,在没有得到允许的前提下,就很容易把钱拿出来,黑客就可以把钱偷到他们不该偷的地方去。之后,该公司导致了大量的钱包合同用户的财务损失。
四、再入攻击结果
重入攻击可以给智能合同的使用者带来很大的麻烦,因为他们有潜在的巨大的经济损失。
重新进入攻击的一个最直接的结果就是在脆弱的智能合同中进行非法的提款和操作。攻击者会使用这个弱点来重复地从合同中提款,从而使合同的结余减少,并且会对那些已经在合同中进行了投资或者储存了资产的客户产生严重的经济损害。
另外,如果再一次被入侵,就会使人们对智能合同和区块链的安全性和可靠性产生怀疑。重入攻击可以具有毁灭性的后果,正如2016年 DAO在以太坊区链上遭受的严重攻击所显示的那样,这导致了重大的财务损失并且破坏了社群的名誉。
除了短期的经济影响,重新入侵也会带来更长远的影响,比如法规和法律方面的担忧,投资者对区块链的信任降低,对区块链的平台和计划的名誉造成破坏。这种脆弱性的认识会使使用者在与智慧合同进行互动或者在分散式应用(DApp)上进行投资时变得更加小心,因此会妨碍区块链的使用和推广。
五、减轻再入效应的方法
为了减少重新进入的危险,必须执行关于建立和审核智能合同的最佳实践。
这涉及到利用已知的带有安全性纪录的程式码库,这也是达到这个目的的方式之一。这些库已经被大量的测试过,并且进行了同侪审查,从而减少了出现缺陷的可能性。
开发者也应该采用“检验-影响-相互作用”的设计来保证状态的改变是在原子的基础上进行的,从而将重新进入的可能性降到最低。如果有,则可利用可重新启动的安全智能契约发展架构,为这类弱点增加更多的防御。
由于这些框架一般都包括了一些内建的方式和防护,特别是为了防止重新进入的攻击,所以开发者很少会去手工增加防护。但是,因为区块链的安全性还在不断地进化,所以开发者还需要不断地发现其新的漏洞和威胁。