作者:Jagjit Singh,CoinTelegraph;编译:五铢,本站
尽管智能合约具有开创性,但它也并非不受恶意方可能利用的缺陷的影响。
输入验证不足是一个普遍的弱点,使攻击者能够通过提供意外的输入来影响合约的执行。 此外,业务逻辑的不当应用可能会在合同中产生意外行为或逻辑差距,从而导致漏洞。 此外,如果处理不当,不安全的外部调用(例如涉及与外部数据源或其他合约的接口的调用)可能会造成漏洞。
重入攻击是一个合约在完成其自身状态更改之前从外部调用另一个合约时发生的弱点。 这允许被调用合约重新进入调用合约,并可能再次执行其某些操作。 这可能会导致意外的行为,并允许攻击者改变合约的状态,从而耗尽资金或产生其他负面影响。
考虑到此类攻击的可能性,开发人员在使用外部合约或数据源时也应谨慎行事,确保正确处理外部调用,以避免意外行为和漏洞。 他们可以通过密切关注智能合约测试等安全程序来帮助保护智能合约免受不断变化的威胁。
在智能合约中,当合约在完成自己的状态更改之前从外部调用另一个合约或函数时,就会发生重入攻击。
这允许被调用合约重新进入调用合约,并可能再次执行其部分操作,这可能会导致不可预见且频繁的恶意行为。 例如,合约 A 调用合约 B 发送资金,然后修改自己的状态。
合约 B 的代码可能包含一个回调函数,允许其重新进入合约 A,并可能在合约 A 完成其状态更改之前重新执行传输函数。 这将使攻击者能够在完成初始交易之前多次从合约中获取资金。
2016 年臭名昭著的以太坊区块链上的去中心化自治组织 (DAO) 黑客攻击是另一个众所周知的例子。 攻击者利用智能合约代码中的重入缺陷,递归地从 DAO 中删除资金,最终导致价值数百万美元的以太坊 (ETH) 被盗。
此外,包括 Uniswap、Lendf.Me、BurgerSwap、SURGEBNB、Cream Finance 和 Siren Protocol 在内的多个去中心化金融 (DeFi) 协议由于可重入漏洞而蒙受了重大财务损失。 这些违规行为造成了 350 万美元至 2500 万美元的损失,凸显了 DeFi 领域可重入漏洞带来的持续威胁。
重入攻击利用智能合约函数的顺序执行和外部调用形成一个循环,攻击者可以在完成之前多次执行特定函数,这可能会导致恶意行为和未经批准的资金提取。
在受害者完成状态修改之前,攻击者的合约有效地“欺骗”受害者的合约回调攻击者的合约。 此操作可能会导致反复提款或其他疏忽行为。
上图演示了对智能合约的重入攻击。 攻击者的合约调用受害者的“withdraw()”函数,该函数在更新余额之前发送以太坊。 然后,攻击者的后备函数被触发,再次递归调用withdraw()以从受害者合约中耗尽资金。 这种攻击利用了受害者在发送资金之前未能更新余额的情况。
让我们使用一个简化的示例来分解重入攻击的工作原理:
假设有一个允许用户提取资金的数字钱包智能合约。 除了跟踪用户余额之外,该合约还具有提款功能,方便资金提取。 提款功能通常允许用户将他们的代币或以太坊从智能合约提取到他们的个人钱包。
用户自行请求从钱包中提款。 他们使用提款功能输入所需的提款金额。
提款函数会在调用时验证用户是否有足够的资金进行提款。 如果满足要求,它将所需的资金转移到用户选择的地址。
这就是弱点显现出来的地方。 在提款反映在用户的余额中之前,合约会对另一个合约或账户进行外部调用。
如果外部合约的代码包含可以再次调用原始合约的函数(例如另一个提款函数),则会创建一个递归循环。 这使得可以在完成之前再次调用withdraw方法。
然后,攻击者使用恶意合约来利用此循环。 攻击者合约在钱包合约调用外部合约期间,在余额更新之前,快速再次调用钱包的提现函数。
在某些情况下,智能合约的回退功能(一种独特的功能,当合约收到没有任何数据或以太坊的调用时启动)可能会被攻击者使用。 重入攻击可以通过在资金仍在处理过程中重复调用回退函数来进行。
攻击者的合约可以在同一笔交易中重复使用提款功能,因为钱包合约会延迟更新余额,直到收到外部调用后。 因此,这使得资金更容易在未经授权的情况下被取出,从而使攻击者能够窃取超出其合法权利的资金。 随后,它给钱包合约的用户造成了巨大的经济损失。
重入攻击会对智能合约用户产生严重影响,因为它们有可能造成重大财务损失。
重入攻击最直接的后果之一是未经授权提取或操纵易受影响的智能合约中保存的现金。 攻击者利用该漏洞反复从合约中提取资金,耗尽合约余额,并可能给在受影响合约中投资或存储资产的用户造成重大财务损失。
此外,重入攻击可能会削弱用户对智能合约和区块链技术安全性和完整性的信心。 重入漏洞可能会产生灾难性的影响,2016 年以太坊区块链上的 DAO 黑客事件等备受瞩目的事件就证明了这一点,该事件造成了巨大的经济损失并损害了社区的声誉。
除了短期财务后果之外,重入攻击还可能产生长期影响,例如监管和法律关注、投资者信任度下降以及对区块链平台和项目声誉的损害。 容易受到攻击的认知可能会导致用户在与智能合约交互或投资去中心化应用程序(DApp)时保持谨慎,从而阻碍区块链技术的采用和扩展。
在智能合约创建和审计方面实施最佳实践对于减轻重入威胁是必要的。
这包括使用具有安全记录的知名代码库,这是实现这一目标的一种方法。 这些库经过了广泛的测试和同行评审,这降低了引入漏洞的机会。
开发人员还应该使用“检查-效果-交互”设计等安全检查,通过确保状态修改以原子方式发生,最大限度地减少重入攻击的机会。 如果可用的话,可以使用可重入安全的智能合约开发框架来添加针对此类漏洞的额外防线。
开发人员不太可能手动添加安全保护,因为这些框架通常包含专门设计用于避免重入攻击的内置方法和保护措施。 然而,由于区块链安全仍在发展,开发人员必须继续寻找新的威胁和弱点。