RSKJ服务器拒绝服务漏洞分析与修复

本文详细分析了Rootstock区块链平台RSKJ服务器存在的拒绝服务漏洞,包括漏洞复现步骤、根本原因分析以及最终的修复方案,涉及UDP协议处理异常和内存耗尽问题。

RSKJ服务器拒绝服务漏洞报告

漏洞摘要

攻击者通过发送特制的UDPv6数据包可导致RSKJ服务器停止处理网络流量,最终引发内存耗尽崩溃。

复现步骤

  1. 下载受影响版本:https://github.com/rsksmart/rskj/releases/download/FINGERROOT-5.0.0/rskj-core-5.0.0-FINGERROOT-all.jar
  2. 服务端运行:
1
java -classpath rskj-core-5.0.0-FINGERROOT-all.jar -Drpc.providers.web.cors=* -Drpc.providers.web.ws.enabled=true co.rsk.Start
  1. 该命令会开放UDPv6端口5050
  2. 客户端安装Python3及pysha3库,使用PoC脚本攻击服务端
  3. 服务器将永久处理单个UDP数据包,拒绝其他节点请求,数分钟后应用崩溃

根本原因

bytesToLength函数返回-5导致length变为0:

1
2
3
4
5
6
// RLP.java第432行
bytesToLength返回-5
// 第440行
该返回值被合法接受
// 第403-405行
position变量无法更新

影响

  • UDPv6端口5050停止处理入站流量
  • 最终导致内存耗尽崩溃
  • 由于decode2函数的广泛使用,可能影响其他服务入口点

修复方案

  1. 限制bytesToLength仅返回非负值
  2. 添加长度校验(建议):
1
2
if(size > Integer.BYTES)
    throw new Exception(...);

修复提交

https://github.com/rsksmart/rskj/commit/6965fa60f743d911ee106b542cec80a1417266b1

漏洞奖励

$5,000

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