m mybian.xyz
mybian.xyz · TIMES
All The News, Wisdom & Knowledge
VOL. MMXXVI · mybian.xyz · ru-men-zhong-ru-gong-ji
特别报道 · SPECIAL REPORT

入门重入攻击:从原理到防御的智能合约安全第一课

入门重入攻击是理解智能合约安全的必修课。本文系统讲解重入攻击是什么、攻击机制、复现步骤、危害与防御手段,并附常见问题与风险提示,帮助开发者建立基础安全意识。

发布于 2026-05-24T06:50:42.959408+00:00更新于 2026-06-10T23:49:48.757788+00:00
入门重入攻击 - 入门重入攻击:从原理到防御的智能合约安全第一课
图:本报记者摄 · 关于「入门重入攻击:从原理到防御的智能合约安全第一课」的视觉记录

什么是重入攻击

重入攻击(Reentrancy Attack)是以太坊及兼容 EVM 链上最经典、危害最大的智能合约漏洞之一。它的核心在于:当一个合约在完成内部状态更新之前,向外部地址转账或调用外部合约,而被调用方可以在这个"中途时刻"反过来再次进入原合约的同一函数,从而绕过本应生效的余额检查,反复提取资金。

对于刚接触合约安全的人来说,理解重入攻击是绕不开的一关。无论你是在做 Solidity安全GitHub 类型的代码审计,还是跟着 OpenZeppelin使用实战教程 学习安全库,重入攻击都是第一个被反复强调的案例。2016 年著名的 The DAO 事件正是因为重入漏洞,导致约 360 万枚以太币被转移,间接促成了以太坊的硬分叉。

重入攻击的机制原理

要理解机制,需要先了解 EVM 中转账的特性。当合约用 call 向某个地址转账以太币时,如果对方是合约地址,它的 receivefallback 函数会被自动触发。这就给了攻击者插入恶意逻辑的机会。

一段典型的有漏洞的提现函数往往是这样的顺序:先检查用户余额、再向用户转账、最后才把余额清零。问题就出在"先转账后清零"。当转账触发攻击合约的回调时,余额还没被清零,攻击合约便再次调用提现函数,检查依然通过,于是又一次转账,如此循环直到把合约资金抽干。

这种"外部调用先于状态更新"的模式,是几乎所有重入漏洞的共同根源。无论合约用什么语言写,哪怕你在学习 Rust合约入门指南BSC合约开发教程,只要存在跨合约调用,就需要警惕同样的逻辑陷阱。

复现一次攻击的基本步骤

想真正掌握重入攻击,动手复现是最有效的方式。可以在 Remix IDE新手入门 提供的在线环境中搭建实验:

第一步,部署一个存在漏洞的"金库"合约,允许任意地址存款和提现。第二步,编写一个攻击合约,它在 fallback 函数里再次调用金库的提现函数。第三步,攻击合约先正常存入一小笔资金,再发起第一次提现。第四步,观察金库转账如何触发攻击合约的回调,进而递归提现,直至金库被掏空。

如果想在本地而非浏览器中实验,也可以参考 Geth新手入门 搭建私有链节点,或借助 Alchemy开发教程Infura新手入门 提供的测试网节点来部署调试,过程会更接近真实环境。

防御重入攻击的核心方法

防御重入并不复杂,关键是养成正确的编码习惯。主流做法有三类:

其一是"检查—生效—交互"(Checks-Effects-Interactions)模式,即先做条件检查,再更新合约内部状态(比如先清零余额),最后才执行外部调用。这样即使被重入,余额检查也会失败。

其二是使用重入锁(如 nonReentrant 修饰符),在函数执行期间设置一个标志位,阻止同一函数被嵌套调用。许多安全库都提供了现成实现,对照 OpenZeppelin使用实战教程 即可快速接入。

其三是优先使用 transfer 这类有 gas 限制的转账方式,限制被调用方可执行的逻辑量。不过随着 EVM 的演进,这一手段已不再被单独依赖,更推荐与前两种结合。

优势认知与风险提示

理解重入攻击的最大"优势"在于,它能帮助开发者建立"外部调用即风险边界"的安全直觉。这种直觉会迁移到跨链桥、预言机调用等更复杂的场景,比如你在研究 The Graph新手入门 索引数据或对接 Oracle 入门教程 中的喂价合约时,同样需要警惕外部调用带来的不确定性。

但必须提醒的是:重入攻击只是众多漏洞中的一种,修复了重入并不意味着合约就安全。整数溢出、权限控制缺陷、闪电贷价格操纵等问题同样致命。安全审计是一项系统工程,单点防御远远不够。本文仅作技术科普,不构成任何投资或部署建议,真实资金合约上线前务必经过专业审计。

常见问题

问:只有提现函数才会被重入吗? 答:不是。任何在更新状态前进行外部调用的函数都可能成为目标,包括奖励领取、跨合约结算等。

问:用了重入锁就绝对安全吗? 答:重入锁能防同函数重入,但跨函数、跨合约的"只读重入"等变体仍需额外注意,安全意识不能松懈。

问:新手该从哪里继续深入? 答:建议结合 私钥生成中文文档 理解账户模型,再通过 EVM新手入门 打牢底层执行原理,循序渐进地构建完整的安全知识体系。