资产与安全
安全终极
重入攻击与智能合约状态回退
Smart Contract Reentrancy Attacks & CEI Pattern
所属核心领域
资产与安全
认知学习难度
安全终极
常用关联别名
重入攻击, Reentrancy, The DAO, Checks-Effects-Interactions, 合约漏洞
权威审校
数链库事实核查组
一分钟核心速览
黑客利用智能合约在向外部账户转账时交出代码执行控制权的漏洞,在合约更新内部账本余额之前,递归循环反向再次调用提款函数,瞬间搬空合约全部资产的经典漏洞。
通俗白话大比方(如果给零基础小白解释)
你去银行柜台取走账户里仅有的 100 块钱。柜员的操作顺序出现严重致命失误:他‘先把 100 块现金递给你,然后再低头在电脑里把你的账户余额改成 0’。就在柜员把钱递到你手里的那一瞬间(合约控制权转移),你像按下暂停键一样闪电般对柜员大喊:‘我还要取 100 块!’柜员抬头一看电脑,发现你的账户余额还没被扣除依然显示有 100 块,于是又递给你 100 块!你以毫秒级速度递归重复喊了 10,000 次,柜台里的上百万现金被你彻底搬空,最后柜员才终于低头在电脑里只扣除了一次余额。当年的以太坊 The DAO 大盗就是用这个手法把以太坊逼入了硬分叉绝境。
技术底层深度运作机制
1. 控制权移交机制(Fallback / Receive Hooks):向外部合约地址调用 .call{value: amount}("") 时,自动激活接收方合约的 fallback 函数并重新获得 CPU 调度;
2. 违背检查-生效-交互原则(Checks-Effects-Interactions):错误代码在执行跨合约转账(Interaction)后才扣减余额状态变量(Effect),导致重入判定依然合法;
3. 现代防范标准:采用 OpenZeppelin 的 nonReentrant 互斥锁修饰器,并在任何外部调用发生前优先将内部账本清零。
2. 违背检查-生效-交互原则(Checks-Effects-Interactions):错误代码在执行跨合约转账(Interaction)后才扣减余额状态变量(Effect),导致重入判定依然合法;
3. 现代防范标准:采用 OpenZeppelin 的 nonReentrant 互斥锁修饰器,并在任何外部调用发生前优先将内部账本清零。
实操避坑:三大致命安全红线
- 只用 transfer() 不能高枕无忧:虽然 transfer 限制了 2300 Gas 防止复杂重入,但由于以太坊操作码 Gas 成本持续变动,该方法已被官方列为弃用过时标准;
- 跨函数重入与跨合约只读重入(Read-Only Reentrancy):现代变种攻击不再重入同一个提款函数,而是重入另一个读取未结算价格状态的预言机函数,极难排查;
- 未经严密第三方代码审计与形式化验证的新 DeFi 协议,切勿盲目充入重金充当做市小白鼠。
常见高频问答 (FAQ)
Q 现代成熟的去中心化借贷协议还会发生重入攻击吗?
A
单一合约的经典重入已被绝大多数框架彻底免疫,但由多个复杂协议(如 DEX、借贷与跨链桥)组合产生的‘只读重入’仍然是黑客当前最频繁下手的重灾区。