L1协议和智能合约的模糊测试:检测漏洞

  • hacken
  • 发布于 2025-07-01 20:30
  • 阅读 10

本文深入探讨了Layer 1协议测试的复杂性,并着重介绍了模糊测试(Fuzzing)作为一种有效的解决方案,用于发现和缓解区块链系统协议层的安全漏洞。文章还分享了Hacken团队在Minima项目中使用模糊测试发现关键漏洞的案例,并讨论了模糊测试的优缺点,强调了其在区块链安全审计中的重要作用。

更新于:2025年6月30日

5 分钟阅读

作者:Oleh Malanii

Layer 1(L1)协议是区块链系统的骨干,对于共识算法、交易格式和数据结构至关重要。然而,测试 L1 协议是一项复杂且具有挑战性的任务,因为它们具有错综复杂、相互依赖的组件。在本文中,我们将讨论测试 L1 协议的难点,并探讨模糊测试如何成为发现和缓解区块链系统协议层中的安全漏洞的有效解决方案。

模糊测试概述

什么是模糊测试?

模糊测试是一种用于区块链协议和智能合约的自动化测试技术。它生成大量半随机输入,并将它们提供给被测系统。模糊测试的目标是通过触发系统中意外或无效的行为来发现安全漏洞

L1 模糊测试

模糊测试是 layer 1 审计的一个很棒的工具,特别是在测试虚拟机时,因为它可以自动化许多步骤,以确保 L1 的安全性和稳定性。最好的是,数据并不像看起来那么随机。Fuzzer 使用代码覆盖率来检查哪些输入有效,哪些无效。通过这样做,它可以揭示用人眼不可能发现的非常有价值的见解。

智能合约模糊测试

对于智能合约,模糊测试涉及分析 ABI 或字节码,为其函数生成随机化的有效输入,使用这些输入执行合约,并检查结果以识别和报告任何弱点。

模糊测试的主要挑战:构建模糊测试目标

模糊测试是一种强大的测试方法,尤其是在大规模使用时,但它需要大量的资源和时间。构建模糊测试目标是最大的挑战,因为它需要大量的手工工作:

  1. 对目标进行 token 化
  2. 使用特定的格式
  3. 将所有内容上传到云端

为了确保高度的一致性并节省我们的一些时间,我们使用一个名为 Hacken-Fuzz 的工具自动化了目标构建。

我们的 Hacken-Fuzz 工具可以自动化设置模糊测试目标的所有流程。它适用于 C、C+、Rust、Go、JavaScript、JVM、Swift 和 Python。Hacken-Fuzz 非常有效,因为它一次运行 50 台服务器,这要归功于我们基于 OSS-Fuzz 的基础设施。

用例:何时合理使用模糊测试

有了正确的基础设施,你可以用模糊测试做很多了不起的事情,例如,使用它来检测手动无法检测到的代码错误。这些包括导致节点崩溃的严重弱点,例如无限循环、缓冲区溢出、不受控制的内存分配等。查找和解决这些漏洞可以保护区块链免受各种协议层攻击,例如远程攻击、51% 攻击和竞争攻击。

对于智能合约,模糊测试在整数溢出/下溢、拒绝服务可能性、token 经济学验证、gas 相关问题、委托调用验证和 重入 方面特别有用。

模糊测试在执行大型、耗时的操作或验证手动分析以识别误报和被忽视的问题时特别有用。虽然模糊测试是一种有价值的测试工具,但不应将其视为彻底审计的全面替代品。

模糊测试解决了哪些挑战,如何解决?

在 Hacken,我们相信模糊测试是探索 L1 协议中安全漏洞的有效方法,原因如下。

模拟用户行为。模糊测试可以通过生成模拟用户行为的随机输入来模拟真实世界的场景。这意味着模糊测试可以测试系统针对各种攻击的鲁棒性,包括那些难以预测的攻击。

查找隐藏的漏洞。模糊测试可以找到其他测试方法可能遗漏的安全漏洞**。例如,手动测试或静态分析可能无法检测到某些类型的逻辑错误或需要极端输入的竞争条件。

L1 中的可扩展性。模糊测试可以扩展以处理 L1 协议的复杂性及其相互依赖的组件。模糊测试可以生成许多输入并探索各种执行路径,从而增加发现安全漏洞的机会。

模糊测试的实践应用:Minima 案例

Hacken 模糊测试在我们作为审计员的日常工作中证明了它的价值。我将分享我们为客户 Minima 进行的区块链协议审计的一些细节。Minima 是一个 Java 项目,完全从头开始为智能手机构建区块链。他们自己开发了一切,包括虚拟机和它的语言。我们用模糊测试工具发现了十几个严重问题,这些问题后来经过手动验证。我们的客户修复了所有漏洞,所以我们可以安全地在这里讨论它们。

因此,我们使用模糊测试发现了以下严重漏洞

01. 使用常量表达式的具有无法访问的退出条件的循环,又名无限循环。
02. 两个关于 NULL 指针解引用的问题。
03. 由于递归解析使用堆栈中所有空间的智能合约,导致堆栈缓冲区溢出,从而导致 VM 崩溃。
04. 另一个堆栈缓冲区溢出是由于缺少括号限制而导致崩溃。
05. 在十六进制值中进行位移的不受控制的内存分配。
06. 在幂函数期间分配具有过大尺寸值的内存。
07. 当在通用函数中递归替换给定脚本的参数时,资源消耗会使节点崩溃。
08. 多次调用 concat 函数时不受控制的内存分配。
09. replace 函数也有类似的问题,它允许字符串呈指数增长。它将 “A” 替换为 AA”,所以长时间这样做会使内存崩溃。
10. 子集函数中的整数溢出,因为可以指定起始位置高于结束位置。创建一个巨大的字符串会消耗所有内存。

查看包含详细描述和流程的完整审计报告 此处

这些都是严重的错误(即,危险到足以使虚拟机崩溃)。手动无法完成,因为只有机器才能将测试推向极端,例如连接占用 2GB 内存的字符串或检查无限数量。

模糊测试的缺点

尽管模糊测试具有所有优点,但它不是万能药;你需要完整的审计和知识渊博的开发人员来审查和验证代码错误。最重要的是,fuzzer 从一开始就不会发现所有的错误。以下是模糊测试的一些最紧迫的挑战:

你需要修复发现的问题,否则模糊测试将找不到其他任何内容。模糊测试的问题是,在发现一个严重问题后,你必须修复它,否则 fuzzer 会一次又一次地遇到相同的问题,而不会揭示代码库可能具有的所有问题。显然,我们不希望这样,所以你必须在进行过程中修复每个检测到的项目。所以你修复了这个问题,然后你再次进行模糊测试。你可能会认为这是一个问题,但它也是实际解决发现的弱点的一个很好的推动因素。

复杂错误的问题。模糊测试很难应用于需要多个步骤才能执行的错误。例如,如果一个错误需要执行三个事务,模糊测试可能就无法检测到它,因为生成这样的输入很困难。

耗时。生成许多输入并探索各种执行路径可能需要大量时间,尤其对于复杂的 L1 协议。此外,我们不确切知道每种类型的漏洞需要多长时间。

可能会遗漏逻辑错误(除非专门为此设计)。如果系统没有设计为检测它们,模糊测试可能找不到逻辑错误。例如,如果系统没有适当的错误处理机制,模糊测试可能无法检测到导致意外行为的逻辑错误。

有状态组件的问题。模糊测试有状态组件需要跟踪系统的状态,这可能具有挑战性,尤其对于复杂的 L1 协议。很难判断 fuzzer 是否有能力检测到问题。

多线程应用程序的问题。最后,模糊测试很难应用于多线程应用程序,因为它需要跟踪系统的并发性,这可能具有挑战性,尤其对于复杂的 L1 协议。

结论

模糊测试是一个很棒的 区块链审计 工具,在测试虚拟机时特别有用,因为它可以自动化许多流程。在半随机测试中,没有人能打败 fuzzer。然而,你仍然需要 50-100+ 台服务器才能使其有效,当然还需要设置目标的专业知识,但谢天谢地,我们在 Hacken 已经建立了必要的能力。

但是,不要误解我的意思——模糊测试不能替代手动审查,只是使其更有效。你仍然需要一位知识渊博、经验丰富且值得信赖的区块链审计师来验证在模糊测试期间发现的问题,检测无法通过随机输入生成发现的问题,并为所有错误推荐适当的代码修复。

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

0 条评论

请先 登录 后评论
hacken
hacken
江湖只有他的大名,没有他的介绍。