如何进行智能合约审计:完整教程

  • cyfrin
  • 发布于 2024-12-05 18:41
  • 阅读 23

本文介绍了进行智能合约审计的十个关键步骤,强调了系统性的方法和逐步处理复杂任务的重要性。通过获取文档背景、测试协议、分析测试套件及使用静态分析工具等步骤,可以有效识别和缓解潜在的安全风险,为审计师提供了清晰的工作框架。

系统化进行智能合约审计的10个步骤

探讨作为安全研究者,在进行智能合约审计时,无论代码大小或复杂性,系统化处理的10个关键步骤。

你已投入时间,熟悉了常见的攻击向量,并参与了CodeHawks First Flights。现在,你准备首次进行真实的审计。

你坐下来,并克隆比赛仓库。接下来,你发现自己盯着10,000行让人困惑的代码工作,垃圾桶里的求职申请又显得诱人起来。

系统化地处理大型或令人生畏的任务至关重要。将流程拆分为独立的部分,将使其更 易于接近,让你在进行过程中可以认识到进展。

在这里,我们将概述安全研究者可以采取的10个步骤,以减轻“我该从哪里开始?”这一问题的困扰。

1. 获取背景信息

你第一步几乎总是应该检查文档。理解审计的范围,并掌握支撑协议的商业逻辑。

这一基础步骤至关重要。跳过它就像在没有地图的情况下穿越迷宫。文档就是你的地图,提供关于协议预期功能和目标的见解。

如果可以,向开发团队提问,并与他们讨论他们的架构决策。你对协议应该做什么获得的洞察越多,越容易发现它何时在做其他事情。

掌握了这些理解,是时候……

2. 实践尝试

你接下来的行动应该是试用该协议并在本地克隆审计仓库。大多数被审计的协议将提供在本地测试环境中构建所需的步骤。

尝试协议的主要功能,并在理想条件下熟悉其流程。接下来,编译合约并使用 README 中分享的命令进行操作。

你对正常工作方式的熟悉程度越高,越容易找到漏洞。

通过这种熟悉度,将注意力转向协议的测试套件。

3. 分析测试套件

测试是协议的“心跳”,揭示了开发者重视和认为关键的内容。

检查测试覆盖率可以识别协议中更易受攻击的部分。这一步高亮显示了开发人员光顾的领域,并通过识别遗漏的测试来照亮代码库中被忽视的黑暗角落。

仔细观察现有测试,并准备编写更多以覆盖任何被忽视的盲点。

注意: 每个框架都不同,但 Foundry 命令 forge coverage 将为你提供测试撰写情况的概览。将此作为 指导,判断一个协议在测试其代码库上投入了多少时间和精力!

接下来,获得协议组件相互作用的可视化视角。

4. 可视化协议

“看似不相关”的协议各部分如何相互作用的可视化表示通常是有帮助的。

创建(或利用工具创建)协议图是理解协议的一个部分如何影响另一个部分的好方法Excalidraw是一个很棒的(而且免费的)在线工具,用于创建你自己的简单图表。

Solidity Metrics这样的工具,通过生成突出协议哪些区域是外部或涉及状态变化的图表,提供有价值的见解。作为安全研究者,这可以帮助你集中注意力在最脆弱的部分。

在清楚理解结构后,接下来是……

5. 版本验证

评估协议的稳定性——从字面上说。

检查正在使用的 Solidity 的哪个版本,因为每个版本都带有其特有的一组已知漏洞和特性。确定协议是否使用最新版本的 Solidity,如果没有,深入了解原因。

根据协议的范围,旧版本可能是合适的。但理解这些版本的使用以及版本选择对代码的潜在影响,对识别可能的漏洞至关重要。

因此,最好保持对Solidity 版本变更的最新了解。

然后,是时候利用行业见解来深化你的分析。

6. 使用 Solodit

Solodit是用于智能合约(smart contracts)的过去漏洞和安全缺陷的综合数据库。因此,建议访问 Solodit 并熟悉类似协议中发现的漏洞。

Solodit将超过15,500个经过验证的安全审计结果汇总到一个方便的位置。它提供了对 web3 代码薄弱环节的无与伦比的知识,是任何认真对待自己工作的审计者的宝贵工具。

此外,利用 Solodit 的审计检查表、提供了常见攻击的全面列表、提问的方式和研究的示例。

Solodit 检查表功能的截图,显示了类别化的安全审计检查表,选项包括“攻击者的思维”、“外部调用”和“Defi”,以及过滤和查看选项。

接下来,聚焦于协议的关键组件以揭示其最薄弱的环节。

7. 协议结构

开始评估代码库的好地方是其最脆弱的点——最弱的环节。

这些包括:

  • 角色
  • 访问控制
  • 函数参数
  • 公共/外部函数
  • 可支付函数
  • 状态变化
  • 依赖关系

这些都是潜在的恶意攻击向量。理解这些元素对识别安全风险至关重要。

通过利用像Solidity Metrics(在第4点提到的工具),你可以可视化这些关注区位于协议中的何处。

不过,记得使用自动化工具来补充你的手动审核。

8. 静态分析工具,如 Aderyn 或 Slither

虽然使用AderynSlither等审计工具可能不会揭示独特或关键的发现,但它们在识别代码库中的弱点时是无价的。静态分析 工具提供了可能存在漏洞的初步位置,指引进一步的手动检查。

随着这些工具在检测漏洞的能力上提升,安全研究者可以将更多时间集中于更严重的发现。

在邀请私人或公共审计之前,协议应默认将静态分析整合到安全工作流程中!

掌握这些基础后,是时候深入代码进行逐行审查。

9. 逐行查看代码

这是“深入实践”这一部分!应用你对协议的理解,评估每个函数对该目标的贡献。

比较代码片段的预期功能和实际功能。 通常,漏洞并不隐藏在复杂代码中,而是在预期商业逻辑与代码执行之间的差异中。这种分析可以揭示那些可能有深远影响的微妙错误。

利用审计方法,如"The Tincho"审计检查表(分别由 Tincho Abbate 和 Hans Freise 提供),以确保全面、系统地评估代码库。

最后,清晰而准确地呈现你的发现。

10. 制作有说服力的报告

你的审计报告是你的代表作。识别缺陷并不足够。 你必须有说服力地展示它们的存在及潜在影响。

使用代码证明(PoC)、清晰的标题和详尽的文档,让你的发现无法被忽视。

使用报告格式,如这个基本模板用于竞赛场景,或这个更详细版本用于私人审计的模板。

结论

这十个步骤为应对任何新的审计提供了明确的起点。大型代码库可能让人感到不知所措,但采用系统化和结构化的方法使安全研究者能够高效工作,并在关注细节的同时不失去对整体的把握。

记住:

问。 你怎么吃掉一头大象?

答。 一口一口地吃。

如果你想深入了解智能合约安全和审计,请查看 Cyfrin Updraft - 这是智能合约开发和审计的终极学习平台。

  • 原文链接: cyfrin.io/blog/10-steps-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.