孙宇晨旗下 Poloniex 被盗上亿美元,Raft 项目被盗 340 万美元,上周黑客为何如此猖獗?

封面:Photo by Towfiqu barbhuiya on Unsplash

上周,发生了两起较大的安全事件。

首先是北京时间 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

●攻击合约

0x0A3340129816a86b62b7eafD61427f743c315ef80xfdc0feaa3f0830aa2756d943c6d7d39f1d587110

●被攻击合约

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. 涉及系数计算,要先乘后除,并且尽量避免使用向上取整的方式。同时我们建议项目上线前,寻求专业的安全审计公司进行全面的安全审计。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。 文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。