EVM 漏洞案例是合约开发者最值得研究的素材。每一次重大安全事件背后,往往不是单一 bug,而是一整套设计上的疏漏。理解经典案例的根因与防御要点,比记忆漏洞名称更有价值。本文复盘几类典型事件,并给出相应的防御建议。
重入漏洞:经典中的经典
最著名的重入事件让一个早期 DAO 损失惨重,问题在于先转账后修改状态的代码顺序。重入攻击的本质是外部合约在第一次调用返回之前再次进入相同函数,借助未更新的状态实施套利。防御的关键是 checks-effects-interactions 模式与 ReentrancyGuard。延伸阅读 EVM安全审计。
整数溢出:旧版 Solidity 的隐藏陷阱
在 Solidity 0.8 之前,整数运算默认不检查溢出。许多代币合约因此被攻击者通过特定参数让余额溢出,导致大量代币凭空增发。即使在 0.8 之后,开发者在 unchecked block 中仍要谨慎处理。可参考 EVM最佳实践 中的数值处理章节。
delegatecall 滥用与代理合约劫持
delegatecall 在代理合约中是必需操作,但若实现合约的初始化逻辑暴露给任何人调用,攻击者就能借机劫持代理。多个真实项目因此失去对代理合约的控制权。防御要点是把 initialize 函数严格限制为一次性调用,并使用 OpenZeppelin 等经过审计的代理库。详见 EVM调试方法。
94 赞同