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

智能合约安全分析,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.mzph.cn/news/70177.shtml

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

相关文章

Ubutnu允许ssh连接使用root与密码登录

文章目录 1. 修改sshd_config2. 设置root密码3. 重启SSH服务 1. 修改sshd_config 修改/etc/ssh/sshd_config文件,找到 #Authentication,将 PermitRootLogin 参数修改为 yes。如果 PermitRootLogin 参数被注释,请去掉首行的注释符号&#xff…

机器学习:基于梯度下降算法的逻辑回归实现和原理解析

这里写目录标题 什么是逻辑回归?Sigmoid函数逻辑回归损失函数梯度下降 逻辑回归定义逻辑函数线性组合模型训练决策边界 了解逻辑回归:从原理到实现什么是逻辑回归?逻辑回归的原理逻辑回归的实现逻辑回归的应用代码示例算法可视化 当涉及到二元…

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有:基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器(DSP)。 其中,C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…

SpingBoot整合Sa-Token框架(1)

一、文档参考:框架介绍 (sa-token.cc) 框架生态——开源项目 (sa-token.cc) 二、与SpingBoot整合 1、创建项目 在 IDE 中新建一个 SpringBoot 项目,例如:sa-token-demo-springboot(不会的同学请自行百度或者参考:Sp…

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer: 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版: https://github.com/donnemarti…

『C语言进阶』指针进阶(一)

🔥博客主页: 小羊失眠啦 🔖系列专栏: C语言 🌥️每日语录:无论你怎么选,都难免会有遗憾。 ❤️感谢大家点赞👍收藏⭐评论✍️ 前言 在C语言初阶中,我们对指针有了一定的…

合宙Air724UG LuatOS-Air LVGL API控件-页面 (Page)

页面 (Page) 当控件内容过多,无法在屏幕内完整显示时,可让其在 页面 内显示。 示例代码 page lvgl.page_create(lvgl.scr_act(), nil) lvgl.obj_set_size(page, 150, 200) lvgl.obj_align(page, nil, lvgl.ALIGN_CENTER, 0, 0)label lvgl.label_crea…

【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

文章目录 前言一、SpringDoc是什么?二、使用步骤1.引入库2.配置类3.访问测试 总结其他配置立个Flag 前言 之前常用的SpringFox在2020年停止更新了,新项目集成SpringFox出来一堆问题,所以打算使用更活跃的SpringDoc,这里简单介绍一…

Nomad 系列-快速上手

系列文章 Nomad 系列文章 Nomad 重要术语 Nomad 安装设置相关术语 agent - 代理。Agent 是在 Server(服务器) 或 Client(客户端) 模式下运行的 Nomad 进程。client - 客户端。Nomad 客户端负责运行分配给它的任务。它还向服务器…

centos编译升级cmake,痛苦的Linux小白

环境 root 用户 下载 cmake官网下载地址:https://cmake.org/download/ 获取下载地址,右击cmake-3.27.4.tar.gz 命令行输入链接地址,下载 wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4.tar.gz解压 tar -zx…

基于Pytest+Allure+Excel的接口自动化测试框架

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…

鼠标键盘管理 ShareMouse for Mac最新

软件“ShareMouse”允许您通过单个鼠标和键盘控制多台计算机: 将鼠标移动到您想要控制的计算机的监视器上,指针会神奇地跳转到该计算机。任何鼠标和键盘输入都会传输到相应的计算机。 与网络KVM类似,ShareMouse通过本地LAN传输鼠标移动和点…

【ARM AMBA5 CHI 入门 12 -- CHI 总线学习 】

文章目录 介绍CHI 特点Layers of the CHI architectureTopology Node TypeTransaction 分类Transaction 路由SAM 介绍Node ID 节点间数据怎么传输的呢? 介绍 CHI 的全称是 Coherent Hub Interface。所以从名字就能看出,CHI要解决什么问题了。按照惯例&a…

CentOS7安装时直接跳过了安装信息摘要页面的解决方法

最近在配置Hadoop虚拟机的时候,创建的centos7虚拟机在安装信息摘要时直接自动跳过,直接跳到设置用户名和密码,在重复多次的重新删除安装后发现了问题所在: 在进行到选择操作系统来源时,注意是否出现“该操作系统将使用…

【vue2第十五章】VueRouter 路由配置(VueRouter)与使用 和 router-link与router-view标签使用

单页面应用 与 多页面应用 单页面应用(Single-Page Application,SPA)和多页面应用(Multi-Page Application,MPA)是 Web 应用程序的两种不同架构方式。它们在页面加载和交互方式上有所区别。 单页面应用&a…

GitHub个人访问凭证在哪看

要查看 GitHub 个人访问凭证(Personal Access Token),请按照以下步骤进行操作: 登录到你的 GitHub 帐户。点击右上角的头像,然后选择 “Settings”(设置)。在左侧导航栏中,选择 “D…

iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac,但在本指南中,我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑,为什么Safari中没有明显的位置可以添…

【洛谷 P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题解(模拟+向量)

[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种石头剪刀布的升级版游戏。 升级版游戏在传统的石头剪刀布游戏的基础…

d435i 相机和imu标定

一、IMU 标定 使用 imu_utils 功能包标定 IMU,由于imu_utils功能包的编译依赖于code_utils,需要先编译code_utils,主要参考 相机与IMU联合标定_熊猫飞天的博客-CSDN博客 Ubuntu20.04编译并运行imu_utils,并且标定IMU_学无止境的…

函数栈帧(详解)

一、前言: 环境:X86Vs2013 我们C语言学习过程中是否遇到过如下问题或者疑惑: 1、局部变量是如何创建的? 2、为什么局部变量的值是随机值? 3、函数是怎么传参的?传参的顺序是怎样的? 4、形…