LESSON 05

审计方法

审计不是把扫描器输出贴进文档。先固定版本,再画资产和权限,写下不变量,然后用测试证明破坏路径。

约 70 分钟讲解 + 示例 + Lab + 自测本机记录进度
核心流程

审查是一条可重复的生产线

每一份报告都应该能让另一个人沿着同一条证据链走完。做不到,就还只是阅读笔记。

深色工作台上的文件夹、金属印章和绿色亚克力尺,比喻先固定范围和版本再开始审查
先盖章再翻页。commit、链、地址和排除项没锁死之前,不要开始写 finding。
  1. 固定范围

    仓库 commit、合约列表、链、部署地址、排除项和已知问题。

  2. 构建运行

    依赖锁定,原测试全绿。无法构建就停止假装审计。

  3. 架构资产

    角色、入口、出口、代理、预言机和外部调用先画出来。

  4. 权限矩阵

    谁能改规则,失陷后能拿走什么。

  5. 写下不变量

    5 到 15 条系统必须永远成立的话。

  6. 逐函数审查

    先价值转移,再管理升级,再价格会计,再回调。

  7. 工具与动态

    静态枚举、单元、fuzz、invariant、必要时 fork。

  8. PoC 与严重度

    路径、前提、影响,然后才标档。

  9. 修复复核

    只看 diff。原 PoC 应失败,正常路径应仍通过。

先对齐“审计”这个词

Cyfrin 这段只有六分钟,用来建立委托方和审查方的共同语言。看完回到上面的流程,检查自己会不会把审计说成“跑一个扫描器”。

What is a smart contract audit?抓住三件事:审计有范围、有时间盒、不能证明没有漏洞。准备材料比催报告更重要。
工具书

若要看完整审查示范,用 Patrick Collins 的 Security and Auditing Full Course。本课不要求看完 21 小时,需要时再按主题回看。

范围没锁死,结论全部作废

commit

审查对象是一个哈希,不是“最新 main”。

deploy

链、代理、实现、构造参数必须对得上。

out

明确排除项。没看过的合约不要写进保证。

trust

把“我们信任多签 / 预言机 / 管理员”写成假设,而不是偷偷忽略。

网页终端

开始前先证明仓库能被别人复现

这些命令不会连接钱包。它们只是在问:你审查的东西,别人能否在同一版本上重建。

点运行,逐步看到命令和结果。这里不会碰到你的真实钱包。

先画图,再逐行读

重点列出两类函数:资产损失必须经过的函数,以及能改变系统规则的函数。

资产路径

钱怎么进来,怎么出去

  • 存款、借款、兑换、清算
  • 内部记账与真实余额是否一致
  • 费用、份额和坏账怎么记
规则路径

谁能改游戏

  • Owner、Upgrader、Guardian、Keeper
  • 暂停、参数、实现地址
  • 多签与时间锁是否真的约束执行
权限不一定是漏洞

单个 EOA 能升级并转走资产,如果文档声称去中心化,这是严重的设计或披露问题。如果文档写明了,它仍必须出现在权限矩阵里。

不变量是审查的骨架

每条不变量对应手工检查点和自动测试。不要把实现细节改写成断言。

偿付总资产始终覆盖可赎回份额。
所有权用户不能提取超过自身权益的资产。
铸造协议操作不会无授权创造价值。
暂停暂停状态禁止规定的危险操作。
价格价格过期或偏离时不能新增风险仓位。
权限只有声明过的角色能改规则。

不要用惊吓程度代替严重度

交互实验

严重度由影响 × 可能性决定

先选破坏了什么,再选这条路径今天有多现实。PoC 好写不会自动升级档位。

影响
可能性
建议档位
Medium
影响
重大
可能性
有条件

有限到重大损失,路径存在但不是一键可打。

Critical

可大规模、直接且现实地损失核心资产或接管系统。

High

重大损失或关键功能破坏,需要一定条件。

Medium

有限损失、局部 DoS、重要规则破坏或较强前提。

Low / Info

影响较小、条件苛刻,或只是透明度问题。

交付标准

一份 finding 要让开发者能修

快速定位理解为何可达跑得动 PoC判断真实影响最小正确修复回归测试

复核时只看实际 diff。检查修复是否引入新路径,原 PoC 应失败,正常行为测试应继续通过。链上更新后重新核对部署交易。

完成证据

对一个公开练习项目写出 5 条不变量、一张权限矩阵,以及一个带路径和影响的 finding 草稿。草稿可以判为误报,但不能没有证据结构。

课中测验 1 / 3

审计还没能构建项目时,正确做法是?

课末自测

为什么无法构建项目时,不应继续“先写几条 finding”?

信心
下一课事故分析 →