
CVE再現: cve-2026-34486-tomcat_encrypt_bypass_reproduction
| フィールド | 値 |
|---|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 HIGH |
| 種別 | 機密データの暗号化の欠如 |
| コンポーネント | Apache Tomcat クラスタ EncryptInterceptor |
| 公開日 | 2026 |
CVE-2026-34486 は、CVE-2026-29146 の不完全な修正によって導入されたリグレッションです。Apache Tomcat のクラスタレプリケーションでは、EncryptInterceptor がクラスタメッセージの暗号化と認証を担当します。CVE-2026-29146 の修正におけるリファクタリングにより、super.messageReceived(msg) の呼び出しが、復号失敗を処理する try-catch ブロックの外に誤って移動しました。その結果、メッセージの復号に失敗した場合(つまり、平文で受信されたがインターセプタが暗号化データを期待している場合)、生の暗号化されていないメッセージは破棄されずにハンドラチェーンに渡されます。
EncryptInterceptor.messageReceived() メソッドは、クラスタメッセージが到着したときに呼び出されます。期待されるフローは次のとおりです:
super.messageReceived(msg) を呼び出して復号済みメッセージを転送する脆弱性のあるバージョンでは、復号・検証ロジックは try-catch にラップされたままですが、呼び出しチェーンが再構築され、super.messageReceived(msg) が復号を保護する try-catch ブロックの外で実行されるようになりました。変数 msg は try-catch の前に宣言され、その中で代入されます。復号が例外をスローすると、msg は初期値(暗号化されていない/生の値)を保持し、catch ブロックはエラーをログに記録するだけで、早期に return しません。未処理の生データを伴って super.messageReceived(msg) への実行が継続されます。
つまり、Tomcat のクラスタポートに到達できる攻撃者は、インターセプタが受け入れて処理する任意の暗号化されていないメッセージを注入できます。
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
修正では、以下のいずれかを保証する必要があります:
super.messageReceived(msg) が復号成功後の try ブロック内でのみ呼び出されるようにする、または| 製品 | バージョン |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor を使用してクラスタレプリケーションを有効にした脆弱性のある Tomcat インスタンス<Receiver> で設定)へのネットワークアクセスserver.xml で EncryptInterceptor が設定されている Tomcat クラスタメンバーを特定します。このディレクトリにある exploit.py スクリプトは、このバイパスを実証します。これは、最小限の Tomcat クラスタメッセージ(ClusterMessage シリアライズ形式に基づく)を構築し、暗号化なしでレシーバーポートに直接送信します。脆弱性のあるインターセプタは、暗号化が欠如しているにもかかわらず、メッセージを受け入れて転送します。
パッチ適用済みの Apache Tomcat バージョンにアップグレードしてください:
| 製品 | パッチ適用済みバージョン |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
直ちにアップグレードできない場合は、Tomcat クラスタポートへのネットワークアクセスを信頼できるホストのみに制限してください(例: ファイアウォールルール、またはレシーバーをループバックやプライベートインターフェースにバインドする)。