招新小广告CTF组诚招re、crypto、pwn、misc、合约方向的师傅,长期招新IOT+Car+工控+样本分析多个组招人有意向的师傅请联系邮箱
[email protected](带上简历和想加入的小组)
2023年8月2日,SlowMist发布预警,Uwerx_network项目遭到闪电贷攻击:
过程
-
从Balancer合约借出2000 weth。 -
使用2000 weth从weth-werx pair合约中换出20174786100489116297837的werx。这时池子中的werx大量减少,两种代币的比例从 weth - 20174786100489116297837 werx - 44298177385759127606945
变化为weth - 20174786100489116297837 werx - 44298177385759127606945
-
向pair合约发送4429817738575912760684500的werx,注意这个值为现在pair合约的werx持有量的100倍。 -
调用pair合约的skim函数,该函数可以将pair合约中多余的代币发送到指定地址,多出来的代币就是上一步发送到pair合约的werx代币,这里指定的地址为0x0000000000000000000000000000000000000001 -
在skim函数中将4429817738575912760684500的werx代币,发送到0x0000000000000000000000000000000000000001地址。但是在调用transfer的时候,如果调用者是uniswapPoolAddress,则会burn 1%的代币。
这个地址应该uniswap的pair合约,但是最初被硬编码成0x01合约,等待部署之后被管理员设置成真正的pair合约:
但是查看slot,发现这个地址并没有更改:
-
上面的步骤中,发送100倍pair合约中werx储量的代币,由于会burn调用发送者1%的代币,而发送者就是pair合约,所以这样会差不多burn掉pair中的所有的werx,将werx的价格推到极高。这时pair合约中的两种代币的比例为: weth - 20174786100489116297837 werx - 100
-
最后,再将剩余的werx去到池子中换weth,基本可以将池子中全部的weth取出。将从balancer借出的2000weth还回,获利约173 ether。
这次攻击的本质是可以任意销毁pair合约中的代币,从而拉高代币的价格。uniswapPoolAddress本应该设置成pair合约的地址,但却指定成了其他地址,原因可能是管理员忘记,也可能是后门。
复现
向pair合约发送其现有werx存量的100倍,调用skim函数,将to地址设置为uniswapPoolAddress
最终获利174786100489116297833,复现成功:
Uwerx复现链接
后续
目前约176 ether的资产仍然在攻击者0x6057A831D43c395198A10cf2d7d6D6A063B1fCe4的地址上:
Uwerx项目方同意攻击者保留20%资产。
- END -
原文始发于微信公众号(ChaMd5安全团队):werx事件分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论