核心问题点:允许数量 1:1 兑换 BSC_USDT 和 WUSD 的同时,WUSDMaster 的 swap 操作会额外导致 WaultSwapPair(BSC_USDT-WEX) 的池子中的代币失衡,从而形成套利空间。
注意:BSC_USDT 和 WUSD 也可以理解为价格上也是 1:1
攻击事件的剖析
攻击的交易 Txid
0x31262f15a5b82999bf8d9d0f7e58dcb1656108e6031a2797b612216a95e1670e
攻击的合约地址
0xaa895873a268a387e38bd841c51d2804071197a1
攻击者地址
0x886358f9296de461d12e791bc9ef6f5a03410c64
被攻击的项目地址
0xa79fe386b88fbee6e492eeb76ec48517d1ec759a (wault.finance 的 WUSDMaster 合约)
我们可以把本次的过程分为 3 个阶段:准备套利资金、构造套利空间、实施套利。
第一阶段:通过闪电贷获得初始攻击资金
1、在 WaultSwapPair (BSC_BUSD-WUSD) 中通过闪电贷借了 16,839,004 枚 WUSD;
2、调用 WUSDMaster 合约中的赎回 (redeem) 函数,将闪电贷借到的 WUSD 燃烧掉,换成 BSC_USDT 和 WEX;
3、去 PancakePair (WBNB-BSC_USDT) 中通过闪电贷借了 40,000,000 枚BSC_USDT;
4、将借到的 23,000,000 枚 BSC_USDT 在 WaultSwapPair (BSC_USDT-WEX) 中换成了 WEX。此时攻击者已经做好了套利的准备。
WEX 的数量:624,440,724 = 106,502,606 + 517,938,118
WEX 的来源:redeem 操作 + WaultSwapPair (BSC_USDT-WEX) 中兑换所得
第二阶段:使 BSC_USDT-WEX 池子失衡形成套利空间
1、 多次 (68 次) 调用 WUSDMaster 合约中的质押(stake)函数;
通过三次操作,攻击者将 ETH 兑换为 anyETH,再通过跨链平台将所得 ETH 跨链到以太坊地址:
0x886358f9296De461d12e791BC9Ef6F5a03410C64。
事件梳理 (UTC)
- 1:25:07 攻击者从 Tornado Cash 提取 100 ETH
- 1:27:09 攻击者充币到币安 1 ETH
- 1:35:24 攻击者从币安提现 2 BNB 到 BSC
- 1:35:27 攻击者从币安提现 0.72213159 Binance-Peg ETH 到 BSC
- 1:43:52 - 1:49:05 攻击者在 BSC 上部署合约实施攻击
截止目前,攻击者获利地址
0x886358f9296De461d12e791BC9Ef6F5a03410C64 共有余额 468.99 ETH。
总结
本次攻击事件是经典的利用闪电贷进行套利的案例,由于经济模型上的设计缺陷导致的攻击者可以对 WaultSwapPair (BSC_USDT-WEX) 的池子进行套利攻击。项目方在开发之初也要关注经济模型的设计所带来的攻击面,建议让第三方专业的团队或专家对项目在 DeFi 各种场景下的攻击面进行推演,排查可能的攻击面,从经济模型和架构设计上对项目进行优化和加固。
慢雾安全团队已经将攻击者地址加入到 AML 系统中进行监控,并且使用了 AML 系统的联动能力尽可能的对攻击者资金进行封堵。
参考攻击交易:
https://bscscan.com/tx/0x31262f15a5b82999bf8d9d0f7e58dcb1656108e6031a2797b612216a95e1670e