背景介绍
2024年11月18日,我们监控到 BNB Smart Chain 上的一起攻击事件,被攻击的项目为BTB。攻击交易为
https://bscscan.com/tx/0xfb6df4053c2f1000cb03135064af19a79a87cf25efe612ae5f3468390d6be216
本次攻击共造成约 5000 USD 的损失。
攻击及事件分析
首先,攻击者利用 flashloan 从 pancakeSwapV3 中贷款 100,000 BUSD
随后,攻击者利用 pancakeSwapV2 将贷到的 100,000 BUSD 兑换为 1,263,427 BTB
接着,攻击者利用 BTB 的 exchangeBTBToUSDT 将 3,052 BTB 兑换为 4,999 BUSD
我们看一下被攻击的智能合约的函数 exchangeBTBToUSDT 的代码
可以看到,兑换的价格是由 pancakeSwapV2 的 BTB 和 BUSD 的 pair 的 reserve 决定的。这样,攻击者就可以利用 pacakeSwap 兑换大额 BTB 或 BUSD 来操纵 BTB 的价格。我们可以看到,攻击者在用 flashloan 贷来的 100,000 BUSD 兑换了 BTB 。
因此,在攻击者使用 pancakeSwapV2 进行大额 BUSD 兑换 BTB 前
reserve0 为:
1,327,362,530,716,302,619,951,383 ,
reserve1 为:
5047758199614262100984 ,
兑换后 reserve0 为:
63934622394514316973499 ,
reserve1 为:
105047758199614262100984 。
通过 getPrice 中 getAmountOut 的实现,我们可以计算出攻击者兑换前和兑换后的 BTB 价格变化。
我们通过计算得到 BTB 的价格从 1BTB=0.00379143964708692 BUSD 拉升到了 1 BTB =1.6381204893766859 BUSD 。价格被拉升了 400 多倍。
因此,攻击者使用了 3052 BTB 兑换到了 4999 BUSD 。
最后,攻击者用剩下的 1260375 BTB 从 pancakeSwapV2 中兑换了 99,964 BUSD。
攻击者再归还 flashloan 的贷款及利息 100,100 BUSD 后,获利 4,863 BUSD 。
总结
本次漏洞的成因是项目方在完成兑换 BTB 到 BUSD 时,使用了过时的价格预言机,导致攻击者可以轻易操纵 BTB 的价格,先进行大笔买入 BTB ,拉高 BTB 的价格后再卖出。最后完成套利。建议项目方在设计价格预言机和代码运行逻辑时要多方验证,合约上线前审计时尽量选择多个审计公司交叉审计。