智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析

2023-09-15 11:23:45

智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析

2023 年 3 月 13 日上午 08:56:35 +UTC,DeFi 借贷协议 Euler Finance 遭遇闪电贷攻击。
Euler Finance 是一种作为无许可借贷协议运行的协议。其主要目标是为用户提供各种加密货币的借贷便利。这家总部位于英国的科技初创公司利用数学原理在以太坊和其他区块链网络上开发非托管协议,重点是实现高性能。
根据链上数据分析,攻击者已成功执行多笔交易,造成约 1.96 亿美元的盗窃,成为 2023 年迄今为止最大的黑客攻击。被盗资产包括价值数百万的 DAI、USDC、Staked Ether (StETH) 和 Wrapped Bitcoin (WBTC)。
被盗资产明细如下:

详细分析

由于 Etoken 的 donateToReserves 函数中缺乏流动性检查,所以可能会发生攻击。攻击者使用不同的货币执行多次调用以产生利润,导致六种不同代币的巨额损失 1.96 亿美元。目前,资金仍留在攻击者的账户中。
攻击者地址为:https://etherscan.io/address/0xb66cd966670d962c227b3eaba30a872dbfb995db
攻击者的合约地址为:https://etherscan.io/address/0x036cec1a199234fc02f72d29e596a09440825f1c
其中一项攻击交易可以在这里找到:https://etherscan.io/tx/0xc310a0affe2169d1f6feec1c63dbc7f7c62a887fa48795d327d4d2da2d6b111d

  1. 攻击者首先通过闪电贷向 Aave 借了 3000 万个 DAI,然后部署了两份合约:一份用于借贷,一份用于清算。
    image.png
  2. 攻击者随后调用 deposit 函数并向 Euler 协议合约质押 2000 万个 DAI,获得 1950 万个 eDAI 作为回报。
    image.png
  3. Euler Protocol 允许用户通过调用 mint 函数借入最多 10 倍于存款的资金。攻击者利用此功能借入了 1.956 亿个 eDAI 和 2 亿个 dDAI。
    image.png
  4. 攻击者调用 repay 函数,用闪电贷借来剩下的 1000wDai 来偿还债务,并销毁 1000 万 dDAI。然后他们再次调用 mint 功能借入 1.956 亿个 eDAI 和 2 亿个 dDAI。
    image.png
  5. 攻击者随后调用 donateToReserves 函数并捐赠了偿还债务所需金额的 10 倍,发送了 1 亿个 eDAI。然后他们调用 liquidate 函数启动清算过程,获得了 3.1 亿个 dDAI 和 2.5 亿个 eDAI。
    image.png
  6. 攻击者调用了 withdraw 函数,获得了 3890 万个 DAI,用来偿还闪电贷借来的 3000 万个 DAI。他们从这次攻击中获利 887 万 DAI。
    image.png

核心漏洞

首先,让我们看一下 donateToReserves 函数,这是用户容易被清算的地方。
image.png
对比下图中的 donateToReserves 函数和 mint 函数,我们可以看到 donateToReserves 函数中少了一个关键步骤 checkLiquidity。
image.png
接下来,我们跟进检查了 checkLiquidity 的实现。我们发现了 Call InternalModule 函数,它调用 RiskManager 来检查并确保用户的 Etoken > Dtoken。
image.png
每次操作都需要检查用户的流动性,调用 checkLiquidity。
但是 donateToReserves 函数不执行这个操作,让用户先通过协议的某些函数让自己处于清算状态,然后完成清算。

关于攻击的官方更新

Euler Finance 已在其官方推特(@eulerfinance)上确认了此次攻击,并表示他们目前正在与安全专业人员和执法部门合作解决该问题。
image.png
Euler Finance 最近更新了他们为协议用户收回资金的努力。他们概述了自攻击发生以来他们采取的几项行动,包括通过禁用 EToken 模块来尽快停止直接攻击,该模块阻止了存款和易受攻击的捐赠功能。
此外,他们还与各种安全组织合作,例如 TRM Labs、Chainalysis 和更广泛的以太坊安全社区,以协助调查和追回资金。Euler Finance 还与美国和英国的执法部门共享信息。
最后,该公司试图联系攻击者以了解更多有关潜在恢复选项的信息。
image.png

结论

最近针对 Euler Finance 协议的攻击凸显了实施严格安全措施的重要性,例如进行彻底审计和定期检查漏洞。
随着去中心化金融生态系统的不断发展,项目必须优先考虑用户资金的安全并采用最佳实践来降低未来类似攻击的风险。

更多推荐

什么情况下使用微服务?

单体架构图参考网络:1.什么是单体应用单体应用就是将应用程序的所有功能都打包成一个独立的单元,最终以一个WAR包或JAR包存在,没有外部的任何依赖,里面包含DAO、Service、UI等所有的逻辑。优点:1.便于开发:只需要借助IDE的开发,调试功能即可。2.易于测试:只需要通过单元测试或浏览器即可完成测试。3.易于部

前端实现符合Promise/A+规范的Promise

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录介绍:Promise/A+规范简介1.Promise的三种状态:2.状态转换:3.Promise的基本方法:4.错误冒泡和异常传递:实现Promise步骤1:创建Promise构造函数步骤2:初始化Promis

Redis 数据一致性方案的分析与研究

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~一般的业务场景都是读多写少的,当客户端的请求太多,对数据库的压力越来越大,引入缓存来降低数据库的压力是必然选择,目前业内主流的选择基本是使用Redis作为数据库的缓存。但是引入缓存以后,对我们系统的设计带来了很大的挑战,其中缓存和数据库的

Docker下如何实现Docker Compose?

Docker下如何实现DockerCompose?背景介绍DockerComposeDockerCompose的实现细节docker-compose.ymlDockerCompose的操作和命令DockerCompose在应用开发中的应用背景介绍在云原生时代,容器化技术成为现代应用开发和部署的主流选择。Docker作为

【腾讯云 Cloud Studio 实战训练营】通过云IDE构建Web3项目

文章目录背景一、前言二、CloudStudio主要功能三、CloudStudio实验前期准备3.1.注册平台四、构建Web3项目项目中技术栈五、其他功能演示六、常见问题及注意事项七、总结八、相关链接​CloudStudio是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用Clou

CISSP一次通过指南(文末附福利)

CISSP相关资料(考试机构的复习题、中英文教材,思维导图),点击文章末尾卡片,扫描二维码加我耗油免费领取资料哦,👇CISSP英文全称:“CertifiedInformationSystemsSecurityProfessional”,中文全称:“(ISC)²注册信息系统安全专家”,由(ISC)²组织和管理,是目前全

鉴源实验室 | 系统逻辑漏洞挖掘实践

作者|林海文上海控安可信软件创新研究院汽车网络安全组来源|鉴源实验室社群|添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”01前言当谈及安全测试时,逻辑漏洞挖掘一直是一个备受关注的话题,它与传统的安全漏洞(如SQL注入、XSS、CSRF)不同,无法通过WAF、杀软等安全系统的简单扫描来检测和解

ECMAScript 6 入门 - 字符串的新增方法

1.String.fromCodePoint()ES5提供String.fromCharCode()方法,用于从Unicode码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符。String.fromCharCode(0x20BB7)//"ஷ"上面代码中,String.fromCharCode()不能识别

什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?

聚沙成塔·每天进步一点点⭐专栏简介⭐什么是虚拟DOM(VirtualDOM)?⭐虚拟DOM在前端框架中的作用⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录1、模拟实现qsort函数1.1、qsort函数的回顾1.2、模拟实现qsort函数2、指针和数组笔试题解析2.1、一维数组2.2、字符数组1、模拟实现qsort函数1.1、qsort函数的回顾要模拟实现qsort函数,就要了解清楚qsort函数的参数以及使用方式。我们先回顾一下qsort函数:qsort是一个库函

Go 基础语法 轻松上手 goland~

一个GO代码,hello,world说到学习语言,那必然少不了我们的helloworld了,先来看个简单的helloworld代码packagemainimport"fmt"funcmain(){fmt.Println("hello,world")}第一行代码packagemain定义了包名。你必须在源文件中非注释的第

热文推荐