b bajsj.com
bajsj.com · TIMES
All The News, Wisdom & Knowledge
VOL. MMXXVI · bajsj.com · soliditylou-dong-an-li
特别报道 · SPECIAL REPORT

Solidity 漏洞案例总览:八类经典攻击与防御要点

以分类视角梳理 Solidity 历史上最有教育意义的漏洞案例,覆盖重入、整数溢出、权限失配、签名重放、价格预言机操纵等八类问题,提炼防御要点。

发布于 2026-05-24T06:12:19.577170+00:00更新于 2026-05-24T14:15:27.556875+00:00
Solidity漏洞案例 - Solidity 漏洞案例总览:八类经典攻击与防御要点
图:本报记者摄 · 关于「Solidity 漏洞案例总览:八类经典攻击与防御要点」的视觉记录

Solidity 漏洞案例总览

阅读漏洞案例是合约工程师的必修课。每一笔被盗的 ETH,背后都是一个具体设计错误的复盘。把它们整理成八类,你就拥有了完整的漏洞字典。无论是评估 Binance 上挂牌的新代币,还是审查自己项目的代码,这份字典都能让你迅速锁定可疑模式。

一、重入攻击

代表事件:The DAO(2016)、Cream Finance(2021)、Curve(2023 只读重入)。攻击者利用合约在外部调用后未完成状态更新的窗口,反复触发同一函数。

防御要点:严格 Checks-Effects-Interactions 顺序,加 nonReentrant 修饰器,必要时用 transient storage 做更便宜的重入锁。还应检查跨函数重入与只读重入。0.8.24 新引入的 tstore/tload 让重入保护几乎零成本。

二、整数溢出与下溢

代表事件:BeautyChain(2018)。攻击者构造让 uint256 加法回绕的输入,凭空创造代币。

防御要点:使用 Solidity 0.8 以上版本,依赖编译器内置 checked arithmetic;只在确实需要回绕的位运算或 gas 极敏感处使用 unchecked,并配上详尽注释。任何上 币安 这类大型平台的合约都不应再依赖 SafeMath,转而直接使用 0.8+ 编译器。

三、权限失配

代表事件:Poly Network(2021)、PancakeBunny(2021)。函数本应只允许特定调用者,但实际公开任何人调用,或调用者校验逻辑被绕过。

防御要点:所有特权函数加 onlyRole 或 onlyOwner;所有 cross-chain 消息加上来源校验;所有升级流程用多签 + 时间锁兜底。Foundry 的 invariant test 可以模拟随机调用序列验证权限约束是否被打破。

四、签名重放与 nonce 缺失

代表事件:多次 NFT permit 漏洞。攻击者把同一签名重复使用,转走不同账户的资产。

防御要点:所有链下签名必须包含 nonce 与 deadline,并按用户维度递增;DOMAIN_SEPARATOR 必须包含 chainId 与合约地址,避免跨链重放。这一点在 BN交易所 上接 gasless 交易接口时尤其关键。

五、价格预言机操纵

代表事件:bZx(2020)、Harvest(2020)、Mango Markets(2022)。借贷或衍生品协议直接读取 DEX 现货池价格,攻击者用闪电贷瞬间扭曲价格再借贷。

防御要点:使用 Chainlink、Pyth 等多源聚合预言机;如必须用 DEX 价格,加 TWAP(时间加权平均)平滑;对单笔操作限制比例上限。许多面向 BN平台 提交合约的项目都被要求列出预言机依赖清单。

六、闪电贷套利与组合性漏洞

代表事件:Euler(2023)、Visor Finance(2021)。单看每个函数没问题,组合调用产生致命交互。攻击者用闪电贷在一笔交易里跨多个模块构造异常状态。

防御要点:用不变量测试声明协议核心属性,例如「总抵押率始终 >= 最小阈值」;引入闪电贷防火墙,对每笔大额借出加额外校验;定期做组合性审计,画完整的状态机图。

七、跨链桥消息伪造

代表事件:Wormhole(2022)、Ronin(2022)、Nomad(2022)。守护者签名校验缺失或可被绕过,攻击者凭空铸造跨链资产。

防御要点:所有跨链消息必须经过多守护者签名 + 共识阈值;签名验证逻辑必须覆盖全部入口;升级时严格做差分测试。这类项目要进入 必安所 等机构合规通道,必须公布完整 keeper 列表与签名规则。

八、前端与社交工程结合的链上钓鱼

代表事件:多次 ETH 钱包前端被劫持事件。攻击者修改 dApp 前端,让用户在不知情下签名带 setApprovalForAll 的交易,瞬间清空 NFT。

防御要点:从合约侧降低伤害——所有 approval 设置过期时间或额度上限;前端集成 Wallet Guard、Pocket Universe 等防钓鱼插件;定期做用户教育与最佳实践提示。即使你写的是后端合约,也应当为前端钓鱼提供缓冲层。这是行业整体生态健康度的基础工程之一。