攻击相关事件整数溢出攻击案例介绍:2024年2月8日,Ethereum主网上的ERC404项目Pandora遭到攻击,项目被攻击的原因是项目设计中存在漏洞,导致被攻击者利用从而发生了整数溢出漏洞,导致丢失约7.5ETH,其价值约为350000$。Totallost:7.5ETH攻击者
整数溢出攻击案例介绍: 2024年2月8日,Ethereum主网上的ERC404项目Pandora遭到攻击,项目被攻击的原因是项目设计中存在漏洞,导致被攻击者利用从而发生了整数溢出漏洞,导致丢失约7.5 ETH,其价值约为350000$。 Total lost: 7.5 ETH 攻击者: 0x096f0f03E4BE68D7E6dD39B22a3846B8Ce9849a3 攻击合约: 0xCC5159B5538268f45AfdA7b5756FA8769CE3e21f 被攻击合约: 0xddaDF1bf44363D07E750C20219C2347Ed7D826b9 Attackhash:0x7c5a909b45014e35ddb89697f6be38d08eff30e7c3d3d553033a6efc3b444fdd 下图展示了该攻击的具体交易细节:
该项目是一个ERC404项目,在该项目中,同时存在类似与ERC20的代币token以及与ERC721类似的NFT,且在该项目中一个完整的token(1e18)对应一个完整的NFT。所以在这个项目中同时存在转移ERC20代币与ERC721,也就是NTF的逻辑,但是项目本身在设计时,出现了整数溢出漏洞,导致攻击者可以利用该漏洞跳过转账中的身份检查以及逻辑验证等条件限制,不需要任何代价便可以操纵项目中的资金流动。分析得到的整个ERC404.sol的逻辑如下图所示。
图4-2 ERC404合约逻辑图
我们可以从下图中展示的合约部分截图的逻辑中看出,在该部分产生了整数下溢漏洞,从而导致攻击者可以借助这个漏洞,实现整数溢出攻击。
通过对攻击交易的详尽分析,我们可以揭示出资金流向的具体情况,这通常通过可视化的方式在图表中展示,以便我们能够直观地看到资金是如何在攻击过程中从一个账户转移到另一个账户的。通过这种方式,我们可以追踪到攻击者的资金来源,识别出受影响的账户,以及资金最终的去向。这种详细的资金流向分析对于理解攻击的全貌、评估攻击的影响以及制定相应的防御措施至关重要。
此外,如下图所示,我们可以根据得到攻击交易具体的调用情况,用分析攻击具体的相关步骤。
我们分析的流程如下:
Step1.攻击者利用攻击合约调用被攻击合约中的tranferFrom()函数,将pandora_eth pair中的pandora代币几乎全都转移到pandora合约中。
Step2.攻击者调用pandora_eth pair中的Sync()函数,强行是的pair中的balance和reserve一致,为接下来的攻击做准备。
Step3.在攻击者再次调用tranferFrom()函数,再次利用溢出将pandora合约中的pandora全部转移到pair上,这时,pair中的pandora_balance会大于pandora_reverse,而这个差值会全部算到攻击者头上,攻击者得以获利。
Step4.攻击者调用swap函数,将pandora迅速转移成ETH,攻击完成。
这里需要解释一下为什么会发生两次transferFrom的原因:
首先,在第一次调用transferFrom之前,在pair中pandora_balance和pandora_reserve的数量是一致的;
其次,在第一次发生transferFrom之后,pair中pandora_balance减少,但是pandora_reserve不变,所以调用了sync函数使得二者强行进行匹配;
最后,在第二次transferFrom发生之后,pair中pandora_balance增加,pandora_reserve不变,所以增加的这部分(pandora_balance - pandora_reserve)就算在了攻击者头上,从而使得攻击者可以获利,也反应出了攻击者可以利用整数溢出攻击的方式,达到攻击意图,实现攻击目的。
Step1.攻击复现的foundry环境准备:
Step2.代码复现: 我们在本地复现了攻击案例的整个流程,在攻击过程中我们模拟攻击者原地址为整个交易的发起者,这样可以使得攻击合约中某些条件检测得以通过,我们编写了自己的攻击合约来复现整个交易流程: 首先,我们定义了一个ContractTest合约,继承自Test,并在其中引用了几个外部合约和库,包括WETH(一个IERC20接口实例),PANDORA(一个 PandorasNodes404合约实例),V2_PAIR(一个Uniswap V2流动性池合约实例),和cheats(一个CheatCodes实例,用于测试),定义后用于与这些外部合约进行交互,如下图所示。
其次,我们定义了testExploit函数,这个函数的主要目的是在进行攻击测试之前记录当前合约的状态。首先,它会打印当前合约的地址以供调试使用。然后,通过事件记录攻击者合约在攻击前的WETH和PANDORA代币余额,利用这些信息来监控攻击前的状态变化。接着,函数获取并存储了V2_PAIR合约中 PANDORA代币的余额,为后续的攻击操作和结果分析做准备,如下图所示,显示了具体的实验环境配置。
我们将上述函数作为整个攻击交易的入口,首先获取整数溢出的值。然后调用transferFrom()函数在testExploit函数中,代码首先通过PANDORA.transferFrom 函数从V2_PAIR合约转移一部分PANDORA代币到攻击者合约中,利用整数溢出的技巧绕过授权检查。接着,V2_PAIR.sync()用于同步余额的数据,获取了 V2_PAIR合约中的ETH余额和PANDORA代币的余额。随后,再次通过 PANDORA.transferFrom将一部分PANDORA代币从攻击者合约转移回V2_PAIR 合约中,利用相同的技巧绕过授权检查。接着,计算V2_PAIR合约中新的 PANDORA代币与旧代币之间的差额,并计算进行兑换所需的swapAmount。最后,通过调用V2_PAIR.swap函数将计算出的PANDORA代币数量兑换成WBNB代币。函数结束时,记录了攻击者合约中WETH和PANDORA代币的最终余额,以便分析攻击后的效果,如下图所示。
我们可以从下图看出,攻击后WETH和pandora的变化情况。
此外,我们进一步提供了详尽的打印输出,这些信息不仅包括了基本的交易数据,还涵盖了交易的深度分析,如交易的执行路径、智能合约的交互细节、调用的函数及其参数、以及交易过程中可能发生的任何异常或错误。这种深入的信息展示,使得用户能够对交易的每一个环节都有一个清晰的认识,从而在进行安全审计或开发调试时,能够更加精确地定位问题所在,提高问题解决的效率。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!