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

作者:yudan@慢雾安全团队

背景

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

SushiMaker是什么

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

说说恒定乘积

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

大咖零距离 | 如何使用趋势跟踪策略只赚不亏:2月7日18:00,金色盘面邀请实盘大V数字货币大空头做客金色财经《大咖零距离》直播间,将分享《如何使用趋势跟踪策略只赚不亏》,敬请关注,欲进群观看直播扫描海报二维码报名即可![2020/2/7]

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

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

声音 | 韦氏评级:无论比特币盈利能力如何 投资者都更倾向于存币而非卖币:韦氏评级今日称,超过60%的比特币一年多都存储于钱包中而非在市场流通。在此期间,比特币兑美元的价格从去年12月的3100美元上涨到仅6个月后2019年的13800美元高点。无论盈利能力如何,投资者都希望存币而不是卖币。[2019/12/3]

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

声音 | 江卓尔:扩容之争核心是如何解决拥堵问题,应该大区块扩容:莱比特矿池江卓尔今日发微博称,扩容之争核心是如何解决拥堵问题,扩容派坚持中本聪的大区块扩容路线,Core党提出隔离见证SW扩容(号称有4M效果)和闪电网络,3年过去了,结果呢?SW扩容只有1.2MB的微弱效果,区块还是满的,一到5月的小牛市立马堵成狗,手续费飙升。闪电网络更是彻底扑街,没人去用这种反人性+反经济规律的产品。Core无法解决拥堵问题,无可争辩的事实说明中本聪是对的,应该大区块扩容。[2019/11/16]

攻击流程

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

Thomas 发布趣味视频 讲述EOSIO系统如何向节点支付奖励:据金色财经合作媒体IMEOS 报道,昨日 Thomas Cox 在 YouTube 上传了一个手绘风视频,为大家讲解 EOSIO 系统如何向节点支付奖励。视频中说到,按照每年通货膨胀 5% 的规则,每天大约会有 133,000 个新的 Token 产生,那么增发总数的 1%,即约为 27,000 个新的 Token 用于支付节点支出。并且,新系统中没有取中间值报价的说法。另外 4% 会进入 Worker Proposal Fund。[2018/5/21]

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

美国银行分析师解释比特币如何像常规货币:据CCN报道,美国圣路易斯联邦储备银行内容策略师Christine Smith认为,比特币不像人们想象的那样异乎寻常,比特币的两个用例是作为价值和货币存储的,史密斯论证比特币与普通货币没有区别的三大理由:

1.比特币和美元都没有实物资产支持;

2.“稀缺”是美联储货币体系稳定战略的核心,因为“为了保持其价值,货币必须供应有限”,而比特币的数量也是有限的。

3.比特币“纯粹的电子现金对等版本可以让在线支付从一方直接发送到另一方,而无需通过金融机构”,这与现金花费方式有相似性,即“不需要中间人处理交易”。[2018/5/1]

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

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

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

总结

本次攻击和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?

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:15ms0-6:520ms