让黑客有了可乘之机?
2022年4月2日,成都链安链必应-区块链安全态势感知平台舆情监测显示,Gymdefi的LiquidityMigrationV2合约遭受黑客攻击,黑客获利约1,327 WBNB。成都链安技术团队第一时间对事件进行了分析,结果如下。
#1 事件相关信息
攻击交易:
0xa5b0246f2f8d238bb56c0ddb500b04bbe0c30db650e06a41e00b6a0fff11a7e5
攻击者地址:
0x74298086c94dab3252c5dac979c9755c2eb08e49
攻击合约:
0x4e284686fbcc0f2900f638b04c4d4b433c40a345
被攻击合约:
0x1befe6f3f0e8edd2d4d15cae97baee01e51ea4a4
#2 攻击流程
1. 攻击者首先从Tornado中提取0.99655 BNB。
2. 攻击者部署攻击合约后,首先从WBNB-BUSD (0x58f8...dc16)交易池中借贷2,400 WBNB到攻击合约中为后续攻击步骤做准备。
3. 接着在GYM-WBNB(0x8dc0...91db)交易池中将600 WBNB 兑换成 5,942,069.12 GYM,然后添加1730 WBNB和140W GYM到GYM-WBNB交易池中获得46,106.30 LP代币。
4. 完成流动性添加后,攻击者通过攻击合约调用LiquidityMigrationV2合约中的migrate函数进行迁移。由于LiquidityMigrationV2合约迁移时未查询GYM和GYMNET代币实际价格,移除流动性返回的GYM数量直接作为添加流动性的GYMNET数量传入,攻击者成功将46,106.30 LP(GYM-WBNB)代币换成了44,760.25 LP(GYMNET-WBNB)代币。
5. 之后再移除流动性,将获得的1,166,737.57 GYMNET兑换成WBNB。最后归还闪电贷,并将本次攻击所得约1,327 WBNB发送给自身地址。
#3 漏洞分析
本次攻击主要利用了LiquidityMigrationV2合约中代币兑换设计漏洞,合约中的migrate函数在进行迁移时,将GYM-WBNB交易池移除流动性时返回的数据直接作为了GYMNET-WBNB交易池中添加流动性时的参数。
攻击者通过闪电贷借贷大笔资金后,恶意控制了GYM-WBNB交易池中的GYM和WBNB的比例。然后调用migrate函数,将1,400,000 GYM兑换为1,166,737.57 GYMNET。根据攻击发生时的GYM和GYMNET价格,GYM和GYMNET的比例约为130:1。
根据合约中的交易情况可以看出,合约似乎在9天前就已经停止使用了。但是合约中仍存留大量的GYMNET代币,这正好给了攻击者可乘之机。
#4 资金追踪
截止发文时,被盗资金还未被攻击者转出,1,327 WBNB仍在攻击地址中:
针对本次事件,成都链安在此建议:
1. 合约开发时,依赖外部合约数据的合约必须要做好数据的校验,防止恶意数据对合约造成危害。2. 项目上线前,一定要选择专业的安全审计公司进行全面的安全审计,规避安全风险。3. 项目运行时,管理人员一定要做好项目状态的监控,合约弃用或出现异常时一定要及时将资金转移到安全的地址上。