主页 > imtoken钱包app > 「imtoken冷钱包」以假乱真:DODO V2 众筹池遭袭事件分析

「imtoken冷钱包」以假乱真:DODO V2 众筹池遭袭事件分析

传奇私服审核员 imtoken钱包app 2022年01月30日

  区块天眼APP讯 : Step 2

  攻击者根据 Step 1 得到的储量,分别调用两个假币合约的 transferFrom 函数给资金池合约(DLP) 转入略多于该储量的假币 (FDO 和 FUSDT),从而保证能通过flashloan函数的余额检查。

  Step 3

  攻击者接着调用资金池合约(DLP)的 flashloan 函数,借出了略少于资金池储量的真币(wCRES 和 USDT)。

  Step 4

  flashloan 函数在将 wCRES 和 USDT 转入到攻击者预先设置好的合约地址之后,会自动调用攻击者的外部逻辑。而攻击者就是在外部逻辑的实现中调用了 wCRES/USDT 这个池子的初始化函数 init ,将该池子的 token pair 替换为了 FDO/FUSDT。

「imtoken冷钱包」以假乱真:DODO V2 众筹池遭袭事件分析

  Step 5

  如下图,flashloan 函数在执行完外部逻辑之后,会对当前池子的代币(token) 余额进行检查。但需要注意的是,由于池子的 token pair 被替换为了 FDO/FUSDT,所以baseBalance 和 quoteBalance 的所代表的余额也是 FDO 和 FUSDT 的余额。

  同时,由于攻击者在 Step 2 的时候已经往池子中存入了足量的 FDO 和 FUSDT,所以此时baseBalance 和 quoteBalance 的值足够大,绕过了两个if判断,直接进入了最后的同步函数_sync。至此, 攻击者成功通过了 flashloan 的余额检查,实现了以假乱真。

「imtoken冷钱包」以假乱真:DODO V2 众筹池遭袭事件分析

总结及安全建议

  本次攻击之所以发生,最主要的问题出在 DODO V2 众筹池的 init 函数上。查看该函数的调用情况可以发现,正常的逻辑应该是该函数只能在刚建池的时候被调用一次,之后就应该设置访问权限,同时也不能被重复调用。攻击者就是利用了init函数可以被重复调用来重新初始化池子的这一漏洞,结合闪电贷将池子中的真币用假币套取了出来,从而完成了攻击。

  因此,我们给相关项目方的建议有:

  对项目合约的关键功能做好权限审核工作,以免核心函数由于权限要求过低被滥用引发不可预料的后果从而造成损失。

  提高项目代码审计意识,项目上线前需咨询相关的区块链安全公司进行充分的安全审计,最大程度的保证项目安全。

  参考

  慢雾:狸猫换太子 —— DODO 被黑分析

  DODO Pool Incident Postmortem: With a Little Help from Our Friends

  https://medium.com/dodoex/dodo-pool-incident-postmortem-with-a-little-help-from-our-friends-327e66872d42

  Important update regarding recent events on DODO

  https://dodoexhelp.zendesk.com/hc/en-us/articles/900004851126-Important-update-regarding-recent-events-on-DODO

  DODO - REKT

  https://www.rekt.news/au-dodo-rekt/

  附录

  文中涉及的外部地址和合约地址

  攻击者A

  https://etherscan.io/address/0x368a6558255bccac517da5106647d8182c571b23

  抢跑者B

  https://etherscan.io/address/0x3554187576ec863af63eea81d25fbf6d3f3f13fc

  抢跑者C

  https://etherscan.io/address/0x8a14ce0fecbefdcc612f340be3324655718ce1c1

  资金池DLP (WSZO/USDT)

  https://etherscan.io/address/0xfb609b68d694617e0100c7182f21e536760d438d#code

  资金池DLP (ETHA/USDT)

  https://etherscan.io/address/0xfd87ab87f384458a8f6f4b3c3eb222a223869f73#code

  资金池DLP (wCRES/USDT)

  https://etherscan.io/address/0x051ebd717311350f1684f89335bed4abd083a2b6#code

  资金池DLP (DODO/USDT)

  https://etherscan.io/address/0x509ef8c68e7d246aab686b6d9929998282a941fb#code

  文中涉及的交易

  第一次攻击

  A 的攻击交易 (fail)

  https://etherscan.io/tx/0x4bc4ace313f2f5a411a5a560255ba0bba4f4913edb55ed882feaee84a3b1292e

  B 对 A 的 抢跑交易

  https://etherscan.io/tx/0xff9b3b2cb09d149762fcffc56ef71362bec1ef6a7d68727155c2d68f395ac1e8

  第二次攻击

  A 的攻击交易 (fail)

  https://etherscan.io/tx/0x0430d5a2dcfb0f9530fe1699e0e86a9526825da5e2072a15c4be734710f56cdb

  B 对 A 的 抢跑交易

  https://etherscan.io/tx/0x0b062361e16a2ea0942cc1b4462b6584208c8c864609ff73aaa640aaa2d92428

  第三次攻击

  A 的攻击交易

  https://etherscan.io/tx/0x395675b56370a9f5fe8b32badfa80043f5291443bd6c8273900476880fb5221e

  C的抢跑交易 (抢跑了A对代币USDT的转移)

  https://etherscan.io/tx/0x75d4765dd704d82f0bf539da88aff2568da38697f153b14d285abc8749da683f

  A 被 C 抢跑的代币 (USDT) 转移交易

  https://etherscan.io/tx/0x14084fba94df75cf8ebfbb62188aa06a29ec0e38181f73eab7b79eba750e4840

  C的抢跑交易 (抢跑了A对代币wCRES的转移)

  https://etherscan.io/tx/0xa8d030494607e16b06dd0c7e97da2b78ebc5a072a8176b19ca57f17044c1a211)

  A 被 C 抢跑的代币 (wCRES) 转移交易

  https://etherscan.io/tx/0x021a2bd6ea7b502290be4c67be33be33c5b5582676d1c00ab59f1ed53a1b576b

  第四次攻击

  A 的攻击交易

  https://etherscan.io/tx/0xc79dbe0aa48e0ba9f72bd74240cf50b653196ff00979bf367f11f8fa3d9b45ec

  第五次攻击

  A 的攻击交易

  https://etherscan.io/tx/0xe59fdc5b83deaf29f9f45fd53f6aa54f893fe8504f070bce9995eb535bed4996

标签: 遭袭   事件   分析   DODO   众筹池   以假乱真