一、漏洞简介¶
1.1 漏洞背景¶
RabbitMQ 是一款开源的消息代理软件,广泛应用于分布式系统中进行消息传递。为了便于开发者快速上手和测试,RabbitMQ 在首次启动时会自动创建一个默认用户账户。这个默认账户使用极为简单的凭据,成为攻击者入侵系统的首要目标。
RabbitMQ 默认创建的用户名为 guest,密码也为 guest。这种设计初衷是为了方便开发环境的快速部署,但在生产环境中若未及时修改,将造成严重的安全隐患。
1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)¶
| 项目 | 内容 |
|---|---|
| 漏洞编号 | 暂无统一编号 |
| 危害等级 | 暂未找到权威信息 |
| 漏洞类型 | 默认弱口令 guest/guest |
| 披露时间 | 暂未找到权威信息 |
| 影响组件 | RabbitMQ 安全 |
| 属性 | 描述 |
|---|---|
| CVE 编号 | 无特定 CVE(配置缺陷) |
| 危害等级 | 高危 |
| CVSS 评分 | 约 7.5-9.0(视具体环境而定) |
| 漏洞类型 | 弱口令/默认凭据 |
危害说明: - 攻击者可利用默认凭据获取消息队列的完全控制权 - 可读取、篡改、删除队列中的敏感消息 - 可创建后门账户或修改系统配置 - 可能导致数据泄露和服务中断
核验说明:该问题未见统一 CVE 编号,本文结合原文与公开资料进行整理。
二、影响范围¶
2.1 受影响的版本¶
所有 RabbitMQ 版本在默认安装情况下都会创建 guest/guest 账户,包括: - RabbitMQ 3.x 全系列 - RabbitMQ 4.x 全系列
2.2 不受影响的版本¶
不存在不受影响的版本。所有版本都存在此默认行为,但可以通过配置消除风险。
2.3 触发条件(如特定模块、特定配置、特定运行环境等)¶
- RabbitMQ 首次启动:当服务器检测到数据库未初始化或被重置时,会创建默认用户
- 未修改默认凭据:管理员未更改 guest 用户的密码或未删除该用户
- 允许远程连接:虽然默认情况下 guest 用户只能从 localhost 连接,但错误配置可能允许远程访问
关键配置项:
# 默认配置 - guest 只能本地连接
loopback_users = guest
# 危险配置 - 允许 guest 远程连接(强烈不推荐)
loopback_users = none
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
- 初始化阶段:RabbitMQ 节点首次启动时检测到空数据库
- 默认创建:系统自动创建
guest用户,密码为guest - 权限授予:guest 用户被授予虚拟主机
/的完全访问权限 - 认证绕过:若
loopback_users配置为none,攻击者可远程使用 guest 凭据登录
攻击流程:
攻击者扫描 15672 端口(管理界面)
↓
发现 RabbitMQ 服务
↓
尝试使用 guest/guest 登录
↓
若成功,获取管理员权限
↓
读取/篡改消息、创建后门账户
3.2 源码层面的根因分析(结合源码与补丁对比)¶
在 RabbitMQ 源码中,默认用户的创建发生在节点初始化阶段:
相关源码位置(简化示意):
%% rabbit_boot_steps.erl 或类似初始化模块
%% 当检测到空数据库时创建默认用户
create_default_user() ->
case is_blank_node() of
true ->
Username = get_env(default_user, "guest"),
Password = get_env(default_pass, "guest"),
create_user(Username, Password),
grant_permissions(Username, "/", ".*", ".*", ".*"),
set_loopback_users([Username]);
false ->
ok
end.
配置读取逻辑:
%% 从 rabbitmq.conf 读取配置
get_loopback_users() ->
case config:get(loopback_users) of
none -> []; % 允许所有连接
Users -> Users % 限制为指定用户
end.
认证检查逻辑:
%% rabbit_access_control.erl(简化)
check_loopback_user(User, ConnInfo) ->
LoopbackUsers = get_loopback_users(),
case lists:member(User, LoopbackUsers) of
true ->
%% 检查是否为本地连接
IsLoopback = is_loopback_address(ConnInfo#connection.peer_host),
case IsLoopback of
true -> allow;
false -> {refused, "user '" ++ User ++ "' can only connect via localhost"}
end;
false -> allow
end.
补丁/修复建议的源码层面:
- 在生产环境模板中强制要求设置自定义凭据
- 添加启动时警告日志提醒修改默认密码
- 提供 definitions 文件预配置机制避免默认创建
四、漏洞复现(可选)¶
4.1 环境搭建¶
# 使用 Docker 快速搭建测试环境
docker run -d --name rabbitmq-test \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:3-management
# 等待服务启动
sleep 30
# 检查服务状态
docker logs rabbitmq-test
4.2 PoC 演示与测试过程¶
方法一:管理界面登录测试
# 访问管理界面
# 浏览器打开: http://localhost:15672
# 尝试登录:
# 用户名: guest
# 密码: guest
方法二:HTTP API 测试
# 使用 curl 测试默认凭据
curl -u guest:guest http://localhost:15672/api/whoami
# 成功响应示例:
# {"current_user":"guest","tags":["administrator"],...}
# 获取所有用户列表
curl -u guest:guest http://localhost:15672/api/users
# 获取所有队列
curl -u guest:guest http://localhost:15672/api/queues
方法三:远程连接测试(需错误配置)
# Python 测试脚本
import pika
# 尝试使用默认凭据连接
credentials = pika.PlainCredentials('guest', 'guest')
parameters = pika.ConnectionParameters(
host='target-ip',
port=5672,
virtual_host='/',
credentials=credentials
)
try:
connection = pika.BlockingConnection(parameters)
print("[!] 成功使用 guest/guest 连接!")
connection.close()
except Exception as e:
print(f"[-] 连接失败: {e}")
方法四:使用 nmap 扫描
# 扫描 RabbitMQ 服务
nmap -p 15672 --script http-auth <target-ip>
# 输出示例(若存在弱口令):
# 15672/tcp open http
# | http-auth:
# | HTTP/1.1 401 Unauthorized
# | Basic realm=RabbitMQ Management
# | Credentials guessed: guest:guest
五、修复建议与缓解措施¶
5.1 官方版本升级建议¶
虽然此问题不是软件缺陷,但建议使用最新版本以获得更好的安全提示功能。
5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)¶
方案一:删除或禁用 guest 用户
# 删除 guest 用户(推荐)
rabbitmqctl delete_user guest
# 或者修改 guest 密码
rabbitmqctl change_password guest "your-strong-password-here"
方案二:创建新管理员并删除 guest
# 1. 创建新管理员用户
rabbitmqctl add_user admin "StrongP@ssw0rd!2024"
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# 2. 删除 guest 用户
rabbitmqctl delete_user guest
方案三:使用配置文件预定义用户
在 rabbitmq.conf 中配置:
# 覆盖默认凭据(节点首次启动前配置)
default_user = my_admin
default_pass = $(openssl rand -hex 32)
方案四:使用 definitions 文件导入
{
"users": [
{
"name": "admin",
"password_hash": "hashed_password_value",
"hashing_algorithm": "rabbit_password_hashing_sha256",
"tags": "administrator"
}
],
"permissions": [
{
"user": "admin",
"vhost": "/",
"configure": ".*",
"write": ".*",
"read": ".*"
}
]
}
方案五:网络层防护
# iptables 限制管理端口访问
iptables -A INPUT -p tcp --dport 15672 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 15672 -j DROP
# 仅允许本地访问管理界面
iptables -A INPUT -p tcp --dport 15672 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 15672 -j DROP
六、参考信息 / 参考链接¶
6.1 官方安全通告¶
- RabbitMQ Access Control 官方文档:https://www.rabbitmq.com/docs/access-control
- RabbitMQ 生产环境检查清单:https://www.rabbitmq.com/docs/production-checklist
6.2 其他技术参考资料¶
- OWASP Weak Password Guide
- RabbitMQ Security Best Practices
- CVE 数据库相关配置缺陷记录