超1900枚ETH被盗,Radiant Capital如何被黑客“摸底”盗取450万美元!
摘要: Radiant Capital项目遭受攻击者闪电贷攻击。攻击者通过3笔交易,盗取了超1900枚ETH,价值超450万美元,目前被盗资金还保存在攻击者地址,Beosin安全团队第一时间对本次事件进行了分析。
2024年1月3日,据Beosin旗下EagleEye安全风险监控、预警与阻断平台监测显示,Radiant Capital项目遭受攻击者闪电贷攻击。攻击者通过3笔交易,盗取了超1900枚ETH,价值超450万美元,目前被盗资金还保存在攻击者地址,Beosin安全团队第一时间对本次事件进行了分析。
漏洞分析
该事件发生的根本是由于Radiant Capital项目在计算代币数量的过程中,使用了精度扩展,并且采用了四舍五入的方式进行计算,导致攻击者可以通过控制精度大小,并结合四舍五入扩大利润点来进行攻击。
观察上述代码,rayDiv函数传入两个uint256数据a和b,整个过程可以简写为(a*RAY+b/2)/b,其中RAY是精度扩展数据,为10^27,那么该结果相当于a*RAY/b+0.5,实现四舍五入的功能,而该计算方式误差主要来源于b,如果b相对于a来说极小,那么误差将可忽略不计,但如果b于a拥有相同数量级,那么误差可能达到a本身。
举个例子:如果a*RAY=10000,b=3,那么计算出来结果为3333,比实际值小了1/10000;而如果a*RAY=10000,b=3000,计算出来的结果为3,比实际值小了1/10。
此次事件便是攻击者操控b的值,让b值与a值拥有相同数量级,使得计算等价于3/2.0001=1,计算值比实际值减小1/3。
攻击流程
让我们来看看黑客的攻击流程:
1.攻击者首先通过AAVE闪电贷借贷了300万枚USDC,用于攻击启动资金。 2.攻击者将200万枚USDC质押到Radiant合约,并获得了200万枚rUSDCn凭证代币。3.攻击者通过Radiant合约进行闪电贷,借贷200万USDC,并在回调函数中将200万USDC归还,同时将第二步质押的USDC提取出来,最后闪电贷函数会调用transferfrom函数连本带利的将攻击者的USDC转入合约。此时会收取9/10000的手续费,而收取的手续费便成为了池子的流动性。 4.攻击者通过多次重复步骤3的操作,将liquidityIndex控制得很大,liquidityIndex=271800000000999999999999998631966035920。 5.接下来,攻击者新建了一个合约,并向其中打入54.36万USDC,因为5436(USDC数值)正好是步骤4中2718(liquidityIndex数值)的两倍,可方便进行四舍五入控制。 6.攻击者将54.36万USDC全部抵押进Radiant合约,并获得相同数量的rUSDCn。7.攻击者提取40.77万USDC,本应该销毁40.77万rUSDCn,但如上所述,burn函数进行了精度扩展与四舍五入计算。407700000000000000000000000000000000000/271800000000999999999999998631966035920=1.49999999,而四舍五入结果为1,导致结果偏小了1/3。
如下图,本该销毁40.77万,但还剩27.18万,说明只销毁了27.18万,攻击者便提取了40.77万USDC。
8.攻击者利用第七步的漏洞,重复质押提取操作,并且提取始终比质押数量多1/3,最终将池子里的USDC全部兑换出来。
资金追踪
截止发稿,被盗的1902枚ETH一直存在黑客地址未移动,Beosin Trace将对资金进行持续监控。 随着2024年的开启,我们已目睹了两起大金额的被盗案件的发生。(昨日安全事件回顾:开年第一案,被盗8000万美元的Orbit Chain事件是怎么一回事?)这一系列的事件再次提醒了我们,在Web3生态系统中,安全防范仍然是至关重要!
评论(0)
Oh! no
您是否确认要删除该条评论吗?