一个DeFi纵价攻击事件背后的数学原理分析
- 被攻击的合约代码:https://bscscan.deth.net/address/0x2287c04a15bb11ad1358ba5702c1c95e2d13a5e0#code
- 攻击的Tx:https://versatile.blocksecteam.com/tx/bsc/0x7f183df11f1a0225b5eb5bb2296b5dc51c0f3570e8cc15f0754de8e6f8b4cca4
- 大致的攻击原理和过程这个推文有说:https://twitter.com/BlockSecTeam/status/1547456591900749824
攻击步骤描述
- 1、先用闪电贷借出USDT
- 2、用USDT兑换大量的SpaceGodzilla的token
- 3、调用合约的swapAndLiquifyStepv1函数,将合约自身的资产都拿去Dex做LP
- 4、将步骤2获得的token再兑换成USDT,获得套利
深入分析
这个攻击手法属于纵价攻击类型,可能大家都觉得只要有swapAndLiquifyStepv1的功能漏洞就一定能攻击成功。那么仔细想想,事实真的这样子吗?
在跟技术群友讨论这个漏洞攻击的过程中有人对于这个操作下来为什么就会产有多的USDT生成而产生疑惑,其实一开始我在看这个攻击过程的时候也没往这方向想,就觉得靠着K线公式的原理一来一回产生价格差而实现套利,经过思考后发现事情并没有那么多简单。
这里降低分析的复杂度,不考虑Dex的交易过程中的手续费磨损
同时也要确保token再转账的过程中没有额外的手续费
在攻击前
$$ X \cdot Y = K $$
用闪电贷获得的 $\Delta{Y}$ 兑换 $\Delta{X}$,满足:
$$ (X-\Delta{X}) \cdot (Y + \Delta{Y}) = K $$
然后触发漏洞函数,让合约的资产去做LP:
$$ (X-\Delta{X}+LP^X) \cdot (Y + \Delta{Y} + LP^Y) = K’ $$
这个时候,$K$ 值显然是变大的,$K’ \gt K$
然后用获得的 $\Delta{X}$ 再全部兑换成 $\Delta{Y}’$,得到
$$ (X-\Delta{X}+LP^X + \Delta{X}) \cdot (Y + \Delta{Y} + LP^Y - \Delta{Y}’) = K’ $$
可以得到
$$ \Delta{Y}’ = Y + \Delta{Y} + LP^Y - \frac{(X-\Delta{X}+LP^X)\cdot(Y+\Delta{Y}+LP^Y)}{X+LP^X} $$
我们会期望得到 $\Delta{Y}’ \gt \Delta{Y}$, 这样操作才会获利,因此取
$$ \Delta{Y}’ - \Delta{Y} = Y + LP^Y - \frac{(X-\Delta{X}+LP^X)\cdot(Y+\Delta{Y}+LP^Y)}{X+LP^X} \gt 0 $$
相关约束:
$$ (X-\Delta{X}) \cdot (Y + \Delta{Y}) = K $$
$$ \frac{LP^X}{LP^Y} = \frac{X-\Delta{X}}{Y + \Delta{Y}} $$
其中 $X$ 和 $Y$ 都是常量,套利者需要控制好 $\Delta{Y}$ 和 $LP^Y$ 的数量,确保上面的不等式成立
因此,这套攻击手法还是要看LP的初始状态以及在攻击过程中的一些参数的配合,才能达到套利的目的,不然自己会被反撸。