
Apache TomcatのCVE-2025-55752ディレクトリトラバーサルをRewrite Valve経由で検出・悪用し、PUTベースのJSPアップロードとリモートコード実行を可能にします。
🚨🚨 CVE-2025-55752 — Apache Tomcat: Rewrite Valve によるディレクトリ保護バイパス → PUT ベースの RCE🚨🚨 概要
CVE-2025-55752 は、Apache Tomcat においてバグ #60013 の修正中に導入されたセキュリティリグレッションです。Rewrite Valve が使用されている場合、Tomcat は URL デコード の前に パス正規化 を適用します。この誤った順序により、StandardContextValve.java で実装されている /WEB-INF/ や /META-INF/ などの保護されたパスに対するアクセスチェックを、巧妙に細工された URI がバイパスできるようになります。サーバーが HTTP PUT リクエストを受け入れる場合(または書き込み可能なファイルアップロードエンドポイントを公開している場合)、攻撃者は悪意のあるアーティファクト(例:.jsp やシリアライズされたセッション)をアップロードし、リモートコード実行(RCE)を達成できます。
🚨 影響を受けるバージョン
リライト/正規化の変更を含む、サポート終了(EOL)となった古い Tomcat ブランチも影響を受ける可能性があります。お使いの特定のディストリビューション/ベンダービルドに対して確認してください。
🚨 影響
PUT(またはその他の書き込み可能なエンドポイント)が有効な場合、または Web アプリケーションが十分な検証なしにファイルアップロードを許可している場合。🚨🚨 技術的詳細(簡潔)
/WEB-INF/ および /META-INF/ に対する StandardContextValve の保護をバイパスする URI を細工します。PUT を受け入れるか、Web アプリケーションのドキュメントルート配下にファイルを配置するファイルアップロードエンドポイントを持つ場合、攻撃者はサーバーが配信/実行する場所に .jsp またはその他の実行可能なコンテンツを書き込むことができ、RCE につながります。修復と防御戦略
即時対応(推奨)
Tomcat を修正済みのサポート対象リリースにアップグレード してください。できるだけ早く:
即時のアップグレードが不可能な場合(一時的な緩和策)
HTTP PUT を無効化 する(サーバー、コネクタ、またはリバースプロキシレベルで。例:Web サーバー設定やファイアウォールルールによる)。
リライトルールを強化/削除 する — 書き込み可能な場所への任意のリライトを許可するルールを削除し、特にクエリパラメータをファイルパスにリライトまたは転送するルールを削除します。
Web アプリケーションでのファイルアップロード処理を強化 する:
/WEB-INF/、/META-INF/、またはアプリケーションのクラスパス配下にファイルを配置しようとするアップロードを拒否します。エクスプロイト URI をフィルタリング/ブロック する(WAF / リバースプロキシの境界で)— /WEB-INF または /META-INF の保護をバイパスしようとする不審なエンコードされたペイロードやパターンをブロックします。
ファイルストアへの最小権限: Web アプリケーションプロセスが、コンテナによって配信または実行されるディレクトリに書き込めないようにします。
機能概要
このツールは、公式の CVE-2025-55752 の説明に基づいて 2 段階の検出を実行します:
Apache Tomcat の Rewrite Valve における、デコード前の URL 正規化の誤った順序を悪用して、/WEB-INF や /META-INF などの保護された場所へのパストラバーサルを試みます。
HTTP PUT を介してテスト用 JSP ファイルのアップロードを試み、保護メカニズムをバイパスしてアップロードされたファイルにアクセスできるかどうかを確認します。
保護されたディレクトリへのパストラバーサルが可能かどうかを確認:
python3 cve_2025_55752_detector.py http://target:8080 --check
JSP ファイルのアップロードを試行し、アクセスバイパスをテスト:
python3 cve_2025_55752_detector.py http://target:8080
🔧 ファイル名とペイロードコンテンツをカスタマイズ:
python3 cve_2025_55752_detector.py http://target:8080 --filename exploit.jsp --payload "<% out.println('PWNED'); %>"