上周,发生了两起较大的安全事件。
首先是北京时间11月10日19:00左右,Beosin旗下EagleEye监测到孙宇晨旗下Poloniex 相关地址持续转出大额资产,疑似被盗。
相关地址:https://eagleeye.space/address/0x0A5984f86200415894821bFEFc1c1De036DbF9e7
紧接着,孙宇晨以及 Poloniex 在社交平台发布公告证实了被盗事件。根据Beosin安全团队使用Beosin Trace追踪统计,Poloniex 被盗资产累计约 1.14 亿美元。
Poloniex黑客将盗取代币分散到各个地址进行兑换,并沉淀到不同地址。11月10日20:30左右,攻击在以太坊链上已将盗取代币兑换为超3000万美元的ETH并存放在各个地址,在TRON链上的盗取资金也已转移为超过2000万美元的TRX并存放于各个地址,同时还在持续兑换转移。资金转移明细如下图所示。
Beosin Trace追踪资金统计
在攻击发生后,孙宇晨也发文,劝告黑客尽快「退款」,并愿意拿出 5% 资产作为白帽奖励,黑客也并未作出任何回应。
无独有偶,第二天2023年11月11日,Beosin旗下EagleEye平台监测到,以太坊链上的Raft项目的IRPM合约遭受黑客攻击,项目方损失约3,407,751美元。本次攻击较为复杂,Beosin安全团队将详细分析结果分享如下。
相关地址:
https://eagleeye.space/address/0xc1f2b71A502B551a65Eee9C96318aFdD5fd439fA
Raft项目安全事件相关信息
●攻击交易
0xfeedbf51b4e2338e38171f6e19501327294ab1907ab44cfd2d7e7336c975ace7
●攻击者地址
0xc1f2b71A502B551a65Eee9C96318aFdD5fd439fA
●攻击合约
0x0A3340129816a86b62b7eafD61427f743c315ef8
0xfdc0feaa3f0830aa2756d943c6d7d39f1d587110
●被攻击合约
0x9ab6b21cdf116f611110b048987e58894786c244
Raft项目安全事件漏洞分析
主要是攻击者利用了闪电贷进行质押率操控,并且铸币计算方式采用向上取整导致,攻击者利用被操纵的质押率放大了向上取整的影响,导致少量的质押可以借出大量的资产。
攻击流程
攻击准备阶段:
1. 攻击者通过攻击合约,在AAVE中使用闪电贷借入了6001个cbETH,以用于捐赠进行利率操控。
接着攻击者清算了自己的在IRPM上借贷。
清算分两个阶段,在_closePosition中攻击者burn了合约中一半数量的rcbETH-d(rcbETH-d是raft项目的债务量代币,rcbETH-c是质押资产代币)。
在_closePosition函数结束之后,第二阶段会调用_updateDebtAndCollateralIndex更新新的借贷利率。
这里面的总债务量攻击者通过前面的清算已经减少了一半。
由于.raftCollateralToken.setIndex这个质押资产的利率更新中使用了balanceof(address.This)作为参数传入,导致了攻击者通过闪电贷借入的6001个cbETH可以直接转入合约中进行控制。可以看到这6003个cbETH的总量有6001个都是未更新的。
而在代币cbETH的setIndex函数中虽然有权限控制,新的利率是由攻击者操控的backingAmount除代币总量进行计算,攻击者通过被攻击合约(IRPM)的权限,并传入异常的参数,导致这个storedIndex扩大到67*10^36(扩大67*10^18)。
2.在抵押率被操控之后攻击者通过另一个攻击合约0xfdc0feaam进行多笔cbETH铸造rcbETH-c。这里的铸币函数是采用的向上取整的方式,由于上面storedIndex扩大了67*10^18,会导致铸币数量缩小67*10^18倍,但由于铸币函数是采用的向上取整的方式,使得本该按1:1/(67*10^18)比例铸币变成了1:1来铸币,相当于抵押品价值扩大了67*10^18倍。
3.在多次mint结束后,攻击者有了10,050个rcbETH-c,开始了借贷。(这多笔mint债务量rcbETH-d为3000始终没变)。
4.攻击在增加大量rcbETH-c 后,先把闪电贷需要还的钱借出来
之后再以R token形式的借出收益共6705028个。
之后将3,300,000个Rtoken进行兑换,最终共换出1575个ETH, 但是在换出的时候将eth换到0地址上了。
剩下的3322460 Rtoken,账户中留下了1442460个,剩下的1,900,000个转入了攻击合约向攻击者兑换了个127ETH。
Raft项目安全事件资金追踪
截止发文时,Raft项目的IRPM合约被盗资金共3,407,751美元,其中价值3,140,000的ETH被攻击者误转入0地址,剩下的获利由攻击合约分批卖出267,751美元。
总结
对于Poloniex安全事件,Beosin提醒钱包或者项目方应保管好私钥。针对Raft项目项目IRPM合约安全事件,Beosin安全团队建议:1. 质押率等关键函数计算通过预言机报价进行。2.涉及系数计算,要先乘后除,并且尽量避免使用向上取整的方式。同时我们建议项目上线前,寻求专业的安全审计公司进行全面的安全审计。