Rootstock智能合约执行延迟漏洞分析:巨大错误字符串构造导致网络延迟

本文详细分析了Rootstock平台中由于NativeContract.execute方法构造超大十六进制错误消息导致的严重性能问题,攻击者可通过特制输入使合约执行延迟约23秒,包含完整复现步骤和修复方案。

漏洞报告 #2559404:精心构造的智能合约因巨大错误字符串构造导致约23秒执行延迟

时间线

  • guido 向 Rootstock Labs 提交报告 - 2024年6月18日 20:18 UTC
  • Rootstock Labs 确认分析中 - 2024年6月19日 10:31 UTC
  • Rootstock Labs 确认正在修复 - 2024年6月24日 09:20 UTC
  • 漏洞修复确认 - 2024年7月13日 19:29 UTC
  • 奖励发放 - 2024年7月17日 14:12 UTC
  • 报告披露 - 2025年6月12日 18:52 UTC

技术详情

问题描述

调用原生合约(rskj-core/src/main/java/co/rsk/pcc/NativeContract.java)时,通过无效的大输入(1081344字节)在无限循环中执行(直到gas耗尽),在测试机器上耗时约70秒(预计在目标机器上约23秒),比先前报告(https://hackerone.com/reports/2489843)略快。

根本原因

NativeContract.execute 方法为日志记录和异常抛出将整个输入消息构造为十六进制字符串:

1
String errorMessage = String.format("Invalid data given: %s.", ByteUtil.toHexString(data));

如果将上述代码修改为:

1
String errorMessage = String.format("Invalid data given: %s.", "");

复现程序在大约4.4秒内完成(测试机器上)。

复现步骤

以下复现程序禁用了日志记录;如果在生产节点上默认启用,耗时可能更长。

  1. 环境准备
1
2
3
4
5
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/
  1. 构建配置修改
1
2
3
4
5
6
echo "task testJar(type: Jar) {" >>rskj-core/build.gradle
echo "    from sourceSets.test.output" >>rskj-core/build.gradle
echo "    classifier = 'tests'" >>rskj-core/build.gradle
echo "}" >>rskj-core/build.gradle
echo "assemble.dependsOn(testJar)" >>rskj-core/build.gradle
./configure.sh
  1. 禁用日志记录
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <root level="OFF">
    </root>
</configuration>
  1. 构建RSKJ
1
./gradlew assemble
  1. 创建复现程序(Poc.java) 完整Java代码详见原始报告

  2. 编译和运行

1
2
$JAVA_HOME/bin/javac -cp rskj-core/build/libs/rskj-core-6.3.0-SNAPSHOT-tests.jar:rskj-core/build/libs/rskj-core-6.3.0-SNAPSHOT-all.jar Poc.java
time $JAVA_HOME/bin/java -cp .:rskj-core/build/libs/rskj-core-6.3.0-SNAPSHOT-tests.jar:rskj-core/build/libs/rskj-core-6.3.0-SNAPSHOT-all.jar Poc

影响

  • 网络延迟阻塞

修复状态

参与者

  • 报告者:guido (ID验证通过)
  • 处理团队:Rootstock Labs (vrongusername, bernacodesido)
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计