4

如何通过恒定乘积黑掉 SushiSwap ?简析 SushiSwap 第二次被攻击始末

 3 years ago
source link: https://www.jinse.com/blockchain/989851.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

背景

2021 年 1 月 27 日,据慢雾区情报,SushiSwap 再次遭遇攻击,此次问题为 DIGG-WBTC 交易对的手续费被攻击者通过特殊的手段薅走。慢雾安全团队在收到情报后立马介入相关事件的分析工作,以下为攻击相关细节。

SushiMaker 是什么

SushiMaker 是 SushiSwap 协议中的一个重要的组件,其用于收集 SushiSwap 每个交易对的手续费,并通过设置每个代币的路由,将不同交易对的手续费最终转换成 sushi 代币,回馈给 sushi 代币的持有者。这个过程就是发生在 SushiMaker 合约上。

说说恒定乘积

恒定乘积的公式很简单,在不计算手续费的情况下,恒定乘积的公式为

4661812_image3.png

也就是说每次兑换,其实都是遵循这个公式,及交易前后 K 值不变,在兑换的过程中,由于要保持 K 值不变,公式的形式会是这个样子

4661813_image3.png

其中 X 代表卖掉的代币,Y 代表要购买的代币,那么每次能兑换到的代币数量会是这个样子(具体的推导过程就不演示了 :D)

4661814_image3.png

从公式上可以看到,当输出代币 Y 的兑换数量上限取决于 Y 代币的数量,而和 X 代币数量的大小无关,反过来说,如果要卖掉的 X 代币数量很大,但是 Y 代币的数量很小,那么就会造成大量的 X 代币只能兑换出少量的 Y 代币,而这个兑换价格相比正常的交易价格会偏离很多,这就是所谓的滑点,是本次攻击中的关键。

攻击流程

2020 年 11 月 30 日,SushiSwap 就曾因为 SushiMaker 的问题出现过一次攻击(详解参阅:以小博大,简析 Sushi Swap 攻击事件始末),本次攻击和第一次攻击相似,但流程上有区别。相较于旧合约,在新的合约中, 手续费在兑换的过程中会通过 bridgeFor 函数为不同交易对中的代币寻找特定的兑换路由,然后进行兑换。

4661815_image3.png

其中,brdigeFor 函数的逻辑如下:

4661816_image3.png

根据 bridgeFor 的逻辑,我们不难发现,如果没有手动设置过特定币种的 bridge,那么默认的 bridge 是 WETH,也就是说,在未设置 bridge 的情况下,默认是将手续费兑换成 WETH。而 DIGG 这个币,就是正好没有通过 setBridge 设置对应的 bridge 的。

4661817_image3.png

但是这里还有一个问题,就是在 swap 的过程中,如果这个交易对不存在,兑换的过程是失败的。本次攻击中,DIGG-WETH 这个交易对一开始并不存在,所以攻击者预先创建一个 DIGG-WETH 的交易对,然后添加少量的流动性。这个时候如果发生手续费兑换,根据前面说的恒定乘积的特性,由于 DIGG-WETH 的流动性很少,也就是 DIGG-WETH 中的 WETH 上限很小,而 SushiMaker 中的要转换的手续费数量相对较大,这样的兑换会导致巨大的滑点。兑换的过程会拉高 DIGG-WETH 交易对中 WETH 兑 DIGG 的价格,并且,DIGG-WETH 的所有 DIGG 手续费收益都到了 DIGG-WETH 交易中。通过观察 DIGG-WETH 交易对的流动性情况,流动性最大的时候也才只有不到 2800 美元的流动性,这个结果也能和公式的推导相互验证。

4661818_image3.png

攻击者在 SushiMaker 完成手续费转换后,由于  DIGG-WETH 交易对中 WETH 兑 DIGG 的价格已经被拉高,导致少量的 WETH 即可兑换大量的 DIGG,而这个 DIGG 的数量,正是 DIGG-WBTC 交易对的大部分手续费收入。

4661819_image3.png

总结

本次攻击和 SushiSwap 第一次攻击类似,都是通过操控交易对的兑换价格来产生获利。但是过程是不一样的。第一次攻击是因为攻击者使用 LP 代币本身和其他代币创建了一个新的交易对,并通过操纵初始流动性操控了这个新的交易对的价格来进行获利,而这次的攻击则利用了 DIGG 本身没有对 WETH 交易对,而攻击者创建了这个交易对并操控了初始的交易价格,导致手续费兑换过程中产生了巨大的滑点,攻击者只需使用少量的 DIGG 和 WETH 提供初始流动性即可获取巨额利润。

相关参考链接如下:

SushiMaker 归集手续费交易:

https://etherscan.io/tx/0x90fb0c9976361f537330a5617a404045ffb3fef5972cf67b531386014eeae7a9

攻击者套利交易:

https://etherscan.io/tx/0x0af5a6d2d8b49f68dcfd4599a0e767450e76e08a5aeba9b3d534a604d308e60b

DIGG-WETH 流动性详情:

https://www.sushiswap.fi/pair/0xf41e354eb138b328d56957b36b7f814826708724

Sushi 第一次被攻击详解:

https://mp.weixin.qq.com/s/-Vp9bPSqxE0yw2hk_yogFw

By : yudan@慢雾安全团队


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK