一、漏洞简介

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 触发条件(如特定模块、特定配置、特定运行环境等)

  1. RabbitMQ 首次启动:当服务器检测到数据库未初始化或被重置时,会创建默认用户
  2. 未修改默认凭据:管理员未更改 guest 用户的密码或未删除该用户
  3. 允许远程连接:虽然默认情况下 guest 用户只能从 localhost 连接,但错误配置可能允许远程访问

关键配置项:

# 默认配置 - guest 只能本地连接
loopback_users = guest

# 危险配置 - 允许 guest 远程连接(强烈不推荐)
loopback_users = none

三、漏洞详情与原理解析

3.1 漏洞触发机制

  1. 初始化阶段:RabbitMQ 节点首次启动时检测到空数据库
  2. 默认创建:系统自动创建 guest 用户,密码为 guest
  3. 权限授予:guest 用户被授予虚拟主机 / 的完全访问权限
  4. 认证绕过:若 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 数据库相关配置缺陷记录