智能合约安全分析,Vyper 重入锁漏洞全路径分析

news2025/4/7 0:17:12

智能合约安全分析,Vyper 重入锁漏洞全路径分析

事件背景

7 月 30 日 21:10 至 7 月 31 日 06:00 链上发生大规模攻击事件,导致多个 Curve 池的资金损失。漏洞的根源都是由于特定版本的 Vyper 中出现的重入锁故障。

攻击分析

通过对链上交易数据初步分析,我们对其攻击的交易进行整理归纳,并对攻击流程进一步的分析,由于攻击涉及多个交易池。
pETH/ETH 池子被攻击交易:
https://etherscan.io/tx/0xa84aa065ce61dbb1eb50ab6ae67fc31a9da50dd2c74eefd561661bfce2f1620c
msETH/ETH 池子被攻击交易:
https://etherscan.io/tx/0xc93eb238ff42632525e990119d3edc7775299a70b56e54d83ec4f53736400964
alETH/ETH 池子被攻击交易:
https://etherscan.io/tx/0xb676d789bb8b66a08105c844a49c2bcffb400e5c1cfabd4bc30cca4bff3c9801
CRV/ETH 池子被攻击交易:
https://etherscan.io/tx/0x2e7dc8b2fb7e25fd00ed9565dcc0ad4546363171d5e00f196d48103983ae477c
https://etherscan.io/tx/0xcd99fadd7e28a42a063e07d9d86f67c88e10a7afe5921bd28cd1124924ae2052
由于其攻击流程基本一致所以我们主要对其中 pETH/ETH 池子 攻击交易进行详细的分析:
0xa84aa065ce61dbb1eb50ab6ae67fc31a9da50dd2c74eefd561661bfce2f1620c
交易由 0x6ec21d1868743a44318c3c259a6d4953f9978538
调用攻击合约 0x9420F8821aB4609Ad9FA514f8D2F5344C3c0A6Ab ,并由该合约创建一次性攻击合约
0x466b85b49ec0c5c1eb402d5ea3c4b88864ea0f04,并通过在一次性攻击合约的构造函数中进行接下来的攻击流程;
image.png

攻击者通过闪电贷从 Balancer 处获取 80,000 WETH ,并将其通过合约全部提取为 ETH。
image.png

随后立即向 Curve 的 pETH/ETH 池提供了 40000 ETH 流动性,并收到了约 32,431.41 个 pETH-ETH LP Token
image.png

随后在攻击合约中调用移除流动性函数,但在其合约函数调用栈中我们可以看出,该合约在执行移除流动性时又返回调用了合约本身的回退函数,并在回退函数中又调用了交易对的添加流动性操作。
image.png

根据 pETH/ETH 交易对合约源码分析,其中在转账时使用合约的回退函数再次调用该合约,此处发生合约重入,但该 LP 合约添加流动性以及移除流动性都有使用重入锁,如下图所示:
image.png

但实际调用栈中还是发生了重入了,导致后续通过攻击者合约又一次向 LP Token 添加了 40,000 ETH 并获取了约 82,182.76 个 pETH/ETH Lp Token, 并在攻击合约的回调函数结束继续移除最开始添加的 32,431.41 pETH/ETH Lp Token 获得了约 3,740.21 pETH 和 34,316 ETH。
image.png

随即又调用移除流动性函数,移除约 10,272.84 pETH/ETH LP Token 获得约 1,184.73 pETH 和 47,506.53 ETH。
image.png

其剩余的 7 万多 pETH/ETH LP Token 依旧留在攻击者合约中,如下图:
image.png
接下来攻击者通过 Curve pETH/ETH 池将约 4,924.94 pETH 交换为的 4,285.10 ETH。

最后攻击者将约 86,106.65 ETH 兑换为 WETH,并向 Balancer 归还闪电贷资金 80,000 WETH,并将 获利资金约 6,106.65 WETH 转移至 0x9420f8821ab4609ad9fa514f8d2f5344c3c0a6ab 地址。
image.png

至此,针对 pETH/ETH 池子的攻击流程分析完毕,是一个很经典的重入获利操作,但是我们通过对被攻击合约的源码进行分析,其合约是存在相应的重入锁机制,正常来说可以防止重入操作,但是并没有拒绝攻击者的重入操作;
我们回顾一下 Vyper 中对重入锁的说明,知道了该重入锁实现是在函数起始部位使用指定的插槽存储是否锁定的操作。
image.png

我们将被攻击 LP 合约的字节码进行反编译查看:
https://library.dedaub.com/ethereum/address/0x466b85b49ec0c5c1eb402d5ea3c4b88864ea0f04/decompiled
image.png

可以看到其两个函数中存储重入锁的插槽并不一致,所以导致其重入锁失效,进而导致被攻击者利用进行获利。
Vyper 项目方官方也发推说明,其某些版本中确实存在重入锁故障。
image.png

通过对其 0.2.14 版本以及 0.2.15 版本对比,发现其在 Vyper 对应的重入锁相关设置文件 data_positions.py 中存在改动,其改动后的代码对重入锁的存储 key 进行单独设置,并且,每一个重入锁都会占用一个不同存储插槽,从而导致合约的重入锁功能不可用。

该错误已在 PR 中修复:#2439 和 #2514
其中修复了添加多个重入存储插槽的问题,详见下图:
image.png

事件总结

此次攻击事件涉及的攻击范围较广,其根本原因是因为智能合约的基础设施 Vyper 的 0.2.15、0.2.16、0.3.0 版本存在重入锁设计不合理,从而导致后期使用这些版本的项目中重入锁失效,最终遭受了黑客攻击。

  • 建议在项目开发时选择稳定的技术栈以及对应版本,并对项目进行严格的测试,防止类似风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/978876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高速人工智能无人机首次击败世界冠军赛车手

大学创造了第一个能够在无人机比赛中击败人类的自主系统。 周三,苏黎世大学和英特尔公司的一组研究人员宣布的他们开发了一个名为Swift的自主无人机系统,可以在第一人称视角下击败人类冠军(FPV)无人驾驶赛车。虽然人工智能以前在像国际象棋这样的游戏中击…

软件测试/测试开发丨建立质量保障体系,软件质量提升90%!原来是这个秘诀...

在现代软件开发领域,质量保障一直是备受争议的话题。关于测试角色在软件全流程中的价值、是否存在一套软件测试方法论以及如何衡量质量和效率的问题一直困扰着业界。为了能让大家更深入的学习质量保障体系,霍格沃兹测试开发学社邀请了大厂的资深测试经理…

modprobe命令及其与insmod depmod的区别

1. modprobe命令详解 modprobe工具可以智能的添加和删除一个模块,之所以说它智能,是因为它能够通过配置的一些预定义的规则解析出模块之间的依赖关系,并且自动加载依赖的模块。 modprobe会从 /lib/modules/uname -r目录中查找要加载的模块以…

Nginx从安装到使用,反向代理,负载均衡

什么是Nginx? 文章目录 什么是Nginx?1、Nginx概述1.1、Nginx介绍1.2、Nginx下载和安装1.3、Nginx目录结构 2、Nginx命令2.1、查看版本2.2、检查配置文件正确性2.3、启动和停止2.4、重新加载配置文件2.5、环境变量的配置 3、Nginx配置文件结构4、Nginx具体…

面向更大屏幕的片段

目前为止,只做过小屏幕设备运行应用。 本文中将创建灵活的用户界面,根据运行应用的设备让应用有不同的外观和行为。 之前我们创建了在手机上运行的Workout应用版本。但是在一个平板上运行这个应用时,应用的表现几乎是一样的。不过由于屏幕更大…

2023年数维杯数学建模A题河流-地下水系统水体污染研求解全过程文档及程序

2023年数维杯数学建模 A题 河流-地下水系统水体污染研 原题再现: 河流对地下水有着直接地影响,当河流补给地下水时,河流一旦被污染,容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染,这将严重影响工…

STM32 CAN快速配置(HAL库版本)

STM32 CAN快速配置(HAL库版本) 目录 STM32 CAN快速配置(HAL库版本)前言1 软件编程1.1 初始化1.1.1 引脚设置1.1.2 CAN参数设置1.1.3 CAN滤波器设置 1.2 CAN发送1.3 CAN接收 2 运行测试结束语 前言 控制器局域网总线(CA…

vscode debug python launch.json添加args不起作用

问题 为了带入参数调试python 程序,按照网上搜到的教程配置了lauch.json文件,文件中添加了"args": [“model” “0” “path”] {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: h…

恢复iTunes备份看这里,2招教你搞定!

iTunes除了是一款免费的数字媒体播放程序以外,苹果用户还可以借助iTunes对自己的iPhone进行全面的备份和恢复,并且在设备损坏或者数据,也能够帮助用户快速恢复数据。当您的数据意外丢失后,该如何从itunes备份中恢复数据呢&#xf…

Shell 运算符及语法结构

目录 一、Shell运算符 1.1 表达式expr 1.2 运算操作 1.3 操作实例 二、Shell条件判断 2.1 基本语法 2.2 值、权限、类型、多条件判断 三、Shell流程控制 3.1 if 流程语法 3.2 case 流程语法 3.3 for 流程语法 3.4 内部运算符 3.5 while循环流程语法 四、Shell读…

香港物流公司新世纪储运申请1125万美元美元纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,香港物流公司新世纪储运New Century Logistics (BVI) Limited,近期已向美国证券交易委员会(SEC)提交招股书,申请在纳斯达克IPO上市,股票…

865. 具有所有最深节点的最小子树(javascript)865. Smallest Subtree with all the Deepest Nodes

给定一个根为 root 的二叉树,每个节点的深度是 该节点到根的最短距离 。 返回包含原始树中所有 最深节点 的 最小子树 。 如果一个节点在 整个树 的任意节点之间具有最大的深度,则该节点是 最深的 。 一个节点的 子树 是该节点加上它的所有后代的集合…

【C++学习笔记】4、变量

文章目录 【 1、变量的定义 】【 2、变量的声明 】示例 【 3、左值和右值 】 变量:相当于是程序可操作的数据存储区的名称。在 C 中,有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型,类型决定了变量存储的大小和布局&am…

动态规划之简单多状态

简单多状态 1. 按摩师(easy)2. 打家劫舍II (medium)3. 删除并获得点数(medium)4. 买卖股票的最佳时机含冷冻期(medium)5. 买卖股票的最佳时机III(hard) 1. 按…

《人生苦短,我学Python》——条件判断->(if-elif-else)多向选择 条件嵌套

今天,我们来学习多向选择!if--elif--else if 后的语句是当 if 判断条件成立时,执行的操作。elif 后的语句是当 if 判断不成立时,再判断一次,如果成立,执行的操作。else 后的语句是当以上所有判断条件都不成…

数据库 设计规范数据库设计样例

目录 5 数据库5.1 数据库命名规范5.2 数据库字段命名5.2.1 字段命名规范5.2.2 命名规范5.2.3 待优化命名示例5.2.4 字段类型规范5.2.5数据库中每个字段的规范描述 5.3表设计5.4 参考设计5.4.1 应用场景5.4.2 需求分析5.4.3 设计思路5.4.4 表结构设计5.4.5 缓存策略Q1 冗余设计和…

含面试题 Redis 为什么这么快?深度解析性能的奥秘超级用心的图文版

面试题分享 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 史上最全文档AI绘画stab…

ICCV 2023|通过慢学习和分类器对齐在预训练模型上进行持续学习

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者介绍 张耕维 悉尼科技大学在读博士生,研究方向为持续学习 报告题目 通过慢学习和分类器对齐在预训练模型上进行持续学习 内容简介 持续学习研究的目标在于提高模型利用顺序到达的数据进行学习的…

【python基础知识】6.布尔值和四种语句(break、continue、pass、else)

文章目录 前言用数据做判断:布尔值两个数值做比较直接用数值做运算布尔值之间的运算 四种新的语句break语句continue语句pass语句else语句循环小练习 前言 Hi,你来了。 上一关我们学习了for循环和while循环,让我们复习回顾一下:…

学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下,设置不分频或者12分频∶Tips:选择不分频还是12分频2.3、定时器的工作模式…