攻击⽅法:
迁移合约少了两个验证:
未验证迁移者就是交易发起者,导致任意⼈都可以替别⼈进⾏迁移。
未验证参数中的两种代币和Pair为真实的。导致攻击者可以伪造token0、token1及Pair的⽅式进⾏攻击。
攻击者⾸先通过真实的pair和假的token0,token1,调⽤迁移合约的迁移函数,将⽤户的LP燃烧后的资产留在合约中,⽤户添加的只是两种假代币组成LP池。然后攻击者再通过真实的token0,token1及假的LP,调⽤迁移合约的迁移函数,将第⼀步留在合约中的资产添加为⾃⼰的LP。
这样通过狸猫换太⼦的⽅式将⽤户的资产替换成假的LP资产,⽽真实的LP资产添加到了攻击的的LP中。
所有相关地址⼀览
攻击者: 0xe3aeede563bc6a72dc881755cc98dc57fadf30f6
攻击合约:0x2a825a174c3125923881d33e922c7a5e56c9b833
受害者: 0x5bf1d91ee070a8e8b8f4d1810bb43bc201f8a276
LP 合约:0x5dc30bb8d7f02efef28f7e637d17aea13fa96906
迁移合约 0x839b0afd0a0528ea184448e890cbaaffd99c1dbf
代币XRP:0x1D2F0da169ceB9fC7B3144628dB156f3F6c60dBE
代币WBNB: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
新LP管理器:0x24Ba8d2A15Fe60618039c398Cf9FD093b1C1FEB5
假代币A: 0x43a0e0f079aec79bcd200170c65b06bef3996b65
假代币B: 0xcb02d1dcf608c42fb6ac8c63817cfa14da0b3f57
BiswapFactoryV3:0x7c3d53606f9c03e7f54abddffc3868e1c5466863
新Pool: 0x577BA33be1D7a8E889B999125eFbe0165cdE40e8
其中⼀笔攻击交易:0xa6cc4b18dea57fae6e1d63d493d2bfb4fd07e86a1ab7f545f9c7980d897d7a6c
攻击交易简要过程:
1、攻击者调⽤攻击合约
2、攻击合约查询受害者 LP 余额,及对迁移合约的授权情况
3、攻击合约调⽤迁移合约的migrate函数
4、migrate函数正常⼯作,将受害者的LP转⾄并burn
6、migrate函数调⽤LP管理器添加LP(因为代币是假的,所以真实代币并未添加)
7、migrate函数,内返还代币给⽤户(也是假的)
8、攻击合约查询LP真实代币token0和token1
9、攻击合约调⽤ BiswapFactoryV3 的 Pool函数进⾏查询,得到0地址(三种费率都是0)
10、查询得到第四种fee率的地址,也就是新Pool
11、攻击合约查询两种真实token在迁移合约中的余额(前⾯受害者 burn 部分)
12、 攻击合约再次调⽤ migrate 函数。这次使⽤假的LP,但是使⽤真实的token.其实假的LP就是攻击合约本身。
因为合约中已经有上次受害者的两种代币了。指定接收者为⾃⼰。因此可以将合约中的资产偷⾛。
来源:金色财经