OKLink:2023年7月安全事件盘点
迁移函数缺少关键参数校验,致使Team Finance损失1450万美元
一、项目背景
Team Finance可以为项目方提供代币锁仓服务,并且支持 Uniswap V2的LP token向 Uniswap V3 进行转移。由于其LP Token转移函数,输入参数校验逻辑出现问题,黑客可通过创建攻击Token并进行锁仓,获得转移LP代币的权限,从而将其他LP 代币进行转移。但转移过程中,通过控制输入参数,只将1%的Uniswap V2 LP 代币迁移到Uniswap V3,其余代币被返还给攻击者,从而实现了攻击。
二、安全事件综述
受到攻击的项目方 Uniswap V2 池子有:
CAW:$11.5M
TSUKA:$1.7M
KNDX:$0.7M
FEG:$1.9M
攻击地址:0x161cebb807ac181d5303a4ccec2fc580cc5899fd
攻击合约:0xcff07c4e6aa9e2fec04daaf5f41d1b10f3adadf4
攻击交易:0xb2e3ea72d353da43a2ac9a8f1670fd16463ab370e563b9b5b26119b2601277ce
三、攻击分析
Step1:
攻击者通过Team Finance的Proxy合约输入攻击参数:
- 准备盗取资金的对象:即需要迁移的币对 FEG-WETH
- 而取回的币对却是黑客创建的无价值的token0: 0x2d4abfdcd1385951df4317f9f3463fb11b9a31df 和 有价值的token1: WETH
两者的不一致是导致该合约被攻击的根本原因!
在这一步中,黑客首先通过lockToken锁仓攻击token,lockedToken变量会记录锁仓详细信息,其中关键字段为withdrawAddress,该字段存在可以满足后续migrate的权限判断。
Step2:
由于上述LP和输入参数的token不匹配,且 noLiquidity 参数为 true,所以会在 Uniswap V3 中创建一个 token0 和 WETH 的流动性池
Step3:
Uniswap V3调用v3Migrator.migrate方法,迁移FEG-WETH流动性对。
在这一步中,Uniswap V3 Migrator合约在接收到Team Finance中传入的参数,会迁移 Uniswap V2的LP,燃烧LP,获取底层资产$FEG和$WETH,根据转换参数只有1%进入V3 pool,其余99%退还给发送合约,Team Finance将返回到token(601个ETH)发送给攻击合约。
黑客调用 Team Finance 得合约进行LP迁移,利用 Step 1 中准备好的withdrawAddress和msgSender吻合,通过权限检查。
由于Team Finance的迁移逻辑没有检验交易id与migrate params的相关关系,黑客通过上面校验后,真正迁移的是黑客输入的params参数,该参数指定的migrate为与黑客锁仓token无任何关系的FEG-WETH交易对,且迁移数量为 Team Finance 持有的全部LP(FEG-WETH),但参数指定只migrate 1%。
Step 4:
此外,相同手法对其它3个流动性池进行了攻击:
四、小结
截至目前,黑客地址已经返还涉事的四种Token以及$ETH和USDC到相关项目方,共计约1340万美元。
此次攻击事件,漏洞本质原因是对输入参数的校验逻辑有问题。黑客通过锁仓毫无价值的token,获取了调用migrate接口的权限。进一步调用Uniswap V3的migrate的参数,完全由黑客输入,导致可以从其合约内迁移其他LP资产,结合Uniswap V3的migrate处理是首先燃烧所有LP资产,再按照输入的percentage进行迁移,并返还剩余资产,使得黑客可以通过只迁移1%资产,从而窃取剩余99%的资产。