事件背景
零时科技区块链安全情报平台监控到消息,北京时间2022年11月11日,ETH链上DFX Finance受到黑客攻击,攻击者获利约3000ETH,耗尽了流动资金池,攻击者地址为:
0x14c19962e4a899f29b3dd9ff52ebfb5e4cb9a067,目前已将资金转入TornadoCash。零时科技安全团队及时对此安全事件进行分析。
漏洞核心
在DFX Finance中闪电贷归还逻辑为归还用户闪电贷之前与闪电贷之后池子中金额的差值。
由于Flash方法存在用户可控的可操作其他方法参数,但Flash方法调用并未做同合约同方法和同合约不同方法的重入限制。攻击者通过闪电贷中的回调函数向池子中添加流动性,使得执行闪电贷前后池子中差额比应归还的要少,归还闪电贷后取出添加的流动性资金。
以一笔攻击为例,攻击交易为
0x390def749b71f516d8bf4329a4cb07bb3568a3627c25e607556621182a17f1f9
此时池子中XIDR和 USDC两种代币余额为
攻击者调用flash方法借出 XIDR 和 USDC 两种代币
之后通过闪电贷回调函数攻击者向池子中添加流动性获得流动性代币
此时池子中两种代币余额为
此时闪电贷前后的资金差值远远小于攻击者借出的资金值,因此攻击者只需要归还很少的资金即可
随后攻击者将添加的流动性取出,为攻击者一笔交易中的获利(获利资金是将闪电贷资金和移除流动性资金相加,最后减去闪电贷资金及手续费,为获利资金,实际获利22.71亿枚XIDR和9.95万USDC)
攻击者随后进行多笔攻击,直到耗尽DFX交易池中代币,随后将获得的代币兑换为ETH转移至TornadoCash中,共获利约3000ETH
总结及建议
此次攻击是由于DFX中闪电贷合约对于归还闪电贷的计算方式只与池子中的资金余额有关,Flash方法调用未做同合约同方法和同合约不同方法的重入限制,攻击者通过将资金借出之后通过添加流动性又将资金转入了池子中,因此计算的需要归还的闪电贷资金减少,攻击者之后可以通过归还流动性代币将资金取出。
“
安全建议
-
建议将闪电贷归还资金计算设置为用户借出的资金加利息,避免归还资金收到池子资金余额影响;
-
建议对用户调用方法存在可控参数时,对该方法进行防止重入的机制保护;
-
建议项目方上线前进行多次审计,避免出现审计步骤缺失。
往期内容回顾
零时科技 | Audius金库1850万枚AUDIO被盗事件分析
零时科技联合创始人黄鱼先生受邀对话《Web3应用创新与生态安全》
原文始发于微信公众号(零时科技):零时科技 || DFX Finance攻击事件分析