Back to Blog

安全检查:EVM 兼容链经得起考验吗?

Code Auditing
January 4, 2024
6 min read

2023 年 11 月,BlockSec 首席执行官周亚金教授受邀参加了由 DRK Lab 主办的首届 Web3 学者峰会(Web3 Scholars Summit)。在会议期间,周教授分享了 BlockSec 在检测 EVM(以太坊虚拟机)漏洞方面的工作与成果。他还介绍了 BlockSec 专门为确保 EVM 兼容链安全而设计的自动化差分模糊测试(Differential Fuzzing)工具。本文对演讲内容进行了总结。

简介

根据 Defillama 的数据统计,目前存在 238 条 L1 和 L2 公链,其中 144 条是兼容 EVM 的。然而,问题随之而来:这些兼容 EVM 的链在实现过程中是否存在安全问题?经过我们的研究,答案是肯定的。针对这一担忧,BlockSec 推出了自动化差分模糊测试安全工具。让我们一同开启探索这些 EVM 兼容链背后真相的旅程。

虚拟机中的漏洞

图 1:以太坊虚拟机 (EVM) 工作流程图
图 1:以太坊虚拟机 (EVM) 工作流程图

以以太坊虚拟机 (EVM) 为例,它采用基于栈的架构,包括虚拟 ROM、程序计数器、栈、内存和世界状态(持久化存储)。

虚拟机是解释和执行智能合约编译后二进制代码的引擎。许多区块链平台的核心组件都是虚拟机,其中以太坊虚拟机 (EVM) 尤为引人注目。因此,虚拟机在执行智能合约、处理交易以及确保区块链完整性方面发挥着关键作用。

我们知道,EVM 本身也是由程序员编写的软件程序。但是,我们如何确保 EVM 没有问题呢?毕竟,人类编写的任何代码都可能存在错误。

一旦 EVM 出现漏洞,将对区块链生态系统造成灾难性的后果。事实上,EVM 过去曾遇到过许多严重的漏洞。

例如,2020 年曾发生过一起由预编译合约引起的漏洞事件(即 CVE-2020-26241)[1]。Geth 中的 dataCopy 预编译合约(位于 0x00...04)在调用期间执行了浅拷贝,即复制大量数据时只复制了指针而非完整数据。这使得恶意的智能合约能够修改本不该被修改的数据,导致不同版本的虚拟机在执行同一智能合约时出现数据不一致。另一个例子发生在 2021 年,当时一些 EVM 兼容链没有随以太坊同步升级。在旧版本的 Geth 中存在一个漏洞(CVE-2021-39137)[2],预编译合约调用中的输入和输出数据内存区域存在重叠。攻击者利用这一漏洞导致了链分叉。

BlockSec 的应对措施

如何及时发现 EVM 中的漏洞?其挑战是什么?

  1. 首先,由于虚拟机设计复杂,很难找到能够完全理解其运行逻辑的工具。术语专业性要求高,许多开发人员可能无法投入足够的精力和资源去理解其运行逻辑并采取有效的防范措施。

  2. 此外,许多 L1/L2 新公链对 EVM 虚拟机进行了定制化,这可能会引入新的安全问题。

显然,仅依靠人工审计来识别 EVM 虚拟机上的这些问题是非常困难的。

我们必须因地制宜,做出响应!针对这些挑战,BlockSec 开发了一套自动化系统来直接应对这些问题!

差分模糊测试

在 BlockSec,我们的专家团队采用了称为“差分模糊测试”的巧妙方法。通过在不同版本的虚拟机上执行相同的测试用例并比较输出结果,我们可以发现潜在的漏洞和不一致之处。这种方法使我们能够有效地识别传统测试方法可能忽略的细微差异,从而增强系统的整体安全性。

图 2:差分模糊测试工作流程
图 2:差分模糊测试工作流程

基本工作原理:

为了进行差分模糊测试,我们需要准备相同的输入作为测试用例。这些测试用例会被输入到差分模糊测试引擎中。通过比较同一测试用例在不同虚拟机版本上执行的输出结果,我们可以识别潜在的问题。

具体实施步骤:

差分模糊测试的测试用例需要由两部分组成:交易元数据和预状态(pre-state)。但我们如何生成这些交易呢?我们有两种方法来应对这一挑战。

  1. 复用历史交易:我们可以检索区块链上发生的历史交易,并将它们放入差分模糊测试引擎中,通过不同版本的虚拟机运行。然而,仅依赖这种方法是有局限性的。历史交易往往太“常规”,而安全测试需要发现极端情况——即那些异常场景。这就是为什么我们提出了第二种方法。
  2. 基于覆盖率的模糊测试(Coverage-guided fuzzing):我们从零开始生成非常见的字节码和历史上未见过的交易,然后对这些交易和智能合约代码进行变异,并将它们输入到虚拟机中。我们通过多个维度确保测试用例的有效性和全面性。

一旦生成这些交易,它们就会被喂入差分模糊测试引擎,随后对比其结果。

结果的比较不仅仅是简单的数值对比,还综合考虑了虚拟机中持久化和非持久化存储中的数据一致性。本文不再进行深入阐述。

案例研究

图 3:Aurora VM 中预编译合约 *ModExp* 问题的示例
图 3:Aurora VM 中预编译合约 ModExp 问题的示例

我想分享一个我们通过差分模糊测试在 Aurora VM 中发现的虚拟机漏洞案例。具体来说,它涉及 ModExp 预编译智能合约的问题。

在计算数字 x 的 y 次幂的模幂运算时,我们知道该操作需要消耗计算资源。在正确的实现中,Gas 计算考虑了迭代次数,因为模幂运算涉及多次迭代。然而,有一种特殊情况下的 Gas 计算可能会出现问题:当指数 y 等于 0 时,表示零阶幂运算。在这种情况下,迭代次数变为零,导致 Gas 值极小。但实际上,该计算仍然需要资源。

结论

目前,BlockSec 推出的差分模糊测试工具已支持在多种区块链虚拟机环境中执行,包括 rbpfubpfAurora-engineneon-evmMoonbeamrevm、EvmOS、fevmPolygon-zkevm,并且正在持续扩展中。

利用此工具,我们已经发现了 14 个新漏洞,申请了 2 个 CVE:CVE-2021–46102CVE-2022–23066,并获得了超过 130 万美元的漏洞赏金。

目前,BlockSec 提供的 comprehensive EVM 链安全解决方案(审计服务 + 差分模糊测试工具)已获得 EOS 和 FileCoin 的认可与采用,并将为它们生态系统的安全与健康发展做出贡献。

参考资料

[1] Shallow copy in the 0x4 precompile could lead to EVM memory corruption

[2] RETURNDATA corruption via datacopy

关于 BlockSec

BlockSec 是一家开拓性的区块链安全公司,由一群全球顶尖的安全专家于 2021 年创立。公司致力于提升新兴 Web3 世界的安全性和可用性,以促进其大规模普及。为此,BlockSec 提供智能合约和 EVM 链安全审计服务、用于安全开发和主动拦截威胁的 Phalcon 平台、用于资金追踪和调查的 MetaSleuth 平台,以及帮助 Web3 构建者在加密世界中高效冲浪的 MetaDock 扩展插件。

迄今为止,公司已服务超过 300 家知名客户,如 MetaMask、Uniswap Foundation、Compound、Forta 和 PancakeSwap,并从 Matrix Partners、Vitalbridge Capital 和 Fenbushi Capital 等知名投资者处获得了数千万美元的两轮融资。

✉️商务咨询:[email protected]

BlockSec Twitter 账号:https://twitter.com/BlockSecTeam

Phalcon Twitter 账号:https://twitter.com/Phalcon_xyz

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit