经典再现|详解Cream.Finance的ERC777重入攻击

  • 8月30日,Cream.Finance因AMP代币兼容性问题遭到ERC777重入攻击,攻击者通过17笔交易获利1,880万美元
  • 攻击流程:
    1. 攻击者通过闪电贷借入500 WETH并质押至Cream.Finance
    2. 利用ERC777特性在未更新用户状态时重复借贷,获取355 ETH
    3. 通过创建第二个合约转移资产并清算首个合约,套取9,068.6 crETH
    4. 最终归还闪电贷后净获利
  • 漏洞根源:代币交换时未遵循"先扣除后转账"原则,且多合约交互存在系统性风险
  • 防御建议:
    • 严格实施代币交换的原子操作顺序
    • 加强多协议组合时的风控审计
    • 采用更安全的代币标准替代ERC777
总结

8 月 30 日,Cream.Finance 遭到重入攻击,PeckShield「派盾」第一时间预警并定位。

由于 AMP 支持类似 ERC-777 的代币标准,而它的特性与某些协议不相兼容,此次 Cream.Finance 的重入攻击正是操纵了此漏洞。

攻击者总共发起来 17 笔攻击交易, PeckShield「派盾」简述其中一笔交易的攻击过程:

首先,攻击者创建攻击合约 A,从 UniSwap V2 中借出闪电贷 500 WETH;

第二步,攻击者将所借 500 WETH 质押到到 Cream.Finance,获得 24,172.2 crETH;

第三步,攻击合约 A 利用第二步所获得的质押物,通过函数 CErc20Delegator.borrow() 借出 1,948 万 AMP。同时,利用重入漏洞,在用户的信息未更新前,又借出 crETH 代币,获得 355 ETH。

第四步,攻击者创建攻击合约 B,并将 974 万 AMP 代币从攻击合约 A 转入攻击合约 B 中。因为第三步的重入攻击,使得攻击合约 A 已经资不抵债。所以攻击者利用攻击合约 B 中的 974 万 AMP,清算了攻击合约 A,并获得 9,068.6 crETH。

第五步,攻击合约 B 赎回 9,068.6 crETH,获得 187.58 ETH;此时,合约 B 的 balanceof() 为 187.58 WETH;

第六步,合约 B 将 187.58 WETH 转给合约 A,并调用函数 selfdestruct();合约 A 的余额为 542.58 ETH;

最终,攻击者归还闪电贷,获利 1,880 万美元。

PeckShield

防御方法

在进行代币交换的时候,先扣除用户的代币,再将 ETH 发送给用户。

多个合约进行交互的时候需要考虑 DeFi 业务组合可能存在的系统性风险问题,平台方不仅要确保在产品上线前有过硬的代码审计和漏洞排查,还要在不同产品做业务组合时考虑因各自不同业务逻辑而潜在的系统性风控问题。

阅读原文

分享至:

作者:PeckShield

本文为PANews入驻专栏作者的观点,不代表PANews立场,不承担法律责任。

文章及观点也不构成投资意见

图片来源:PeckShield如有侵权,请联系作者删除。

关注PANews官方账号,一起穿越牛熊
推荐阅读
4小时前
5小时前
6小时前
7小时前
8小时前
8小时前

热门文章

行业要闻
市场热点
精选读物

精选专题

App内阅读