北京时间2022年4月15日11点18分,CertiK审计团队监测到Rikkei Finance被攻击,导致约合701万元人民币(2,671 BNB)资产遭受损失。
由于缺乏对函数`setOracleData`的访问控制,攻击者将预言机修改为恶意合约,并获取了从合约中提取USDC、BTCB、DAI、USDT、BUSD和BNB的权限。攻击者随后将这些代币全部交易为BNB,并通过tornado.cash将这些BNB转移一空。
攻击步骤
①攻击者向rBNB合约发送了0.0001个BNB以铸造4995533044307111个rBNB。
②攻击者通过公共函数`setOracleData()`将预言机设置为一个恶意的预言机。
③由于预言机已被替换,预言机输出的rTokens价格被操纵。
④攻击者用被操纵的价格借到了346,199USDC。
⑤攻击者将步骤4中获得的USDC换成BNB,并将BNB发送到攻击合约中。
⑥攻击者重复步骤4和5,耗尽BTCB、DAI、USDT和BUSD。
⑦攻击者使用函数`setOracleData()`再次改变预言机,还原了该预言机的状态。
合约漏洞分析
Simple Price预言机 :
https://bscscan.com/address/0xd55f01b4b51b7f48912cd8ca3cdd8070a1a9dba5#code
Cointroller: https://bscscan.com/address/0x00aa3a4cf3f7528b2465e39af420bb3fb1474b7b#code
资产地址: Rtoken 0x157822ac5fa0efe98daa4b0a55450f4a182c10ca
新的(有问题的)预言机:
0xa36f6f78b2170a29359c74cefcb8751e452116f9
原始价格: 416247538680000000000
更新后的价格: 416881147930000000000000000000000
Rikket Finance 是利用Cointroller中的SimplePrice预言机来计算价格的。然而,函数`setOracleData()`没有权限控制,也就是说它可以被任何用户调用。攻击者使用自己的(恶意的)预言机来替换原有的预言机,并将rToken的价格从416247538680000000000提升到4168811479300000000000000。
资产去向
攻击者在两次交易中获得了2671枚BNB(价值约701万人民币)。攻击者已使用tornado.cash将所有的代币进行了转移。
其他细节
漏洞交易:
● https://bscscan.com/tx/0x4e06760884fd7bfdc076e25258ccef9b043401bc95f5aa1b8f4ff2780fa45d44
● https://bscscan.com/tx/0x93a9b022df260f1953420cd3e18789e7d1e095459e36fe2eb534918ed1687492
相关地址:
● 攻击者地址:
0x803e0930357ba577dc414b552402f71656c093ab
● 攻击者合约:
0x9aE92CB9a3cA241D76641D73B57c78F1bCF0B209
0xe6df12a9f33605f2271d2a2ddc92e509e54e6b5f
● 恶意预言机:
https://bscscan.com/address/0x99423d4dfce26c7228238aa17982fd7719fb6d7f
https://bscscan.com/address/0xa36f6f78b2170a29359c74cefcb8751e452116f9
● 攻击者地址:
0x803e0930357ba577dc414b552402f71656c093ab
● 攻击者合约:
0x9aE92CB9a3cA241D76641D73B57c78F1bCF0B209
0xe6df12a9f33605f2271d2a2ddc92e509e54e6b5f
● 恶意预言机:
https://bscscan.com/address/0x99423d4dfce26c7228238aa17982fd7719fb6d7f
https://bscscan.com/address/0xa36f6f78b2170a29359c74cefcb8751e452116f9
●被攻击预言机地址:
https://bscscan.com/address/0xd55f01b4b51b7f48912cd8ca3cdd8070a1a9dba5#code
写在最后
该次事件可通过安全审计发现相关风险。CertiK的技术团队在此提醒大家,限制函数的访问权限是不可忽略的一步。