安全指南
Web3 安全清单:保护智能合约的 15 个步骤
从访问控制到监控的全面、可操作清单——在攻击者之前发现漏洞。
部署前安全清单
在将任何智能合约部署到主网前,完成这 15 项检查。
实施基于角色的访问控制
使用 OpenZeppelin 的 AccessControl 或 Ownable2Step,而非原始地址检查。为管理员、操作员和暂停功能定义独立角色。切勿使用 tx.origin 进行授权。
防范重入攻击
对所有外部调用应用 checks-effects-interactions 模式。对转移 ETH 或与不可信合约交互的函数使用 ReentrancyGuard。使用恶意回调合约进行测试。
验证所有外部输入
在函数入口检查零地址、溢出值、空数组和超范围参数。永远不要信任调用者会提供合理输入——在链上强制约束。
安全处理整数运算
Solidity 0.8+ 内置溢出检查,但 unchecked 块会绕过。审查每个 unchecked 块的溢出/下溢风险。注意除以零和定点数运算的精度损失。
保护预言机依赖
使用时间加权平均价格(TWAP)或多个预言机源来抵抗闪电贷操纵。添加过期检查、最小响应阈值和预言机故障的回退逻辑。
锁定并验证编译器版本
使用固定 pragma(如 0.8.20)锁定 Solidity 版本,而非浮动 pragma(^0.8.0)。确保项目中所有合约使用相同版本编译,避免微妙的行为差异。
最小化升级攻击面
如使用可升级代理,用时间锁和多签治理限制升级权限。防止存储布局冲突。考虑是否真的需要可升级性——不可变合约更容易推理。
实现紧急停止机制
为关键操作添加暂停功能。设计暂停机制使其不会被滥用于审查,但能在活跃攻击期间停止操作。测试暂停是否确实阻断所有关键路径。
防范抢跑攻击
对时间敏感的操作使用 commit-reveal 方案、私有内存池(Flashbots Protect)或截止时间。最小化待处理交易中的可提取价值。
审查代币授权模式
尽可能避免无限授权。实现 EIP-2612 permit 实现无 gas 授权。检查授权竞态条件,确保使用 decreaseAllowance 而非先 approve(0) 再 approve(newAmount)。
使用真实 Fork 模拟测试
在主网 Fork 状态上运行集成测试,捕获真实代币余额、池状态和预言机值的问题。Hardhat 和 Foundry 都支持 Fork 测试——用它模拟真实部署条件。
权衡 Gas 优化与安全
Gas 优化的代码可能引入微妙的安全问题。永远不要为省 gas 跳过安全检查。对任何 unchecked 块或内联汇编使用添加明确的安全性理由文档。
在区块浏览器上验证合约源码
部署后立即在 Etherscan 或相关区块浏览器上发布并验证源代码。这使公众能够审查并建立信任。确保验证的源码与部署的字节码完全匹配。
设置监控和告警
在上线前而非之后部署链上监控。监控异常转账模式、权限升级、治理提案和参数变更。FinGuard 的 24/7 监控层可实时捕获活跃攻击。
获取独立安全审计
内部审查是必要的但不充分。聘请独立审计师在沙盒环境中尝试攻击你的合约。要求发现结果有攻击利用证据,而非仅是理论风险列表。
需要关注的常见漏洞
这些漏洞类别占 2024-2025 年 DeFi 攻击的绝大部分。
重入攻击
最经典的智能合约漏洞。攻击者在第一次调用完成前重新进入函数,通过递归调用抽干资金。2016 年 The DAO 黑客因此损失 6000 万美元。
预言机操纵
攻击者使用闪电贷临时操纵链上价格源,然后攻击依赖即时价格的协议。这是自 2020 年以来 DeFi 中最主要的攻击向量。
访问控制缺陷
特权函数缺失或错误的权限检查——允许任何人调用管理操作、更新参数或抽走资金。通常由不完整的修饰符覆盖引起。
闪电贷攻击
原子性地借入大量资金来操纵治理投票、池比率或定价机制。防御需要时间加权值和多区块确认。
业务逻辑漏洞
借贷利率、奖励计算或清算阈值的错误实现。这些漏洞因协议而异,也是单靠自动化工具不够的原因——人工推理能发现设计缺陷。
测试要求
任何智能合约上主网前的最低测试标准。
单元测试(90%+ 覆盖率)
每个 public 和 external 函数都应有正向和负向测试用例。目标至少 90% 分支覆盖率。使用 Foundry 的 forge coverage 或 Hardhat coverage 插件测量。
主网 Fork 集成测试
在 Fork 的主网状态上测试完整部署流程。验证与 DEX 池、借贷协议和预言机的交互在真实链上数据下是否按预期工作。
带属性不变量的模糊测试
定义不变量(如总供应量不超过上限、用户余额不为负)并让模糊器生成数千随机输入。Foundry 和 Echidna 是该领域的领先工具。
关键路径的形式验证
对管理大量 TVL 的高价值合约,使用形式验证工具(Certora、Solidity SMTChecker)数学证明关键属性在所有可能输入下成立。
常见问题
完成这个清单需要多长时间?
对于有现成测试覆盖的结构良好的项目,预计 2-5 天系统地完成全部 15 项。从零开始的项目,预留 1-2 周用于实现适当的访问控制、测试基础设施和监控设置。
自动化工具能替代人工安全审查吗?
自动化工具(静态分析器、模糊器、形式验证)能高效捕获已知漏洞模式,但会遗漏业务逻辑缺陷、经济设计问题和新型攻击向量。最佳方法是自动化工具提供广覆盖、专家审查提供深度——这正是 FinGuard 7 层流水线的工作方式。
清单中最重要的单项是什么?
如果只能做一件事,请获取独立安全审计(第 15 项)。经验丰富的审计师会在审查过程中发现其他大部分问题。但仅依赖审计而不实施其他项目意味着你在制造不必要的工作和风险。
应该在审计前还是审计后完成清单?
审计前。完成清单意味着审计师花时间寻找深层、不明显的问题,而非标记基本卫生问题。这让你的审计费用获得更高价值。可以把它想象成在检查员来之前打扫房子。