事件背景
DODO是基于主动做市商算法的下一代链上流动性基础设施。DODO作为一个去中心化交易平台,采用资金池模式,纯链上交易。支持新资产的无成本发行。
零时科技区块链安全情报平台监控到消息,北京时间2021年3月9日,DODO官方发推称DODO V2资金池wCRES/USDT遭到黑客攻击,已暂时禁用DODO上的资金池创建,并表示其他资金池都是安全的。
- 零时科技安全团队对该安全事件进行复盘分析。
事件分析
通过初步分析,DODO V2资金池遭攻击事件中涉及的地址如下:
初步了解后,继续通过bloxy.info分析交易详情,如下图:
详细步骤如下:
一 . 攻击者首先通过getVaultReserve()函数获取了目前合约中的两个token地址。
二 .通过transferfrom()函数给DLP合约分别转入13万FDO和115万FUSDT(攻击者地址之前的几笔交易已对资金进行approve授权)。
三 . 接下来进行闪电贷,攻击者通过flashLoan()函数进行闪电贷,得到13万枚wCRES和113万枚USDT。
以上操作均没有问题,攻击者对传入的币种进行闪电贷,获取贷款的资产。
那么问题出在哪?继续来看攻击者进行闪电贷的后续操作:
四 .攻击者调用init()函数将自己的空气币FDO和FUSDT地址作为baseTokenAddress和quoteTokenAddress参数传入,也就是之前贷款的两个token地址wCRES和USDT。
问题就出在这里,正常情况下init()函数是在合约部署初始化时调用,那么这里为什么攻击者能够成功调用,接下来分析init()函数的合约代码怎么写的:
上图中可以看到DVM合约中,存在init()函数对池子进行初始化设置操作,但该函数并不是只调用一次,也不是只有内部调用的internal属性,而是external属性,就是说可以进行外部调用。那么攻击者可以调用该函数就不奇怪了。
我们继续分析,攻击者将init()的token地址重新传入自己的空气币FDO和FUSDT地址有什么好处。
由于在之前的操作中,攻击者将这两种空气币(13万FDO和115万FUSDT)转入被攻击合约,之后进行闪电贷获取了贷款(13万枚wCRES和113万枚USDT),在闪电贷的操作中又重新调用被攻击合约的init()函数,并在之前合约token地址(wCRES和USDT )处,传入两种空气币(FDO和FUSDT)的token地址,这里就是问题所在。
由于攻击者进行闪电贷时传入了空气币FDO和FUSDT,借走CRES和USDT,当原始的CRES和USDT地址修改成空气币FDO和FUSDT地址,攻击者还款时就还的是空气币FDO和FUSDT,也就达成了攻击者使用空气币借款并还款的目的。最终盗走13万枚wCRES和113万枚USDT,资金流转交易如下图:
总结
该攻击事件中,主要利用DODO合约中可重新初始化漏洞,盗取了13万枚wCRES和113万枚USDT的巨额资产。这类问题主要是智能合约开发人员对函数调用没有进行严格校验,导致init()函数可重新调用。在零时科技安全团队审计过程中也曾出现过此类重复调用问题,并及时和项目方人员对接,规避了此类问题的发生。
安全建议
DeFi今年确实备受关注,黑客攻击也不断发生,包括Harvest Finance,Value DeFi,Akropolis,Cheese Bank和Origin Dollar等均受到不同程度的黑客攻击。针对频频发生的黑客攻击事件,我们给出以下的安全建议:
- 在项目上线之前,找专业的第三方安全企业进行全面的安全审计,而且可以找多家进行交叉审计;
- 可以发布漏洞赏金计划,发送社区白帽子帮助找问题,先于黑客找到漏洞;
- 加强对项目的安全监测和预警,尽量做到在黑客发动攻击之前发布预警从而保护项目安全。
零时科技
专注为客户提供全方位区块链安全解决方案及审计服务 深圳零时科技有限公司是一家专业的区块链安全漏洞风险检测与安全防御、企业级区块链应用创新解决方案提供商。 公司团队深耕网络安全攻防十余年,并深入研究区块链安全实战经验丰富,旨在为客户提供全方位的安全审计服务及安全解决方案。
来源:freebuf.com 2021-03-15 15:28:59 by: noneage
请登录后发表评论
注册