一、漏洞简介¶
1.1 漏洞背景¶
CVE-2023-37582 是对 CVE-2023-33246 修复不完整的绕过漏洞。官方在 5.1.1/4.9.6 版本中修复了 CVE-2023-33246,但安全研究人员发现 NameServer 组件的修复并不完整,仍存在远程命令执行风险。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | CVE-2023-37582 |
| 危害等级 | CRITICAL / 9.8 |
| 漏洞类型 | 远程代码执行漏洞 |
| 披露时间 | 2023-07-12 |
| 影响组件 | Apache RocketMQ 安全 |
| 属性 | 详情 |
|---|---|
| CVE编号 | CVE-2023-37582 |
| 漏洞类型 | 远程代码执行(RCE)/ 代码注入 |
| 危害等级 | 严重(Critical) |
| CVSS评分 | NVD暂未公布官方评分,评估为 9.8(严重) |
| CWE分类 | CWE-94:代码生成控制不当(代码注入) |
| 影响组件 | NameServer |
漏洞描述:RocketMQ NameServer 组件在 5.1.1 版本中对 CVE-2023-33246 的修复不完整。当 NameServer 地址泄露到外网且缺乏权限验证时,攻击者可以通过 NameServer 组件的配置更新功能执行任意命令。
<hr />补充核验信息:公开时间:2023-07-12;NVD 评分:9.8(CRITICAL);CWE:CWE-94。
二、影响范围¶
2.1 受影响的版本¶
| 版本系列 | 受影响版本 |
|---|---|
| RocketMQ 5.x | 5.1.1 及以下版本 |
| RocketMQ 4.x | 4.9.6 及以下版本 |
注意:虽然 5.1.1/4.9.6 修复了 Broker 组件的漏洞,但 NameServer 组件仍受影响。
2.2 不受影响的版本¶
| 版本系列 | 安全版本 |
|---|---|
| RocketMQ 5.x | 5.1.2 及以上 |
| RocketMQ 4.x | 4.9.7 及以上 |
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- NameServer 暴露:NameServer 组件(端口9876)可从外网访问
- 缺乏权限验证:未启用 ACL 或认证机制
- 配置更新接口可用:攻击者可调用
UPDATE_NAMESRV_CONFIG接口
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
CVE-2023-37582 的根本原因在于 CVE-2023-33246 的修复补丁未完全覆盖 NameServer 组件的配置更新处理逻辑。
漏洞根因:
- 修复补丁主要针对 Broker 组件
- NameServer 的 DefaultRequestProcessor 中处理 UPDATE_NAMESRV_CONFIG 请求的代码路径未完全限制敏感配置项的更新
- 某些配置路径参数(如 configStorePathName、kvConfigPath)仍可被远程修改
3.2 源码层面的根因分析(结合源码与补丁对比)¶
修复补丁分析(Commit: c3ada731405c5990c36bf58d50b3e61965300703):
补丁增加了对以下配置项的保护:
- configStorePathName
- kvConfigPath
测试用例显示的修复逻辑:
@Test
public void testProcessRequest_UpdateConfigPath() throws RemotingCommandException {
final RemotingCommand updateConfigRequest = RemotingCommand.createRequestCommand(
RequestCode.UPDATE_NAMESRV_CONFIG, null);
Properties properties = new Properties();
// 尝试更新禁止的配置项
properties.setProperty("configStorePathName", "test/path");
updateConfigRequest.setBody(MixAll.properties2String(properties).getBytes(StandardCharsets.UTF_8));
RemotingCommand response = defaultRequestProcessor.processRequest(null, updateConfigRequest);
// 验证返回权限拒绝
assertThat(response.getCode()).isEqualTo(ResponseCode.NO_PERMISSION);
assertThat(response.getRemark()).contains("Can not update config path");
}
完整修复: 在 5.1.2/4.9.7 版本中,官方对 NameServer 的配置更新处理进行了完整修复,确保所有涉及路径的敏感配置项都无法通过远程接口修改。
<hr />四、漏洞复现(可选)¶
4.1 环境搭建¶
使用受影响的 5.1.1 或 4.9.6 版本:
# 拉取受影响版本
docker pull apache/rocketmq:4.9.6
# 启动 NameServer
docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.6 sh mqnamesrv
4.2 PoC 演示与测试过程¶
针对 NameServer 的攻击:
与 CVE-2023-33246 类似,但目标端口为 NameServer 端口(9876):
# 构造针对 NameServer 的配置更新请求
payload = "configStorePathName=/tmp/malicious\nkvConfigPath=/tmp/malicious"
# 发送到 NameServer 端口 9876
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
必须升级到完整修复版本:
| 当前版本 | 升级目标版本 |
|---|---|
| RocketMQ 5.x ≤ 5.1.1 | 升级至 5.1.2 或更高版本 |
| RocketMQ 4.x ≤ 4.9.6 | 升级至 4.9.7 或更高版本 |
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
1. 网络访问控制
# 严格限制 NameServer 端口访问
iptables -A INPUT -p tcp --dport 9876 -s <内网可信网段> -j ACCEPT
iptables -A INPUT -p tcp --dport 9876 -j DROP
2. 启用 ACL 在 NameServer 配置中启用访问控制,仅允许可信来源的配置更新请求。
3. 监控与审计 监控 NameServer 日志中的配置更新记录,及时发现异常行为。
<hr />六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- Apache 官方公告:https://lists.apache.org/thread/m614czxtpvlztd7mfgcs2xcsg36rdbnc
- oss-security 邮件列表:http://www.openwall.com/lists/oss-security/2023/07/12/1
6.2 其他技术参考资料¶
- NVD 漏洞数据库:https://nvd.nist.gov/vuln/detail/CVE-2023-37582