创宇区块链|Rikkei Finance 遭黑客攻击 损失已有百万美元
1. 前言
北京时间 2022 年 4 月 15 日, 知道创宇区块链安全实验室 监测到 DeFi 协议 Rikkei Finance 遭到黑客攻击,被盗资金中已有 2600 枚 BNB(约合 108.5 万美元)被转入 Tornado Cash。
2. 分析
攻击事件如下图所示:
2.1 基础信息
-
攻击合约:0xe6df12a9f33605f2271d2a2ddc92e509e54e6b5f0x9ae92cb9a3ca241d76641d73b57c78f1bcf0b209
-
攻击者地址:
0x803e0930357ba577dc414b552402f71656c093ab
-
恶意预言机地址:0xa36f6f78b2170a29359c74cefcb8751e452116f90x99423d4dfce26c7228238aa17982fd7719fb6d7f
-
攻击 tx:0x93a9b022df260f1953420cd3e18789e7d1e095459e36fe2eb534918ed16874920x4e06760884fd7bfdc076e25258ccef9b043401bc95f5aa1b8f4ff2780fa45d44
-
被攻击预言机地址:
0xd55f01b4b51b7f48912cd8ca3cdd8070a1a9dba5
2.2 流程
攻击者的攻击流程如下:
-
攻击者调用 external 可见性的 setOracleData() 函数将预言机设置为自己的恶意预言机。
-
由于恶意预言机替换了原来的预言机,导致预言机输出的 rTokens 价格可以被攻击任意操控。攻击者向 RBinance 合约发送 0.0001 BNB 获得 4995533044307110.024 rBNB。
3. 由于兑换了大量的 rBNB,所以攻击者借出 346199.781 USDC 。
4. 攻击者将借出的 346199.781 USDC 兑换成 776.298 WBNB。
5. 攻击者重复第三步和第四步操作分别借出 3.033 BTC B、52275.873 DAI 、297082.798 BSC-USD、299822.459 BUSD 并兑换成相应的 WBNB。
6. 将兑换的共 2571.201 BNB 转移到攻击者账户上。
7. 最后攻击者再次调用 setOracleData() 还原预言机状态。
另外一次攻击的手法相同,只是先将 BNB 兑换成 BUSD 再转去 RBinance 获得 rBUSD。
2.3 细节
问题点就在于 Cointroller 中的 SimplePriceOracle.sol (https://bscscan.com/address/0xd55f01b4b51b7f48912cd8ca3cdd8070a1a9dba5#code) 合约,其 setOracleData 的可见性为 external,可以被外部调用。
修改预言机前的正常价格为 416247538680000000000。
将 rToken 0x1578 的预言机修改为恶意预言机 0xa36f。
设置恶意预言机后将 rToken 价格提升到 416881147930000000000000000000000。
2.4 后续处理
攻击者将盗取的 BNB 分批次转入 Tornado Cash 中。
Rikkei Finance 官方称将全额补偿漏洞利用攻击中受影响的所有用户。
3. 总结
由于合约没有对 setOracleData 函数的可见性进行限制,导致了攻击者可以任意修改预言机地址,从而获取了从合约中代币,所以我们在写合约时一定要严格限制函数的可见性。