作者:Oleh Malanii
随着我们深入探索Web3时代,智能合约在推动去中心化应用、交易所和DeFi(去中心化金融)领域中的关键作用变得越来越重要。
然而,随着这些系统的复杂性和规模增长,错误的可能性呈指数级增加。对于希望在他们的智能合约中实现无错误操作的Web3开发者来说,对区块链上每一行代码进行严格审计变得不可或缺。
尽管基于Web3应用程序、编程语言和区块链网络的特定情况可能会导致审计方法有所不同,但一些核心原则始终保持一致。
在本文中,我们将带你了解Hacken的经过验证的审计流程,这是我们自2017年首次进行审计以来不断完善的方法论。
什么是智能合约审计
智能合约审计是指对智能合约的基础代码进行仔细审查,以找出并纠正任何潜在的安全漏洞、错误或低效之处的过程。该审计旨在确保你的合约按预期运行,提供强大的安全性,并完全符合公认的行业标准和最佳实践。
简而言之,智能合约审计是确保你的合约在部署后能够顺利、安全地运行的保证。
智能合约审计的准备工作
全面准备和详细记录的重要性不可低估。它有助于提高清晰度,节约资源,并使整个过程更加高效。
为了确保你从审计中获得最大收益,你应考虑以下步骤:
1. 明确建立项目的功能要求。
2. 准备项目的详细技术描述。
3. 为项目建立开发环境。
4. 开发全面的单元测试。
5. 确保代码符合最佳实践和安全标准。
满足这些标准使我们能够对你的项目进行深入审查,并根据你的规格准确评估代码。即使你不打算进行外部审计,这种准备水平也是必要的。
准备1:功能要求
功能要求作为审计人员了解你的项目具体目标的路线图。它们需要表达清晰、简洁,没有歧义。
❌含糊的要求:用户应该能够赚取代币。
✔具体要求:合约应使用户能够质押ABC代币并获得XYZ代币作为奖励。
提供尽可能多的功能细节可以帮助审计人员确认代码是否按预期执行。
以下是几个其他明确定义的功能要求示例:
1. 合约必须使用户能够质押HAI代币并获得其他代币作为奖励。
2. 奖励总量必须根据用户质押的HAI代币总量占比分配给所有用户。
3. 用户应该能够在方便的时候提取他们的资金和奖励。
4. 每次用户提取代币时,总锁定余额应重新计算。
虽然你的智能合约代码可能是安全的,但它可能与你的预期目标不一致。这是寻求外部意见以确保应用程序按预期功能运行的另一个原因。
如果审计人员不了解应用程序的内容,他们如何验证功能并保证任何事情?确切地说!清晰和全面的功能要求是衡量成功的标准。这是真正从外部审查中获益的唯一途径。
准备2:技术描述
全面的技术概述在审计准备中起着重要作用。你应重点关注以下内容:
1. 所使用的编程语言和技术。
2. 部署的说明。
3. 测试运行的说明。
4. 任何相关的非功能性要求。
这些信息有助于我们在处理复杂且相关的智能合约时进行导航。再次强调,即使你没有计划与外部专家合作,记录代码的重要方面也是有益的。
准备3:开发环境
我们始终鼓励客户为其项目配置开发环境。Truffle或Hardhat等工具提供了一套全面的自动化工具。
专用的开发环境可以实现以下功能:
增强调试:有助于高效地追踪和修复代码错误。
简化测试:你可以自由地测试和破坏代码,而不会影响实际代码。
更好的版本控制:帮助管理代码的不同版本并跟踪更改。
减少意外实际部署的风险:避免过早或意外部署未完成的代码。
考虑到这些优势,跳过创建开发环境将是一个天大的损失。
准备4:单元测试
创建全面的单元测试来覆盖你的代码不仅是建议,而且是必不可少的。它优化了审计流程,节省了资源,并增强了应用程序的安全性。
我们建议争取实现100%的测试覆盖率,包括正面和负面的场景。此外,我们鼓励开发多用户测试来评估系统对潜在的DoS(拒绝服务)攻击的韧性。模拟多个并发用户的合约还可以确保用户操作彼此之间不受影响,除非这是你的设计的一部分。
通过遵循这些步骤,你甚至可以在开始审计之前发现安全漏洞。因此,在审计过程中,我们可以利用这些测试,将我们的努力集中在更复杂的问题上,从而加强你的安全措施。
准备5:最佳实践和安全标准
遵循官方语言风格指南和格式规范是促进审计和计划中的合约升级的又一种经济高效的方式。
遵循这些最佳实践可以减少问题检测所需的时间,并减少对新增代码的错误监视的可能性。简单来说,遵循最佳实践是节省时间和金钱的有效策略。
如何审计智能合约
现在,让我们来介绍最关键的部分:审计智能合约的过程。
在Hacken,多年来我们不断优化了我们的方法论,并建议遵循以下步骤以实现最有效和高效的错误检测:
1. 预审阶段
2. 逐行审查
3. 分析和验证
4. 报告和评分
第一步:预审阶段
我们的审计的初始阶段旨在在深入审查开始之前发现任何需要注意的问题区域。
在预审阶段,我们研究你提供的代码库,确保审计范围全面。
预审员评估开发环境是否存在潜在的编译问题,执行提供的测试,并验证功能和非功能性要求。
智能合约审计工具
对于Solidity合约,我们使用以下安全分析工具来发现基本问题并深入了解合约:
Slither:这个静态分析工具检查Solidity源代码的安全漏洞,并检查其符合最佳实践。
Mythril:一个用于识别Solidity智能合约中潜在漏洞的bug-hunting框架。
Solgraph:一种生成DOT图的工具,用于可视化Solidity合约的函数控制流,并突出显示潜在的安全威胁。
Echidna:一个用于对Solidity智能合约进行模糊测试和基于属性的测试的程序。
Mythx:一个用于Solidity智能合约的安全分析平台,结合静态和动态分析,以检测漏洞并生成详细报告。
对于Rust合约,我们依赖以下工具:
Clippy:一组用于捕捉常见错误和增强Rust代码的检查工具。
Cargo-udeps:用于检测Cargo.toml中未使用的依赖项的工具。
Cargo-audit:用于对存在安全漏洞的依赖项进行审计,根据RustSec Advisory数据库中的报告。
Cargo-geiger:帮助检测使用不安全Rust的情况。
Cargo-crev:为Cargo提供了一个可进行密码学验证的代码审查系统。
此外,我们还运行了一些内部的安全分析程序,具体细节我们不予透露,但通过上述工具,你可以获得可观的结果。
在此阶段结束时,我们将向你提供初步报告,让你有机会在正式审计开始之前进行最后的修改。
第二步:逐行审查
让审计开始吧!在这个阶段,我们的目标是为你提供经过验证的见解,指导你在增强代码安全性方面做出必要修改的决策过程。
问题的发现和记录。在详尽的逐行审查中,由一对熟练的审计员独立进行,我们会仔细检查你代码的每个部分,寻找所有可能的漏洞,包括:
1. SWC注册表中列出的问题
2. 数据操作
3. 访问违规
4. 闪电贷款
5. 由合约互动引发的复杂漏洞
虽然要列出所有检查项目的完整列表太长,但请放心,我们会适当检查大多数编程语言的关键项目:
项目 | 描述 |
默认可见性 | 函数和状态变量的可见性应明确设置 |
整数溢出和下溢 | 如果使用未经检查的数学操作,则所有数学运算应安全免受溢出和下溢影响。 |
过时的编译器版本 | 建议使用最新版本的相应编译器(Solidity或Rust)。 |
访问控制和授权 | 所有关键函数应受到保护,以防止所有权被接管 |
资产完整性 | 资金受到保护,不能未经适当权限提取或锁定在合约中。 |
数据一致性 | 智能合约数据在整个数据流中应保持一致。 |
需要认识到,所有问题并非完全相同。因此,我们针对以太坊虚拟机(Solidity、Viper、Yul)和基于Rust的合约(Solana、Near、CosmWas)使用了50多个特定于编程语言的参数。
测试
此外,我们还对测试覆盖率进行了彻底评估。如果我们发现任何缺口,无论多小,我们会开发和实施额外的测试用例,以涵盖所有可能的正面和负面场景。
请记住,有些问题只能在依赖合约的错误配置下复制。因此,我们的审计员会有意地设计这些配置并运行相关的测试。
每个问题被分类为通过、失败或不相关。
第三步:分析和验证
审计过程的这一关键阶段真正展示了我们独特方法论的优势。到目前为止,我们的审计员一直在独立进行审查,从各自的角度对代码进行客观的审视和深入探索。
现在,这些审计员首次汇聚在一起,将他们的个人见解和发现带入到主审计员的指导下进行共同讨论。我们在开放的对话中审查、讨论并甚至争论所发现的问题,以培养对项目潜在漏洞更全面的理解。
此外,团队编制了一份内部文件,重点介绍你项目的关键方面和可能的弱点,同时提供详细的咨询报告,建议采取措施增强项目的安全性和改进审计评级。
主审计员会仔细查看所有材料,确保它们完整、准确,并准确地代表了集体审计发现的结果。在此最后检查之后,汇总的审计报告将发送给你,作为对项目安全性的强有力评估。
第四步:报告
经过对发现的问题进行密集的相互审查后,我们的团队共同起草了一份详细的最终报告,涵盖了关键问题、漏洞和已执行的测试。
报告概述:
1. 执行摘要
2. 已检查项目
3. 系统概述
4. 发现
5. 免责声明
审计报告中的执行摘要提供了关键发现和整体评估的概览。已检查项目部分列出了所有审查的元素,发现部分提供了对已发现问题的详细见解和改进建议。免责声明解释了审计的范围。
基本上,该报告全面审查了审计情况,为你提供了经过验证的信息,增强你的智能合约的安全性和可靠性。
外部用户
最终的审计报告对于社区成员和投资者等外部利益相关者也是宝贵的资源。他们会阅读该报告,以便在考虑向你的项目存款/投资时做出明智的决策。
审计评分。我们还根据以下三个标准为你的项目分配最终的审计评分:
文档质量(D)- 1.0
代码质量(C)- 2.0
安全级别(S)- 7.0
这个评分提供了一个便于外部和非技术用户了解你的项目可行性的方式。
在审计中应该有多少人参与
一些安全公司可能采用精简化的工作方式,只有1-2名员工负责所有职责。虽然这样可以降低劳动成本,但存在质量折衷的风险,并给这几个人带来过重的负担。
在Hacken,我们采用更加专注的策略,每个专业人员专注于一个核心任务。我们倡导角色专业化,因为它使我们能够更多地投入宝贵的时间解决手头的问题。
1. 预审员:负责初步阶段的审计员,负责审查项目要求,确认项目范围,并部署自动化工具。
2. 审计员:主要审计员进行深入的逐行审查,解决任何差异,并向主审计员提供所有必需的材料。
3. 主审计员:高级审计员,负责审查审计员准备的所有材料,确保没有忽视任何安全问题。
4. 校对员:负责确保最终报告没有错误,并符合我们制定的结构。
5. 交付经理:负责保持我们团队之间的直接沟通,确保解决所有关注和建议。
毫无疑问,这种方法对人力资源的投入要求更高,但随着时间的推移,我们发现对我们和客户的长期利益是值得的。
总结
在Hacken,我们强调定期进行智能合约审计的绝对必要性。由于区块链应用的不可变性,智能合约中的未发现的缺陷可能会导致长期的问题。
积极主动地进行审计有助于及早发现此类漏洞,使你能够有效可靠地保护应用程序。
所有评论