智能合约审计——区块链安全的8个步骤

admin 2022年5月26日02:44:03云安全评论8 views1463字阅读4分52秒阅读模式
5月25日-区块审计

智能合约审计——区块链安全的8个步骤

在Cryptonics,我们在过去 12 个月中审核了 22 个区块链项目的智能合约。这些项目包括可替代和不可替代的代币、复杂的交易协议、预测市场、赌注系统和基于智能合约的视频游戏。


在经审计的合同中,我们共发现了13 个关键问题、16 个主要问题和36 个次要问题。但这些数字说明了什么?正如我们想吹嘘的那样,这些统计数据不仅突出了我们的审计能力(当然,我们喜欢认为它们确实如此)。它们主要说明编写安全的智能合约非常困难。他们还表明,任何严肃的基于区块链的项目都必须进行独立审计。


在本文中,我们将解释我们的审计流程和方法,澄清一些关于智能合约审计的迷思,并强调需要关注智能合约之外的安全性。


审计过程

许多来找我们的项目都希望审计包括由经验丰富的智能合约开发人员进行的简单代码审查。然而,虽然知道如何制定良好的合同是任何审计员的一项重要技能,但审计过程涉及严格的方法和定义明确的过程,而不仅仅是审查代码。让我们将我们的过程分解为各个步骤:


1. 源代码锁定

要审计的智能合约可以通过多种方式交付给我们:压缩存档中的Truffle项目、源代码存储库的链接,甚至是已经部署在测试网络上的经过验证的源代码的合约。


我们所做的第一步是确保审计后可以确认审计文件的完整性。这意味着我们需要一种在审计报告中识别确切源代码版本的方法。在源代码存储库的情况下,这很容易,只需记录提交号。在其他情况下,我们计算提交给审计的每个文件的 SHA-256 哈希值。


这一步很重要,因为项目不仅使用审计来验证安全性,还使用它们向用户展示代码的行为与宣传和记录的一样。


2. 项目熟悉阶段

在详细了解代码之前,我们先熟悉一下智能合约架构的目的。为此,我们要求项目提供他们可用的所有文档。在这个阶段,我们可能还会与开发团队进行讨论,以便他们解释他们的设计和架构。


3. 初步代码审查

现在是深入研究代码的时候了。在这一重要步骤中,我们的审核员通读源代码,尝试了解主要设计决策,查看使用的库并验证测试覆盖率。


在这个阶段,我们通常已经对设计的总体质量有所了解。


4.静态代码分析

我们使用许多工具来自动扫描合约中的某些类型的漏洞。通常,项目在开发过程中自己使用这些类型的工具,但有时自动分析会带来一些有用的发现。当然,静态代码分析有其局限性,误报很常见,这就是我们详细分析工具突出的任何问题的原因。


5. 代码质量分析

接下来,评估编码的质量。该分析验证了智能合约编程的常见最佳安全实践以及更通用的软件工程指南,例如注释、变量命名、代码结构和布局、功能可见性和避免重复代码。


6. 已知漏洞分析

这个阶段是大多数人与智能合约审计相关联的阶段。针对已知漏洞清单执行逐行代码分析,包括:

  • 重入

  • 可变阴影

  • 存储指针漏洞

  • 上溢和下溢

  • 潜在的拒绝服务攻击

  • 块气体限制问题

  • 时间戳依赖

  • 不安全的随机数生成

  • 不正确的加密签名验证

  • 交易排序假设


发现的任何问题都将根据严重程度标记为严重、主要和次要。


7. 功能分析

许多智能合约漏洞可以在影响合约功能的简单编程错误中找到。因此,我们执行另一行代码分析以验证代码的正确行为。


通常,此步骤涉及验证智能合约的数学。常见错误包括由于整数运算导致的舍入印象,或公式中的错误。另一个可能导致错误的原因是访问和权限管理。


8. 现场测试

前两个步骤通常在边缘情况下的可利用性或正确功能方面留下未解决的问题。根据问题的复杂性,我们可能会决定在本地测试网络上部署合约并运行我们自己的测试。这可能涉及开发实际的漏洞利用程序来显示合同如何受到攻击。

原文始发于微信公众号(Ots安全):智能合约审计——区块链安全的8个步骤

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月26日02:44:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  智能合约审计——区块链安全的8个步骤 http://cn-sec.com/archives/1050156.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: