如何比较虚拟机

  • mixbytes
  • 发布于 2024-09-25 23:23
  • 阅读 21

文章详细介绍了在以太坊类似虚拟机中存在的潜在漏洞,包括通过恶意交易导致区块链关闭的风险、precompile的不正确实现及网络攻击的可能性。作者分析了 Aptos VM 和 Avalanche 的具体例子,探讨了如何检测与此相关的安全漏洞,提供了多种分析工具的链接,内容深度和逻辑性较强。

作者: Alexey Naberezhniy - MixBytes 的安全研究员

在具有类似以太坊虚拟机的区块链中存在哪些潜在的漏洞?

由于发送恶意交易而导致的区块链完全关闭

区块链是一个开放系统,允许用户发送将通过虚拟机处理的任何交易。区块链中可能存在的一个潜在漏洞是缺乏对用户发送的有效负载的验证,这可能导致网络完全停止,因为区块生产者无法处理此操作。

Aptos 虚拟机中的错误示例

以下命令会导致 Aptos 虚拟机中潜在的问题:

Bytecode::VecPack(si, num)
Bytecode::VecUnpack(si, num)

这些操作码与堆栈的交互,导致用户能够将 num (u64) 元素添加到堆栈中(在以太坊虚拟机中是不可行的,因为 PUSH 操作码是有等限制的)。

在代码的这个地方,造成溢出的情况是可能的,因为 num_pushes 没有经过任何验证:

https://github.com/aptos-labs/move/blob/97a771cb6a2414ef3a68d71aef8f0bc6aac61ef2/language/move-bytecode-verifier/src/stack_usage_verifier.rs#L60

在这个地方调用溢出不会导致资金被盗,但会导致节点出现严重错误,因此整个区块链都会出现故障。由于 Aptos 是一个新网络,这可能会使整个网络在此时停机。为了做到这一点,一个黑客只需发送一笔恶意交易即可。以太坊不易受到此类漏洞的影响,因为存在多种替代链节点实现。

来源: https://learnblockchain.cn/article/12427

预编译的不正确实现

为了优化智能合约的执行,节点链开发员添加了可以直接从虚拟机利用的附加功能,以加快某些复杂功能的速度(例如 sha3,ecrecover 等)。最容易理解的例子是 JNI,用于直接与本机代码通信的 Java 字节码

预编译实现的示例:

某些预编译的实现可能包含重大错误,这通常会导致严重错误(例如 DoS、访问控制等)。

Avalanche 中预编译的错误示例

导致一些智能合约无法正常工作的预编译错误如下所示:

https://github.com/ava-labs/coreth/blob/8543a81bfd8e7812c181ff4fade6405396b0a1d6/core/vm/evm.go#L747

// https://snowtrace.io/address/0x0100000000000000000000000000000000000000

func (evm *EVM) NativeAssetCall(caller common.Address, input []byte, suppliedGas uint64, gasCost uint64, readOnly bool) (ret []byte, remainingGas uint64, err error) {
    if suppliedGas < gasCost {
        return nil, 0, vmerrs.ErrOutOfGas
    }
    remainingGas = suppliedGas - gasCost

    ...

    // 将 [assetAmount] 的 [assetID] 发送到 [to] 地址
    evm.Context.TransferMultiCoin(evm.StateDB, caller, to, assetID, assetAmount)
    ret, remainingGas, err = evm.Call(AccountRef(caller), to, callData, remainingGas, new(big.Int))

    ...
}

由于预编译中的错误而易受到攻击的智能合约代码:

https://github.com/Abracadabra-money/magic-internet-money/blob/23266d17969a95e69199670cba9d0060bff33340/contracts/CauldronV3_1.sol#L410

...
require(callee != address(bentoBox) && callee != address(this), "Cauldron: can't call");

(bool success, bytes memory returnData) = callee.call{value: value}(callData);
...

在调用 callee.call 之前,有一个对 callee != address(bentoBox) 的检查,这限制了对 bentoBox 的调用。但是,如果我们调用合约 0x0100000000000000000000000000000000000000,并将调用传递给 bentoBox,则可以绕过 require 检查。

在披露此漏洞后,此预编译被排除在节点之外。

来源: https://learnblockchain.cn/article/12426

网络攻击

每个区块链节点以某种方式与外部世界交互。有很多接口,例如:RPC、管理接口等。攻击者也可以通过这些接口对网络发起攻击。

示例:

如何检查这些类型的漏洞?

有几种方法可以发现类似以太坊虚拟机的漏洞:

MixBytes 是谁? MixBytes 是一支专家区块链审计师和安全研究员团队,专注于为 EVM 兼容和 Substrate 基础的项目提供全面的智能合约审计和技术咨询服务。加入我们在 X 上,与时俱进,获取最新的行业趋势和见解。

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

0 条评论

请先 登录 后评论
mixbytes
mixbytes
Empowering Web3 businesses to build hack-resistant projects.