重入攻击(Reentrancy Attack)是什么?智能合约为什么会被“反复提款”?
重入攻击至今依然在发生,虽然相比早期Defi狂野时代频率有所下降,但它仍然是智能合约领域最经典、最顽固的安全风险之一,就在2025年7月知名衍生品协议GMX就因重入漏洞损失约4200万美元,其他中小型攻击也时有发生,重入攻击并没有彻底消失,只是随着开发者安全意识提升,它变得更加“隐蔽”。那么重入攻击是什么?为什么这么危险?

重入攻击:像“银行柜员被骗反复取钱”
想象你去银行取钱,正常流程应该是,柜员查你账户余额 → 确认够钱 → 给你钱 → 扣除余额。
但如果柜员先给你钱,再扣余额,而且在这个过程中,你的朋友突然冲进来喊“再给我取一次!”,柜员又去查余额(这时还没扣),于是又给你朋友钱……这样反复操作,直到银行发现余额不对为止。

重入攻击就是这个原理在区块链上的翻版
智能合约在处理“转账”时,如果先把钱转出去(外部调用),再更新账户余额,攻击者就能利用这个时间差,反复调用同一个取钱函数,把合约里的钱一次又一次“取走”,整个过程全靠智能合约的自动执行,几秒钟内就能完成,普通用户根本来不及反应。
重入攻击(Reentrancy)是指智能合约在执行外部调用时,攻击者利用控制流重新进入原函数,在状态变量尚未更新前重复执行逻辑,从而重复提取资产
自动取款机出了Bug
把Defi协议想象成一台智能ATM机,你输入“取100元”→ ATM先吐出100元给你 → 然后才在系统里扣掉你的余额,如果你有个“恶意朋友”(攻击者合约),它在拿到钱的那一刻立刻又喊“再取100元”,ATM因为还没扣余额,就又吐钱……循环往复,直到ATM里的钱被掏空,这就是重入攻击的核心漏洞,外部调用发生在状态更新之前。
为什么重入攻击这么可怕?
【损失巨大】
历史上最著名的就是2016年The DAO攻击,损失约6000万美元ETH,直接导致以太坊硬分叉(诞生了ETH和ETC)。
【攻击成本低】
攻击者通常不需要自己出很多本金,有时结合闪电贷就能零成本操作。
【隐蔽性强】
很多时候合约看起来正常,只有专业审计才能发现。
普通用户怎么预防重入攻击?
好消息是,大多数重入攻击针对的是Defi协议本身,而不是直接偷你个人钱包里的资金,但作为普通用户,你依然可以做好以下防护,优先选择Aave、Uniswap、Compound等老牌、经过多次审计的头部协议,避免参与新上线、高收益诱惑明显的小项目,同时养成良好习惯,开启2FA双重验证、优先使用硬件钱包,不要随意给陌生合约进行无限授权,并定期用Revoke.app等工具检查和撤销授权,此外参与Defi时要保持警惕,不要把所有资产All in一个协议,分散风险,看到异常高的APY时多问一句“是不是有风险?
项目方/开发者怎么防?
主流防御方式有,Checks-Effects-Interactions模式,先更新状态,再进行外部调用,或使用ReentrancyGuard(OpenZeppelin提供的防护锁),重要函数添加互斥锁,防止被反复调用。






