Discover闪电贷攻击案例分析

  • KEN
  • 发布于 2天前
  • 阅读 88

案例介绍:2022年6月6日,Discover项目遭到闪电贷攻击,此次攻击中攻击者结合了闪电贷与预言机价格操纵,利用闪电贷借出的大量资金在去中心化交易池中进行交易,从而提高一种代币的价格,向属于基于询价机制的闪电贷攻击。可以理解为:2022年6月6日,Discover项目遭到一次快速借贷(闪电

案例介绍:

2022年6月6日,Discover项目遭到闪电贷攻击,此次攻击中攻击者结合了闪电贷与预言机价格操纵,利用闪电贷借出的大量资金在去中心化交易池中进行交易,从而提高一种代币的价格,向属于基于询价机制的闪电贷攻击。可以理解为: 2022年6月6日, Discover项目遭到一次快速借贷(闪电贷)攻击。在此次攻击中,攻击者利用了快速借贷和预言机价格操纵的策略,借出了大量的资金用于市场(去中心化交易池pancakeSwap)中购买大批萝卜,从而推高萝卜的价格,这是一种基于询价机制的快速借贷攻击手法。 整体攻击逻辑为:

image.png

PancakeSwap交易所:

交易池(如萝卜和白菜的交易池)通常是指自动化做市商(AMM)模型中的一个组成部分。这种模型常见于去中心化交易所(DEX),比如 Uniswap、PancakeSwap 等。以下是这种交易池如何维持萝卜和白菜之间价格平衡的基本原理: 交易池的基础:

image.png 交易池本质上是一个包含两种代币(假设2个代币是萝卜和白菜)的智能合约。交易者可以与这个池子进行交互,执行买卖操作。交易池通过算法自动维持两种代币之间的价格平衡。

常用的AMM模型 — 常数乘积公式:

image.png 一个常见的自动化做市商模型是使用常数乘积公式 𝑥 × 𝑦 = 𝑘,其中 𝑥 和 𝑦 分别是交易池中两种代币的数量,而 𝑘 是一个常数。这个公式确保了池子的总价值在交易前后保持不变。

价格维持机制: 1)初始设定:假设一个交易池开始时含有相等价值的萝卜和白菜。比如,1000单位的萝卜和200单位的白菜,假设初始交换比率是 5 萝卜兑换 1 白菜。 2)交易影响:当用户想用萝卜换取白菜时,他们将萝卜添加到池中,并从池中取出相应数量的白菜。这会导致萝卜的数量增加,白菜的数量减少,从而根据公式 𝑥×𝑦=𝑘调整两者的价格。 3)因为萝卜的供应增加,相对价值下降;同时,白菜变得更稀缺,其价值上升。 4)价格自动调整:交易后,新的交换率会自动调整。比如,如果现在池中有1100单位的萝卜和180单位的白菜,新的交换率可能会变为 6.11 萝卜兑换 1 白菜,反映了萝卜相对白菜价值的下降。交换代币函数整体执行逻辑为:

image.png

攻击者相关信息: 攻击者钱包地址:0x446247bb10B77D1BCa4D4A396E014526D1ABA277 攻击者合约:0x06B912354B167848a4A608a56BC26C680DAD3D79 攻击交易: 0x8a33a1f8c7af372a9c81ede9e442114f0aabb537e5c3a22c0fd7231c4820f1e9 被攻击项目-ETHpledge合约:0x5908E4650bA07a9cf9ef9FD55854D4e1b700A267 攻击者获利:49BNB($27600) 攻击流程: 1)攻击第一阶段:攻击者从市场(pancakeSwap交易所)中借来一大笔资金。 Step1: 第一笔借款是在西红柿兑白菜的交换池(BUSD代币-USDT代币的交换池)中借出2100个白菜(USDT代币,也就是BSC-USD,和美元一比一锚定,名字不同是因为设计原因),通过市场的交换功能(Pancake LP的swap函数)完成; Step2: 第二笔借款是在萝卜兑白菜交换池(Discover代币-USDT代币的交换池)中借出19000个白菜 (USDT代币),通过在具有回调函数的合约中再次调用交换功能进行嵌套调用完成。具体借款流程如下所示:

image.pnghttps://app.blocksec.com/explorer/tx/bsc/0x8a33a1f8c7af372a9c81ede9e442114f0aabb537e5c3a22c0fd7231c4820f1e9) 2)攻击第二阶段: 攻击者通过制造价格差异来获得利润。关键在于攻击者在从ETHpledge项目中用白菜抵押得到萝卜(使用USDT代币购买Discover代币)时,ETHpledge项目中白菜价格依赖市场中的白菜价格(USDT代币)。由于攻击者通过前两次的快速借贷,借出了市场中大量的白菜(USDT代币),此时白菜(USDT代币)的价格会迅速升高,因此ETHpledge项目得到的白菜(USDT代币)价格偏高,其能换到的萝卜数量(Discover代币)也就偏多。攻击者用第一次借来的白菜(USDT代币)全部换成萝卜(Discover代币)。具体攻击流程如下图所示:

image.png Step3. 这个阶段,攻击者迅速归还数量较多的一笔白菜(USDT代币)快速借款(率先归还欠款较大的金额是因为为了抹平市场中USDT的上涨价格),使得市场中的白菜(USDT)价格恢复正常水平。至此,攻击者手握通过价格差价获得的大量萝卜(Discover代币)以及欠款一小部分白菜(USDT代币)。

image.png Step4. 攻击者通过市场(pancakeswap)的交换函数将自己得到的萝卜(discover代币)全部换成白菜(USDT代币),再向交易池归还快速白菜借贷(USDT代币),而余下的白菜(USDT代币)全归攻击者所有。

image.png Step5. 攻击者将套利获得的白菜换成BNB,然后转入混币项目,完成攻击。

闪电贷攻击复现

Foundry靶场复现流程: Step1.foundry环境准备: Step2.代码复现:

image.png 我们在本地复现了Discover攻击的整个流程,在攻击过程中我们模拟攻击者原地址为整个交易的发起者,这样可以使得攻击合约中某些条件检测得以通过, 我们编写了自己的攻击合约来复现整个交易流程: 我们将上述函数作为整个攻击交易的入口, 通过vm.startBroadcast()方法来将整个交易的发起者置为攻击者。接着我们调用PancakePairI中的swap函数闪电贷来第一笔资金2100USD,接着PancakePair中的swap回调pancakeCall函数:

image.png 我们在pancakeCall函数中调用PancakePairII的swap函数,再次通过闪电贷借来一笔资金19000USD,由于进行了swap函数调用,PancakePairII会再次回调pancakeCall函数:

image.png

image.png

在此处代码中,模仿攻击者调用受害项目ethpledge中的pledgein函数,由于ethpledge是根据pancakePair中的USD数量来指定当前Discover代币的价格,由于,PancakePair中的USD进过两次闪电贷后,数量减少,所以Discover的价格降低,攻击者可以使用自己贷款出来的USD换取更多的Discover代币。 所以攻击者将其转移到0xab21300fa507ab30d50c3a5d1cad617c19e83930,之后再将62000Discover从0xab21300fa507ab30d50c3a5d1cad617c19e83930转移到合约0x06B912354B167848a4A608a56BC26C680DAD3D79。

点赞 7
收藏 3
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
KEN
KEN
0x4e16...2573
江湖只有他的大名,没有他的介绍。