智能合约里最常见的漏洞有哪些?项目方该怎么防

安全 · 2026-05-30 · 比特三棱镜编辑部
AI 搜索

每隔一段时间就会有合约被攻击的新闻——数字从几百万到几亿美元不等,社群里一片惋惜。但如果把过去三四年公开的事故复盘聚在一起看,会有一个反直觉的结论:大部分损失不是新颖的零日漏洞造成的,而是项目方反复掉进同一类老坑里。从重入到价格预言机操纵,从访问控制粗放到代理升级失误——这些坑被审计员、研究员、白帽反复写过,但依然年复一年出现在被盗名单上。这一篇按四类把它们梳理一下,并把项目方那一侧能做的事单独列出来。

智能合约四类常见漏洞分布概览

第一类:逻辑漏洞——经典三件套依然在收割

逻辑漏洞是审计员看得最多的一类。共同点是漏洞就在代码里,理论上读一遍就能看出,但开发者在赶上线压力下仍会写错。三件套:

  • 重入攻击:合约把控制权交给外部地址时,外部地址在还没"结束"前反过来调用本合约的提款逻辑。经典对策是 Checks-Effects-Interactions,或 OpenZeppelin 的 ReentrancyGuard
  • 整数溢出 / 下溢:Solidity 0.8 之后内建检查能挡多数,但自定义 unchecked 块仍会埋雷;
  • 访问控制缺失:关键函数没有 onlyOwner,谁都能调用——听起来低级,但 2025 年仍有大额事故栽在这。

最便宜的防御:用 0.8+ 并单独 review unchecked 块;关键状态变更全走 CEI;external/public 函数显式声明权限模型;用 Slither、Mythril 跑一遍。

如果你想看一遍审计员真实在做什么,智能合约审计是怎么做的 给了一个不错的视角。

第二类:经济模型漏洞——价格、滑点、闪电贷

第一类是"代码里的漏洞",第二类是"机制里的漏洞"。代码没毛病,但对经济激励、价格来源、资金流的假设错了,整个机制能被合法操作套出钱。

最常见的子类是价格预言机操纵。一些借贷或期权协议直接拿某个 DEX 池子现货价做喂价,攻击者用闪电贷把池子打偏,触发对自己有利的清算,然后还掉闪电贷走人。每隔几个月仍有项目踩雷。

防御要点:不依赖单一 DEX 池瞬时价格,优先 Chainlink、Pyth 并加偏离阈值;必须用池子价时至少用 TWAP;把"闪电贷可用"作为默认攻击假设;关键路径跑闪电贷模拟测试。

经济模型漏洞还包括激励错配。这类静态分析查不出来,只能靠人脑和模拟。

价格预言机操纵与闪电贷攻击链路示意

第三类:依赖外部数据 / 外部合约的漏洞

智能合约要调用 ERC-20、外部价格源、跨链桥、其他协议。外部依赖出问题,本合约跟着出问题。

常见子类:非标准 ERC-20(有手续费扣减、transfer 不返回 bool);可升级外部合约(今天合法明天恶意,尤其代理);伪造的跨链消息(不校验来源就被对面链攻击者构造);可被滥用的回调入口。跨链方向出事尤其多,跨链桥黑客攻击事件复盘 梳理过几起大事件。

对策:每个外部依赖列"信任假设清单";返回值用 SafeERC20,不直接 require(token.transfer(...));跨链消息校验来源链 ID、来源地址、nonce;引入紧急暂停但平衡好权限中心化风险。

第四类:运维流程漏洞——私钥、升级、多签

最后一类不是代码漏洞,而是人的漏洞。把代码写得再好,如果项目方钥匙管理松懈、升级流程混乱、多签形同虚设,照样会被一锅端。

子类 典型场景 防御要点
私钥泄露 部署私钥放在云笔记或仓库 硬件钱包冷钱包分级
多签形同虚设 全部多签人是同一团队 引入外部独立签名人
升级权限过大 单签 owner 可以任意修改任何合约 Timelock + 公开提案
紧急暂停误用 暂停权限被钓走 暂停权限单独冷钱包

这些事项目方常常觉得"以后再做",但实际上它们才是过去几年最常致命的那一类。代码漏洞还能补丁,私钥被偷只能眼睁睁。

钥匙管理这一段配合 硬件钱包供应链风险 一起看,会对运维风险有更具体的画面。如果项目方还面临监管压力,全球加密监管最严的国家 可以帮你判断在哪些司法辖区运维要更保守。

项目方合约运维流程与多签防御清单概览

一份不算复杂的"项目方防御清单"

把上面四类整合一下,给项目方一份不算复杂但能挡住大多数事故的清单:

  1. 代码侧:Solidity 0.8+、Slither/Mythril 全过、重入和访问控制做模板化处理、关键路径写完整的单元和模糊测试;
  2. 经济模型:所有外部价格用聚合喂价 + 偏离阈值、关键路径跑闪电贷攻击场景、激励循环必须经过模拟;
  3. 外部依赖:列出信任假设清单、SafeERC20 全覆盖、跨链消息三件套校验;
  4. 运维流程:部署私钥进硬件钱包、多签引入外部签名人、升级走 Timelock、暂停权限独立冷钱包;
  5. 上线后:bug bounty 设置在 50 万到 500 万美元区间(与 TVL 匹配)、白帽通道单独维护、监控告警做到分钟级;
  6. 审计:至少两家独立审计、内部安全工程师常驻、把审计当成持续的事而不是一次性事件。

走完这套清单不会让你免疫所有漏洞——0 day 仍然存在、新颖攻击仍然会出现。但它能保证你不至于死在过去三年已经被复盘过几十次的老坑里——这已经是 2026 年安全工作里 80% 的价值。

把"防御"内化成开发节奏的一部分

回到标题问的"该怎么防"。最坦诚的回答是:别把安全当一个上线前的关卡,把它当一个贯穿整个开发周期的肌肉。每一个 PR 都过一遍重入和访问控制;每一个外部依赖都问一句"如果它变坏会怎样";每一次升级都走 Timelock;每一次部署都用硬件钱包。这些动作单看没有一个是高难度的,但当它们成为团队的肌肉记忆时,前面四类漏洞就会被挡在门外大半。剩下那小半,再靠审计、白帽和运气一起处理。