背景信息
攻击交易:https://app.blocksec.com/explorer/tx/bsc/0xd6ba15ecf3df9aaae37450df8f79233267af41535793ee1f69c565b50e28f7da
漏洞合约:https://vscode.blockscan.com/56/0xc86A50d30c2da607DE91375f363DeDFb3086b9D4
FortuneWheel
合约实现了幸运轮盘竞猜功能,合约通过 swapProfitFees()
将合约中盈利的代币一部分作为 fee 兑换成 BNB,然后再将 BNB 兑换成 LINK。由于 swapProfitFees()
在兑换过程中没有设置滑点,使得攻击者可以通过三文治攻击进行获利。
Trace 分析
通过闪电贷获得 BNB
- 攻击者将 BNB 换成 LINK
- 调用 swapProfitFees() 函数:
- 将 BNBP 兑换成 BNB
- 将 BNB 兑换成 LINK
- 此时 LINK 的价格已经被 FortuneWheel 抬高,攻击者再将 LINK 换成 BNB 完成获利。
代码分析
swapProfitFees() 函数首先通过 for 循环将所有的 profit 代币按照 fee 的比例兑换成 WBNB,且没有设置滑点。
然后将 WBNB 换成 LINK,这个过程中同样没设置滑点,也就给了攻击者通过控制 BNB-LINK 的价格来套取利润的机会。
未了避免此次安全事件再次发生,建议需要在合约中实现 swap 功能时设置一个合适的滑点,避免被 Force Investment 导致资产损失。