重入攻击是什么?一文解读智能合约中的重入攻击

 重入攻击是什么?一文解读智能合约中的重入攻击!利用智能合约的可重入性,攻击者反复进入合约并执行恶意代码。重入攻击利用了合约执行期间的状态不一致,从而导致合约在执行完攻击者的代码后仍然具有余额,攻击者可以重复执行攻击并一直提取资金,最终导致合约的损失。

今天币圈188小编给大家分享的是智能合约中的重入攻击的详细解读,需要了解的朋友不要错过哦!

一、智能合约中的潜在漏洞

尽管智能合约具有开创性,但它也并非不受恶意方可能利用的缺陷的影响。

输入验证不足是一个普遍的弱点,使攻击者能够通过提供意外的输入来影响合约的执行。 此外,业务逻辑的不当应用可能会在合同中产生意外行为或逻辑差距,从而导致漏洞。 此外,如果处理不当,不安全的外部调用(例如涉及与外部数据源或其他合约的接口的调用)可能会造成漏洞。

重入攻击是一个合约在完成其自身状态更改之前从外部调用另一个合约时发生的弱点。 这允许被调用合约重新进入调用合约,并可能再次执行其某些操作。 这可能会导致意外的行为,并允许攻击者改变合约的状态,从而耗尽资金或产生其他负面影响。

考虑到此类攻击的可能性,开发人员在使用外部合约或数据源时也应谨慎行事,确保正确处理外部调用,以避免意外行为和漏洞。 他们可以通过密切关注智能合约测试等安全程序来帮助保护智能合约免受不断变化的威胁。

二、什么是智能合约中的重入攻击?

在智能合约中,当合约在完成自己的状态更改之前从外部调用另一个合约或函数时,就会发生重入攻击。

这允许被调用合约重新进入调用合约,并可能再次执行其部分操作,这可能会导致不可预见且频繁的恶意行为。 例如,合约 A 调用合约 B 发送资金,然后修改自己的状态。

合约 B 的代码可能包含一个回调函数,允许其重新进入合约 A,并可能在合约 A 完成其状态更改之前重新执行传输函数。 这将使攻击者能够在完成初始交易之前多次从合约中获取资金。

2016 年臭名昭著的以太坊区块链上的去中心化自治组织 (DAO) 黑客攻击是另一个众所周知的例子。 攻击者利用智能合约代码中的重入缺陷,递归地从 DAO 中删除资金,最终导致价值数百万美元的以太坊 (ETH) 被盗。

EiymS447vnByLHL4qydUxD2f2KyelWzur5p7lcp0.jpeg

此外,包括 Uniswap、Lendf.Me、BurgerSwap、SURGEBNB、Cream Finance 和 Siren Protocol 在内的多个去中心化金融 (DeFi) 协议由于可重入漏洞而蒙受了重大财务损失。 这些违规行为造成了 350 万美元至 2500 万美元的损失,凸显了 DeFi 领域可重入漏洞带来的持续威胁。

三、重入攻击如何工作

重入攻击利用智能合约函数的顺序执行和外部调用形成一个循环,攻击者可以在完成之前多次执行特定函数,这可能会导致恶意行为和未经批准的资金提取。

在受害者完成状态修改之前,攻击者的合约有效地“欺骗”受害者的合约回调攻击者的合约。 此操作可能会导致反复提款或其他疏忽行为。

0ak1IuK14XEEWGu1ziVXMteeNxNoDdyzYIKmjkxw.jpeg

上图演示了对智能合约的重入攻击。 攻击者的合约调用受害者的“withdraw()”函数,该函数在更新余额之前发送以太坊。 然后,攻击者的后备函数被触发,再次递归调用withdraw()以从受害者合约中耗尽资金。 这种攻击利用了受害者在发送资金之前未能更新余额的情况。

让我们使用一个简化的示例来分解重入攻击的工作原理:

具有“提现”功能的智能合约

假设有一个允许用户提取资金的数字钱包智能合约。 除了跟踪用户余额之外,该合约还具有提款功能,方便资金提取。 提款功能通常允许用户将他们的代币或以太坊从智能合约提取到他们的个人钱包。

用户交互和功能执行

用户自行请求从钱包中提款。 他们使用提款功能输入所需的提款金额。

提款函数会在调用时验证用户是否有足够的资金进行提款。 如果满足要求,它将所需的资金转移到用户选择的地址。

外部调用

这就是弱点显现出来的地方。 在提款反映在用户的余额中之前,合约会对另一个合约或账户进行外部调用。

递归调用

如果外部合约的代码包含可以再次调用原始合约的函数(例如另一个提款函数),则会创建一个递归循环。 这使得可以在完成之前再次调用withdraw方法。

可重入利用

然后,攻击者使用恶意合约来利用此循环。 攻击者合约在钱包合约调用外部合约期间,在余额更新之前,快速再次调用钱包的提现函数。

回退功能

在某些情况下,智能合约的回退功能(一种独特的功能,当合约收到没有任何数据或以太坊的调用时启动)可能会被攻击者使用。 重入攻击可以通过在资金仍在处理过程中重复调用回退函数来进行。

操纵和反复提款

攻击者的合约可以在同一笔交易中重复使用提款功能,因为钱包合约会延迟更新余额,直到收到外部调用后。 因此,这使得资金更容易在未经授权的情况下被取出,从而使攻击者能够窃取超出其合法权利的资金。 随后,它给钱包合约的用户造成了巨大的经济损失。

四、重入攻击的后果

重入攻击会对智能合约用户产生严重影响,因为它们有可能造成重大财务损失。

重入攻击最直接的后果之一是未经授权提取或操纵易受影响的智能合约中保存的现金。 攻击者利用该漏洞反复从合约中提取资金,耗尽合约余额,并可能给在受影响合约中投资或存储资产的用户造成重大财务损失。

此外,重入攻击可能会削弱用户对智能合约和区块链技术安全性和完整性的信心。 重入漏洞可能会产生灾难性的影响,2016 年以太坊区块链上的 DAO 黑客事件等备受瞩目的事件就证明了这一点,该事件造成了巨大的经济损失并损害了社区的声誉。

除了短期财务后果之外,重入攻击还可能产生长期影响,例如监管和法律关注、投资者信任度下降以及对区块链平台和项目声誉的损害。 容易受到攻击的认知可能会导致用户在与智能合约交互或投资去中心化应用程序(DApp)时保持谨慎,从而阻碍区块链技术的采用和扩展。

五、如何减轻重入攻击

在智能合约创建和审计方面实施最佳实践对于减轻重入威胁是必要的。

这包括使用具有安全记录的知名代码库,这是实现这一目标的一种方法。 这些库经过了广泛的测试和同行评审,这降低了引入漏洞的机会。

开发人员还应该使用“检查-效果-交互”设计等安全检查,通过确保状态修改以原子方式发生,最大限度地减少重入攻击的机会。 如果可用的话,可以使用可重入安全的智能合约开发框架来添加针对此类漏洞的额外防线。

开发人员不太可能手动添加安全保护,因为这些框架通常包含专门设计用于避免重入攻击的内置方法和保护措施。 然而,由于区块链安全仍在发展,开发人员必须继续寻找新的威胁和弱点。

六、重入攻击事件分析

重入攻击是智能合约最常见的攻击之一,这在之前许多攻击事件中都可以看到。

2021年8月17日,BSC上DeFi项目XSURGE遭遇闪电贷攻击。

当地时间8月16日,XSURGE官方在遭攻击前曾发布了关于SurgeBNB漏洞的声明,由于SurgeBNB合约不可更改且已被放弃,因此无法修补该漏洞。XSURGE称没有透露任何关于此漏洞性质的具体细节,但强烈建议用户尽快迁移出SurgereBnb,该漏洞随时可能被攻击者触发。在声明发布后,XSURGE随后便遭遇攻击,攻击者在SurgeBNB中窃取了500万美元。

攻击过程如下:

(1)首先攻击合约通过闪电贷从PancakeSwap中借了10000 BNB

(2)攻击合约使用10000 BNB买入SURGE,将买入的BURGE卖出,调用BurgeToken合约中的sell函数。在BNB转账的时候,攻击合约再次将收到的BNB转账到了BurgeToken合约中,再次触发了购买BURGE的业务。根据sell函数的代码以及BurgeToken合约的receive函数,的确可能在sell过程中发生转账,然后在sell函数尚未修改状态变量之前再次购买BURGE。

(3)在sell函数中重入了purchase函数,在重入的purchase函数中,_totalSupply没有减掉sell函数中卖出的BNB数量,造成可以买入更多的SURGE。

(4)攻击者合约中获取了高达3,896,288,852,239,440,000 BURGE,兑换成BNB有22191 BNB,偿还了闪电贷以及手续费10030 BNB,剩余的12161 BNB为攻击者此次攻击获取的利润,最后将获得的BNB转入到攻击者的账户。

2022 年 3 月 16 日,Gnosis 链上的借贷类协议 Hundred Finance 与 Agave 均遭遇了闪电贷袭击,包括 AAVE 的分支 Agave 和 Compound 的分支 Hundred Finance 。损失超1100万美元。

攻击过程如下:

(1)从SushiSwap上通过闪电兑借出USDC和wXDAI

(2)抵押 1,200,000 个 USDC,并借贷 59,999,789.075 个 hUSDC

(3)继续超额借贷出其他代币,并且重复相同攻击多次

(4)归还闪电贷,完成攻击

可以看出,本次攻击的根本原因是因为合约存在超额借贷漏洞,通过分析具体的合约我们发现合约中存在重入问题,导致攻击者可以完成攻击并进行超额借贷。

2022 年 3 月 27 日,Revest Finance遭到黑客攻击。

黑客利用了 Revest 合约的逻辑漏洞盗取了近 770 万枚 ECO、579 枚 LYXe、近 7.15 亿枚 BLOCKS 以及超 35 万枚 RENA,价值约200万美元。黑客攻击使用从 Tornado Cash 取出的资金发动了攻击,通过SushiSwap以及Uniswap将盗取的Token兑换成了ETH,最后通过Tornado Cash平台将ETH转移到了其他账户。

攻击过程如下:

(1)首先,攻击者通过UniswapV2的闪电兑换功能调用Revest合约中的mintAddressLock函数

(3)在mintAddressLock函数完成前调用_mint函数时,攻击者重入了depositAdditionalToFNFT函数【ERC1155 onERC1155Received 重入】。

(4)由于NFT nextId(即FNFTHandler.fnftsCreated)在mint函数铸造NFT完成并进行更新。因此,在重入调用depositAdditionalToFNFT函数时,NFT Id仍然是1027,nextId任仍然是1028。另外,合约并未验证1028的Token数量是否为0,攻击者再次成功地铸造了1个ID为1028的NFT。

2022年7月10日,去中心化金融协议NFT市场Omni因智能合约漏洞遭到黑客闪电贷攻击,耗尽了1300ETH,约143万美元。

这次攻击交易hash:0x264e16f4862d182a6a0b74977df28a85747b6f237b5e229c9a5bbacdf499ccb4

攻击过程如下:

(1)首先,攻击者通过Balancer借贷平台闪电贷1000 ETH

(2)通过函数flashLoan闪电贷20个DOODLE

(3)通过SushiSwap平台使用WETH兑换了1个DOODLE

(4)赎回20个NFT,tokenId = 2574, 2595, 6851, 8522, 8883, ……

(5)抵押NFT(supplyERC721),tokenId = 5251, 4777, 3693,然后铸造nDOODLE

(6)借贷WETH(borrow),数量为12.15 ETH

(7)提取抵押的3个NFT中的2个,tokenId = 5251, 4777

(8)销毁抵押NFT时铸造的nDOODLE,然后调用safeTransferFrom函数将抵押的NFT转移到攻击合约,攻击者利用onERC721Received函数发起了重入攻击

(9)质押的3个NFT提取了两个,还剩下一个tokenID = 3693的NFT,此时抵押仓位,攻击者在重入攻击中实现了自我清算,清算完成后,将借贷设置为false。

(10)在转移剩下的NFT时再次发生重入,此次重入,攻击者抵押了全部的20个NFT,然后铸造nDOODLE,以此做抵押,借贷了81 WETH。最后,将所有的20个NFT提取出来。

(11)重复以上抵押、铸造、销毁等操作,最终获利148.8 ETH。

在本次事件中,由于safeTransferFrom函数调用onERC721Received函数引起的重入漏洞。攻击者利用该漏洞发起了重入攻击,最终获利。

回顾了这么多的重入攻击事件,可想而知重入漏洞在智能合约中是多么常见。

”2022中国国际金融年度论坛“于2022年9月2日在北京举行,中国人民银行数字货币研究所所长穆长春发表了关于”智能合约与数字人民币“主题演讲。穆长春表示,数字人民币智能合约应用场景比较广泛,可以降低经济活动的履约成本,优化营商环境,推动数字经济深化发展。由于智能合约的可信任、可互通优势,可以更好的支撑数字经济。

一边是推动智能合约与数字人名币的发展,一边是频繁发生的合约安全问题,我们应该采取哪些有效预防措施,避免损失,保障安全?

以上就是币圈188小编给大家分享的是智能合约中的重入攻击的详细解读,希望此篇文章可以帮助大家更好的了解智能合约中的重入攻击。

阅读剩余
THE END