2022年5月17日 R0X被攻击损失约130万
相关信息:https://www.tuoluo.cn/article/detail-10098039.html
攻击交易:
https://bscscan.com/tx/0xe956da324e16cb84acec1a43445fc2adbcdeb0e5635af6e40234179857858f82
合约代码:(SmartDeFi 未验证–但代码与fegexPro代码相似->{
类似与fegexPro与erc20代码的结合}
)
所以参考代码为:https://bscscan.com/address/0x818e2013dd7d9bf4547aaabf6b617c1262578bc7#code
与5月16日fegexPro池被攻击(https://www.lianantech.com/#/infomationDetail?id=640)不同,SmartDeFi 与fegexPro代码在depositInternal
函数中为直接调用tranceferfrom
函数传递token,并记录用户抵押数量,所以无法实现重复抵押再调用swapToSwap
提取,但池中代币的计算方式与fegexPro计算方式基本相同,
//fegexPro 合约代码
function setTokenBalance() internal {
_records[Token].balance = IERC20(Token).balanceOf(address(this)) - _totalSupply1;
}
function setMainBalance() internal {
uint256 al = (_totalSupply2 +_totalSupply7 + _totalSupply8);
_records[Main].balance = IERC20(Main).balanceOf(address(this)) - al;
}
同时买卖也是通过_records[Main].balance
, _records[Token].balance
这两个变量来实现计算输出值的.
calcOutGivenIn( inRecord.balance, bmul(1e18, 25),outRecord.balance, bmul(1e18, 25), bmul(msg.value, bdiv(999, 1000)),0);
因此,可以通过质押后调用swapToSwap
来减少_totalSupplyX
数量同时IERC20(X).balanceOf(address(this))
数量保持不变,增加_records[X].balance
的值,导致卖出相同数量的token,可以获得更多代币.
所以SmartDeFi基本攻击流程为:
- 在限制内购买大量(R0X)代币.
- 质押超大量fBNB,并调用
swapToSwap
(将对应fBNB授权给自己合约),同时提高(R0X)代币的价格. - 调用
sync()
同步更新池内代币价格 - 卖出步骤1内购买的大量(R0X)代币,获得超过购买时所花(BNB)金钱.
- 提取步骤2中授权的所有(fBNB)代币.完成攻击
漏洞影响范围:所有SmartDeFi协议.
漏洞原因:不受信任的 path
参数被传递到函数swapToSwap
中,同时并未验证代币是否真正被发送.