安全实验室第一时间对本次事件深入跟踪并进行分析。0x02:事件详情
交易细节如下图所示:
浏览上图的交易过程可知,攻击合约利用闪电贷借取代币WFTM和BTC,将借取的代币与自己铸造的代币质押到SpiritSwap里增加流动性获取lp代币,而问题就出现在攻击者通过depositFor()实现质押的过程中。
通过Tenderly(https://http://dashboard.tenderly.co/tx/fantom/0x19315e5b150d0a83e797203bb9c957ec1fa8a6f404f4f761d970cb29a74a5dd6/debugger调试该笔交易,攻击者多次递归调用depositFor函数,利用该函数获取大量代币:
DBS Digital Exchange CEO:中心化交易所将继续存在,但需要通过隔离资产重建信任:金色财经报道,DBS Digital Exchange CEO Lionel Lim表示,虽然FTX的崩溃动摇了人们对中心化交易所的信心,但这不是区块链技术的失败,而是风险管理和公司治理不善的结果;随着CEXs的成熟度和机构采用率的提高,CEXs将作为进入资产类别的关键切入点发挥巨大的影响力,根据Defi Llama的数据,截至2023年5月中旬,CEX的总交易量几乎占中心化和去中心化交易所所有交易的90%。尽管去年投资者信心受挫,但CEX的前景依然明朗;CEX将托管、交易、投资产品、咨询和高效的法币进出坡道等管理数字资产组合的解决方案集成到一个平台中,大大降低了拥有和管理不同区块链原生代币的技术复杂性;安全保障也是其优势,根据Chainalysis的数据,2022年黑客窃取的所有加密货币中有18%来自CEX,其余82%是来自去中心化Dapp。同时,LionelLim指出,CEX需要通过隔离资产重建信任,因为客户和公司资产的分离是未来监管框架中需要解决的关键。[2023/6/7 21:20:34]
0x03:漏洞分析
数据:Uniswap上ARB单币流动池TVL已超1600万美元:3月23日消息,据相关页面信息,Uniswap 上 ARB 单币流动池 TVL 已超 1600 万美元。其中 ETH/ARB 和 ARB/USDC 交易对流动性最为充裕,分别为 806 万美元和 785 万美元。
值得注意的是,由于 ARB Token 将于区块高度 16890400 开放申领,目前 ARB 交易对流动性全部由单币(ETH、USDC 等)提供。[2023/3/23 13:21:32]
depositFor()函数位于https://http://ftmscan.com/address/0x660184ce8af80e0b1e5a1172a16168b15f4136bf#code的第1115行:
Gate.io将进行第四期投票上币?参与币种为LBank和BitMax:据官方公告,Gate.io第四期上币时间为3月9日12:00-3月10日12:00,参与币种为LBank与BitMax。获胜项目将在Gate.io上线交易,所有参与投票的用户(无论支持任何一方)均可按照投票数占活动总票数比例分享活动代币空投奖励。详情可查看原文链接。[2020/3/5]
该函数的safeTransferFrom()方法从IERC20(token)调用,调用完该方法后,余额balance也会随之变动,最后通过_mint()方法向用户添加质押凭证代币。其中调用的变量token可控,导致攻击者可以自己实现safeTransferFrom()方法,将该方法重入到depositFor()发起攻击。
以实施了5次重入攻击为例,开始_pool的值为0,在重入depositFor方法的前四次里,攻击者一直传入自己铸造的代币,_pool的值会一直保持为0,但在第五次,也就是最后一次传入100个受认可的代币时,_after的值会变成100,而_afer-_pool的差值_amount也就是100,最后由于重入了5次,导致合约会向攻击者铸造100*5的质押凭证代币。
其后果就是攻击者向该合约质押自己铸造不受认可的代币,同样会增加质押总量,最后利用多出来的质押凭证实现套利。
0x04:修复方案
1.由于depositFor()方法里的token可控才是导致这次攻击事件的原因,因此只需要在传递参数的时候让token不可控就行:
2.由于套利的原因是depositFor()方法里存在修改代币数量的函数,因此还可以将修改代币的方法单独实现,这样即使token变量可控,也无法成功套利:
3.锁定交易token:
0x05:总结
经过完整分析,知道创宇区块链安全实验室明确了该次攻击事件的源头并非网传的闪电贷攻击,攻击者利用GrimBoostVault合约的depositFor方法参数可控,实施了重入攻击,将自己的铸造的无价值代币兑换成了质押凭证,最后通过withdrawAll方法实现套利,而闪电贷?攻击者只是利用闪电贷扩大了套利值。
对于合约代码而言安全性是十分重要的,每一个未经验证的传入参数都可能导致巨大的经济损失,开发者在编写重要操作方法时,须记住零信任原则,谨慎对待每一个传入参数。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。