攻击相关事件2024年5月22日,Burner项目遭到闪电贷攻击,此次攻击中攻击者结合了闪电贷与抢跑攻击操纵,利用闪电贷借出的大量资金在去中心化交易池中进行交易,从而提高一种代币的价格,属于基于询价机制的闪电贷攻击。攻击者:0xe6DCF87256866e293B825708bF1F5DF8f0
2024年5月22日,Burner项目遭到闪电贷攻击,此次攻击中攻击者结合了闪电贷与抢跑攻击操纵,利用闪电贷借出的大量资金在去中心化交易池中进行交易,从而提高一种代币的价格,属于基于询价机制的闪电贷攻击。 攻击者:0xe6DCF87256866e293B825708bF1F5DF8f07519B3 攻击合约:0x1BCC8378943aAeE2d99A4e73ddf6C01F62825844 被攻击项目:0x4d4d05e1205e3A412ae1469C99e0d954113aa76F Attachhash:0x3bba4fb6de00dd38df3ad68e51c19fe575a95a296e0632028f101c5199b6f714 获利:1.7ETH(约$6400) 下图展示了闪电贷攻击的具体交易细节:
该项目是一个类似于加密货币交易所的平台,它提供了与UniswapV2这样的去中心化交易所进行代币交易的功能。在这个平台上,用户可以执行交易操作,直接影响到交易所中特定流动性池(如weth_pnt pair)中两种代币的余额。这种设计允许用户在平台上进行代币的买卖,同时也为攻击者提供了可利用的漏洞。攻击者通过精心设计的交易策略,利用这些业务逻辑中的缺陷,对该项目发起攻击,目的是为了在代币交易中实现非法套利。下图展示了该项目中被攻击者利用的核心函数,这个函数是攻击发生的关键点,揭示了攻击者如何通过操纵交易逻辑来实现其套利目的。 在该项目中,流动性池的pair,即两种代币的组合,是交易的核心组成部分,它们共同维护着交易对的流动性和价格平衡。下图展示了该项目中被攻击者利用的核心函数,这个函数是攻击发生的关键环节,它揭示了攻击者如何通过操纵pair中的代币余额来实现其套利目的。
在攻击者的Burner_exp.sol攻击脚本中,ContractTest智能合约演示了一个基于闪电贷的套利攻击策略。合约在 setUp() 函数中设置测试环境,模拟了主网的区块链状态,并将70 ETH分配给合约地址以进行攻击。在 testExploit() 函数中,合约首先模拟了从交易所借入70 ETH的闪电贷操作,并将这些ETH转换为WETH代币。接着,合约授权 Uniswap路由器对WETH和PNT代币进行操作,利用Uniswap将持有的WETH代币转换为PNT代币。随后,合约调用Burner合约的 convertAndBurn() 函数,通过传递三个代币地址(0x0、WBTC 和 USDT)来操控市场上的代币价格,达到提高WETH相对于PNT的市场价格的目的。市场操控完成后,合约再次使用Uniswap将手中的PNT代币兑换为WETH代币,并最终将70 ETH还给闪电贷方以模拟偿还闪电贷的操作。攻击结束后,合约记录并输出了攻击者获得的WETH利润,展示了通过这一系列操作实现套利的结果。合约通过模拟闪电贷借入70 ETH,转换为WETH,随后使用Uniswap将WETH兑换为PNT代币,接着利用Burner合约的 convertAndBurn() 函数操控市场价格,最后将PNT代币兑换回WETH,并偿还闪电贷,最终展示了攻击者从中获得的利润。
首先,我们分析了造成此次攻击事件的攻击的资金具体流向,如下图所示。
其次,我们来具体分析整个攻击事件的调用过程,深入理解攻击的内核原因,如下图所示。
Step1.攻击者通过闪电贷从交易所中借来大量资金,总共70ETH。
Step2.攻击者在收到交易所的swap回调之后,在回调中进行接下来的操作,包括如下:
Step3.攻击者授权交易所能够动用自己的ETH资产,并将自己闪电贷来的ETH全部置换为PNT。
Step4.攻击者利用置换来的PNT在被攻击项目中进行操作,由于被攻击项目使用的是以交易所为中介的模式,所以在Burner项目中的操作会直接影响到交易所中的代币数量,因此攻击者便进行一些交易(这些交易并不关键)。
Step5.上述操作使得交易所中的pnt代币较少,weth代币增之后,意味着weth相对于pnt的价格更低了,此时,攻击者在使用自己闪电贷贷来的pnt全部置换为weth,此时换取的weth便达到了71.7weth,攻击者净获利1.7weth。
根据上述的步骤,我们画出整个攻击步骤的时序图如下所示。
Step1.Foundry环境准备:
Step2.代码复现:
我们在本地复现了攻击案例的整个流程,在攻击过程中我们模拟攻击者原地址为整个交易的发起者,这样可以使得攻击合约中某些条件检测得以通过,我们编写了自己的攻击合约来复现整个交易流程:
如下图所示配置我们的实验环境,我们在 ContractTest 合约中定义了与不同智能合约和代币的接口,用于执行一系列的攻击操作。首先,IBurner burner 变量实例化了 Burner 合约,允许调用其 convertAndBurn() 函数来执行代币的转换和销毁,从而操控市场上的代币价格。接着,定义了 IERC20 usdt、IERC20 wbtc 和 IERC20 pnt 分别对应USDT、WBTC和PNT代币的合约接口,这些代币在攻击过程中用于资金转移和市场操作。同时,IWETH weth 变量实例化了WETH代币的合约,支持WETH的存款和取款操作。最后,IUniswapV2Router router 实例化了Uniswap V2 路由器合约的接口,用于执行不同代币之间的兑换操作。通过这些接口,合约能够进行闪电贷、代币交换、市场操控等操作,从而完成攻击策略中的套利目标。
在 testExploit 函数的这一部分,首先使用 console.log 打印了合约当前WETH代币余额,以便在攻击前观察状态。随后,我们使用合约模拟了一个闪电贷操作,向合约地址转账了70 ETH。这笔资金被存入WETH合约中,转换为等值的70 WETH代币,为接下来的攻击步骤准备了必要的资金。通过这种方式,我们就可以模拟攻击者获取用于攻击过程的资金,这些资金随后会用于在Uniswap上进行代币交易操作。
我们将上述函数作为整个攻击交易的入口, 首先进行闪电贷,贷出70ETH并将这些ETH放入pair中用来置换pnt代币——我们模仿攻击者首先将70 ETH转换成WETH,然后授权Uniswap路由器能够使用合约中的WETH代币,并授权合约中的PNT代币。接下来,攻击者设置一个从WETH到PNT的交易路径,并调用swapExactTokensForTokensSupportingFeeOnTransferTokens函数,将合约中所有的WETH代币交换成PNT代币。这一步骤的目的是通过大量购买PNT来推高PNT的价格,为后续利用价格变化进行套利攻击做好准备,攻击者可以在价格被推高后,以更高的价格卖出PNT代币,实现利润的套取。整个攻击过程的详细步骤和逻辑在下图中得到了清晰的展示。
接着,在被攻击者项目中进行代币置换操作,目的是为了减少交易池pnt,增加交易池weth,使得pnt价格上涨。我们调用了一些日志函数来标记攻击的开始和结束,并准备了一个包含三个代币地址(其中两个为WBTC和USDT)的数组。随后,调用了Burner合约的convertAndBurn函数来处理这些代币,紧接着,攻击者重新设置交易路径,将PNT转换回WETH,为最终套利交易做好准备,如下图所示。
最后将闪电贷来的pnt全部置换为weth。我们通过Uniswap V2路由器将所有的PNT换回WETH,从而实现获利;在完成套利交易后,攻击者将70 ETH还给了模拟的闪电贷提供者,并记录了最终利润,最终获利1.7weth,如下图所示。
通过下图可以看到进行闪电贷攻击的具体效果。
此外,我们打印了更加详细的攻击信息作为参考,如下图所示。首先,我们打印了攻击前合约中的WETH余额,然后我们使用闪电贷进行借贷。这个时候我们可以看到,用WETH交换PNT之前和之后的余额情况。接着,我们调用合约中的函数进行攻击,可以看到在攻击结束后,我们又重新将PNT转换为WETH,最后,我们归还刚才借出的闪电贷,发现我们获取了1.7ETH的利润。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!