本文提供了一份关于审计智能合约的指南。通过了解审计过程,你可以更好地准备识别和纠正合约中的潜在漏洞。
原文标题:The Ultimate Smart Contract Auditing Guide
原文作者:0xPredator
原文来源:Medium
编译:登链社区
区块链技术正在改变各行各业的游戏规则,而智能合约是这一进程的关键部分。智能合约通过消除第三方中介机构来确保各方之间的信任,有助于降低成本,同时也增加透明度。如果你要写一个智能合约,关键是你要对代码进行审计,以确保它能正常工作--而且不会有任何错误或安全漏洞。本指南将引导你了解审计智能合约的基础知识和一些常见的智能合约漏洞。
智能合约之所以重要,有很多原因。它们可以帮助你实现业务流程的自动化,使其更有效率,从而节省时间和金钱。但它如此受欢迎的最大原因是,通过移除人为错误从来减少欺诈的风险。然而,这些好处是有代价的:开发智能合约时很容易犯错。一个有缺陷的代码库可能会导致你的整个系统崩溃,甚至容易受到黑客的攻击!你可能听说过关于黑客攻击的事件。你可能听说过基于以太坊的代币被黑的事情。这些黑客是由于智能合约中的漏洞导致的,这使得黑客可以窃取存储在这些合约中价值数百万美元的加密货币。
在你开始审计之前,你应该首先进行一次安全 review。以便识别出智能合约中的任何问题和漏洞。
下一步是了解合约的商业逻辑,你应该了解为什么要创建它,它为用户解决了什么问题,以及它如何与区块链上的其他合约一起工作。
之后是技术架构分析:查看所有参与编写和部署这段代码的部分,以及了解它们是如何在 Solidity 等编程语言中实现的。
最后,进行威胁建模(threat modelling ),查看一下不同的参与方(用户/终端用户)如何与系统交互。
智能合约审计的不同阶段包括:
确定审计的目标和目的:
这一步你要设定智能合约审计的目标和目的。
确定审计的范围:
在这一步,你收集包括在审计范围内的所有资产,以确保没有任何遗漏。
审计计划:
审计的一个重要阶段是计划,这可以使审计工作有效地完成。
进行审计:
真正的工作,试图在智能合约的代码中找到漏洞。
撰写审计报告:
现在你所有的辛勤工作都结束了,是时候把你在审计过程中发现的情况写成报告了。
有许多不同类型的测试,但最重要的是要记住,你不应该相信你没有测试过的代码。你可以通过多种方式测试你的智能合约代码,包括:
作为一个智能合约的开发者,你有责任确保代码安全。这是你能保证你的用户的资金安全的唯一方法。
为了确保适当的安全,有一些基本做法必须遵循。这些包括:
以太坊智能合约容易受到一些黑客和攻击。最常见的漏洞是:
我们将在以下几点讨论一些常见的漏洞。你也可以查看我的其他文章,了解更多关于可重入和整数溢出/下溢漏洞的信息。
以太坊智能合约中最常见的安全漏洞之一是使用不安全的存储变量。这些变量可用于存储敏感信息,如私钥和密码,如果没有得到适当的保护,这些信息很容易被泄露。
有几种不同的方法来保护存储变量,例如使用像 SafeMath 这样的库(0.8 之后 Solidity 内置了 SafeMath),它可以确保所有的数学操作都以安全的方式进行。
其他方法包括使用硬件安全模块(HSM)来存储变量,或使用多签名钱包来保护私钥。防止存储漏洞的最佳方法是使用这些方法的组合,因为每种方法都有自己的优势和弱点。通过使用多层安全保护,攻击者要破坏智能合约中存储的数据就更难了。
谈到智能合约,为了避免任何误用,有几件关键的事情需要记住。首先,最重要的是要记住,智能合约是不可改变的。这意味着,一旦他们被部署,他们就不能被改变。因此,在部署之前,对你的代码进行双重检查和三重检查是至关重要的。
一个可能导致误用智能合约的常见错误是混淆了 transfer 和 send 功能。这两个函数看起来很相似,但它们实际上作用不同。transfer 可用与转移所有权,而 send 功能是用来发送资产。
简而言之,误用智能合约会产生严重的后果。在部署你的代码之前,一定要仔细检查,并确保你了解 transfer 和 send 功能之间的区别。
谈到智能合约中函数的可见性,主要有两种类型的漏洞可能发生。第一种类型的漏洞是不应该被公开 public 的函数被标记为 public 。如果函数没有被正确地标记为私有(private),或者可见性被意外地设置为公开(public),就会发生这种情况。这种类型的漏洞可以被任何能够访问合约的人利用,并可能导致合约被破坏。
第二种类型的漏洞是当一个函数在不应该是私有的情况下被变成了私有。如果可见性被意外地设置为私有,或者没有被正确地标记为公共,就会发生这种情况。这种类型的漏洞可以被任何能够访问合约的人所利用,并可能导致合约被破坏。
当你在编写智能合约时,一定要注意整数算术错误。当你用过大或过小的整数进行计算时,这些错误就会发生。
例如,假设你试图计算一个智能合约中所有代币的总价值。每个代币的价值被存储为一个整数。如果合约中的代币超过 2,147,483,647 个,那么总价值将太大,无法使用一个整数变量完整表示。这将导致一个错误。
为了避免这种情况,你可以使用一个像 SafeMath 这样的库(0.8 之后 Solidity 内置了 SafeMath),它可以帮助你安全地进行整数运算。
正如我们所看到的,循环和递归可以在编程中发挥巨大的作用。然而,它们也可以被滥用来制造漏洞。
这方面的一个例子是所谓的 "无限循环"。这是指一个程序被卡在一个循环中,而且永远无法退出。这可能导致程序崩溃,或者更糟糕的是,它会消耗所运行的系统的所有资源,造成拒绝服务攻击。这对智能合约来说是不利的,因为它可能导致用户亏损。
另一个例子是当一个程序递归太深时。这也可能导致崩溃,或者导致程序耗尽内存而被迫终止。
这两个漏洞都可以被攻击者利用,给系统或其用户造成问题。因此,意识到它们并采取措施防止它们被利用是很重要的。
预防:预防智能合约问题的最好方法是有一个彻底和完整的测试过程。这应该包括合约代码的单元测试,以及合约在预定环境中的功能测试。同样重要的是,为合约制定一个清晰明确的规范,以便所有相关方都能准确理解合约应该做什么。
检测:智能合约的问题通常可以通过监测合约的性能并将其与预期行为进行比较来检测。如果有任何差异,这可能表明合约有问题。也可以使用静态分析工具来检查合约代码中的错误或潜在的漏洞。
缓解:如果在智能合约中发现问题,必须采取措施缓解问题。这可能涉及改变合约代码以修复问题,也可能涉及改变合约的使用方式。例如,如果一个合约被发现容易受到某种特定的攻击,可能会通过改变合约的使用方式来缓解问题,从而使攻击不再可能。
补救:如果一个问题不能被缓解,那么可能有必要采取措施来补救这个问题。这可能涉及到用一个没有同样问题的新版本来替换合约,或者可能涉及到从使用中完全删除合约。
随着智能合约的普及,对能够扫描这些合约漏洞的自动化工具的需求也在不断增加。
目前有许多不同的自动化漏洞扫描器,每个都有自己的优势和不足:
Mythril是一个流行的选择,它使用 symbolic 执行来分析合约并找到潜在的漏洞。
Oyente是另一个流行的选择,它使用静态分析来寻找潜在的问题。
Securify是一个较新的工具,它使用静态和动态分析的组合来寻找漏洞。
这些扫描器并不总是 100%准确的,所以自己进行测试和人工审查是很重要的。
视频:
https://www.youtube.com/watch?v=LLiJK_VeAvQ 审计智能合约--以太坊应用程序的安全审查
https://www.youtube.com/watch?v=DkVpUqzU8SI 了解如何审计以太坊智能合约--由 bloctrax 介绍
https://www.youtube.com/watch?v=WchXkMlKj9w[5]BHIS | 区块链安全和智能合约审计入门
https://www.youtube.com/watch?v=qRznPHUFCLA 智能合约 101--如何审计 NFT 项目
https://www.youtube.com/watch?v=PTE1Hcqup_M 高级智能合约安全和审计工具
https://www.youtube.com/watch?v=0aJfCug1zTM 智能合约安全和审计 101
https://www.youtube.com/watch?v=R1eZCmR91vQ 如何查找 Solidity 漏洞
https://www.youtube.com/watch?v=IOUnhCTw6tE 高级智能合约黑客攻击
学习攻击
https://consensys.github.io/smart-contract-best-practices/known_attacks/
https://www.youtube.com/watch?v=apCGPh7tKhw
https://www.youtube.com/watch?v=R1eZCmR91vQ
https://swcregistry.io/
用于练习
https://www.damnvulnerabledefi.xyz/index.html
https://ethernaut.openzeppelin.com/
一个路线图:
https://github.com/razzorsec/AuditorsRoadmap
awesome-ethereum-security:
https://github.com/crytic/awesome-ethereum-security
本文提供了一份关于审计智能合约的指南。通过了解审计过程,你可以更好地准备识别和纠正合约中的潜在漏洞。
责任编辑:Kate