德迅科技 · 专注交易所开发、Web3开发与区块链技术解决方案
安全与行业应用

Web3安全审计前要留意的6项风险与检查要点

从代码范围、权限、外部调用、代币与预言机假设、升级部署到修复复测,梳理审计前应核对的六类风险,并给出可执行的准备步骤。

准备上线智能合约时,先别急着把源码交给审计方:范围没定、部署配置缺失,或关键假设未写清,都可能让问题留在检查范围之外。有效的web3安全审计不只是找代码漏洞,还要核对合约如何被调用、谁能改变状态,以及修复是否真正进入待部署版本。

1. 审计范围和代码版本不一致

风险常从边界开始:只提交核心合约,却遗漏代币、代理合约、初始化逻辑或部署脚本,审查结论就无法覆盖完整调用链。源码分支、编译器版本、依赖库和实际部署字节码若不一致,报告也可能对应错误版本。

交付前固定代码提交版本,列出纳入与排除的合约、依赖版本、编译参数和部署地址;若使用代理模式,还要说明代理、实现合约及初始化流程。OpenZeppelin Contracts等依赖应标明具体版本,不能只写库名。

2. 权限控制过宽或初始化不严

逐项检查铸币、暂停、升级、提取资产等敏感操作:调用者是谁,权限由何处授予,是否存在撤销或转移机制。重点核对构造函数和初始化函数,代理合约中的初始化通常需要防止重复执行;管理员权限若集中在单一密钥,也要评估丢失或泄露后的影响。

3. 外部调用引发重入或状态错乱

合约向其他合约转账、调用代币接口或执行回调时,对方代码可能在当前操作完成前再次进入本合约。检查余额更新与外部调用的先后顺序,并确认相关函数是否可重入。2016年The DAO事件是重入风险的知名历史案例,但不能据此假定所有外部调用都会被利用;应结合具体调用路径验证。

4. 对代币行为和数值边界想当然

不同代币实现可能在转账返回值、精度和转账金额上存在差异。若业务按请求金额记账,却未核对实际到账金额,可能产生账面余额偏差。还需检查零值、极大数、舍入、手续费及精度换算,确认每种输入下余额变化符合预期。

5. 预言机与经济假设未纳入威胁模型

依赖链上价格、抵押率或清算阈值的合约,不仅要检查取价代码,也要说明价格来源、更新条件和异常时的处理。预言机风险包括价格过期、市场流动性不足和短时价格偏移。测试时覆盖价格缺失、突变和边界值,并确认暂停或限额机制不会制造新的资金锁定问题。

6. 升级、部署和修复缺少闭环

安全结论取决于最终上线内容。升级可能引入存储布局冲突,部署参数错误也可能让正确代码处于错误配置。审计发现修复后,应确认修改进入目标版本,并重新检查相关调用路径;未修复项需记录影响、原因和接受风险的责任方。

审计前的可执行准备流程

  1. 锁定代码提交,整理合约清单、依赖版本、编译设置和部署方案。

  2. 画出资金流与权限流,标注外部调用、管理员操作、升级入口和价格依赖。

  3. 提供测试、预期行为及已知限制;可用Slither做静态分析、用Echidna进行属性模糊测试,作为审计补充而非替代。

  4. 逐条处理审计发现,记录修复提交,并对最终候选版本复测部署配置。

归根结底,web3安全审计要覆盖代码、权限、依赖和上线过程。把边界与假设提前讲清,再对最终版本完成修复复测,才能让报告更贴近真实风险;审计仍不能保证系统绝无漏洞。

常见问题

审计报告能保证合约安全吗?

不能。报告反映特定范围和版本的检查结果,后续改动、依赖变化或未纳入范围的组件都可能带来新风险。

静态分析可以代替人工审计吗?

不可以。工具适合发现部分模式和辅助测试,但业务逻辑、权限边界及经济假设仍需结合上下文审查。

代码还会修改,能先做web3安全审计吗?

可以先审查相对稳定的版本,但必须记录版本差异;涉及安全逻辑的修改应重新评估,不能直接沿用旧结论。

审计前最重要的材料是什么?

至少准备固定版本源码、依赖与编译信息、部署配置、权限说明、关键业务假设及可复现测试。