根据Numen链上监测显示2022-11-10 19:21:59 (UTC) ,DFX Finance遭到攻击,损失近400万美元。具体交易tx如下:
https://etherscan.io/tx/0x390def749b71f516d8bf4329a4cb07bb3568a3627c25e607556621182a17f1f9
攻击合约地址: 0x6cfa86a352339e766ff1ca119c8c40824f41f22d
1. 攻击者首先调用usdc-xidr交易对合约的viewDeposit函数,这个函数接收一个参数表示lptoken数量,然后返回一个数组,长度为2,分别表示需要多少的usdc和xidr。攻击者获得这些信息之后开始调用交易对合约的flash函数。
0xf1f3a66a000000000000000000000000000000000000000000002a5a058fc295ed0000000000000000000000000000000000000000000000000000000000000000000005
其中, 0x2a5a058fc295ed000000转成10进制是200000000000000000000000,5为对应交易对合约闪电贷的手续费。
2.由于项目方提供了flashloan功能,攻击者通过调用DFX的flash函数借到足够数量的usdc和xidr(具体数量通过上述viewDeposit获得),然后攻击者flashloan回调中调用deposit函数把借到的usdc和xidr重新存入交易对合约,deposit函数中会调用ProportionalLiquidity.proportionalDeposit这个函数,这个函数把攻击者借到钱存入交易对合约,并给攻击者铸造lptoken。因为闪电贷借到的钱又重新进入了交易对合约(在闪电贷回调用中以deposit的形式),所以通过了flashloan函数中校验交易对合约余额的判断。下图为flashloan的余额校验。
3. 最后攻击者调用withdraw函数,销毁lptoken,取走usdc和xidr完成攻击。经本地模拟测试,确实如此。从下图可以看出调用前后lptoken的余额。
此次攻击攻击者一共获利大约400万美元,本质原因是DFX的deposit函数没有重入保护。Numen 实验室建议项目方关注典型漏洞类型, 做好安全审计工作,从而减少遭受攻击风险。
https://github.com/NumenCyber
https://twitter.com/@numencyber
https://medium.com/@numencyberlabs
https://www.linkedin.com/company/numencyber/
原文始发于微信公众号(Numen Cyber Labs):DFX Finance遭重入攻击, 损失近400万美元