
Jellyfin Media Server의 치명적인 경로 순회(path traversal)로 인한 RCE 취약점(CVSS 9.9). 개념 증명(PoC) 익스플로잇, 기술 분석 및 탐지 도구를 포함합니다.
Jellyfin Media Server의 심각한 경로 순회 취약점으로 인해 "자막 업로드" 권한이 있는 인증된 사용자가 디스크의 임의 위치에 파일을 업로드할 수 있습니다. 자막 업로드 엔드포인트의 검증되지 않은 Format 필드를 악용하면 공격자는 민감한 위치에 파일을 쓰고, 민감한 데이터를 추출하고, 권한을 상승시키고, 궁극적으로 LD_PRELOAD 주입을 통해 루트 권한으로 임의 코드를 실행할 수 있습니다.
| 속성 | 값 |
|---|---|
| CVE ID | CVE-2026-35031 |
| CVSS 점수 | 9.9 (치명적) |
| CWE | CWE-22: 제한된 디렉터리의 경로명에 대한 부적절한 제한 ('Path Traversal') |
| 영향받는 제품 | Jellyfin Media Server |
| 영향받는 버전 | < 10.11.7 |
| 수정 버전 | 10.11.7 이상 |
| 취약점 유형 | 경로 순회 + 임의 파일 쓰기 + RCE |
| 인증 필요 | 예 (비관리자 사용자) |
| 필요한 권한 | "자막 업로드" 권한 |
| 기본 포트 | 8096/TCP |
| GitHub 보안 권고 | GHSA-9p5f-5x8v-x65m |
| 패치 상태 | 제공 및 배포됨 |
| 공개 익스플로잇 | 예 |
Jellyfin은 개인 미디어 컬렉션을 관리하고 스트리밍할 수 있도록 설계된 무료 오픈소스 미디어 서버입니다. 상용 미디어 서버와 유사한 기능을 제공하지만 완전한 소스 코드 투명성과 커뮤니티 통제를 갖추고 있습니다.
Jellyfin Media Server (Port 8096)
/ | \
/ | \
Web UI REST API Media Streams
(Browser) (Authenticated) (Subtitle Upload)
|
/System/Info/Public (unauthenticated)
/Videos/{itemId}/Subtitles (vulnerable)
/Library/Collections (admin)
Client Devices > Network > Jellyfin Server > Database + Storage | /var/lib/jellyfin/ /etc/ld.so.preload (writable via vulnerability)
---
## 취약점 심층 분석
### 근본 원인 분석
이 취약점은 자막 업로드 엔드포인트(`/Videos/{itemId}/Subtitles`)에 존재하며, 파일 업로드를 허용하고 디스크에 저장합니다. 핵심 결함은 Format 필드 매개변수의 검증이 충분하지 않다는 점입니다.
#### 취약한 코드 패턴
이 엔드포인트는 Format 필드를 제대로 검증하거나 정화하지 않은 채 자막 업로드를 처리합니다:```
POST /Videos/{itemId}/Subtitles HTTP/1.1
Content-Type: multipart/form-data
[Binary subtitle data]
Format: /../../../etc/ld.so.preload
Language: en
Format 매개변수는 자막 형식(srt, vtt, ass 등)을 지정하기 위한 것이지만, 대신 파일 경로의 일부로 처리됩니다:``` Base Path: /var/lib/jellyfin/subtitles/ User Input: /../../../etc/ld.so.preload Result: /var/lib/jellyfin/subtitles/../../../etc/ld.so.preload Resolved: /etc/ld.so.preload (via path traversal)
### 공격 체인 분석
이 취약점은 여러 약점을 연쇄적으로 연결하여 root 권한으로 원격 코드 실행을 달성합니다:```
Step 1: Subtitle Upload with Path Traversal
POST /Videos/{itemId}/Subtitles
Format: /../../../etc/ld.so.preload
|
v
Step 2: Arbitrary File Write
Write attacker-controlled data to /etc/ld.so.preload
|
v
Step 3: File Read via .strm Files
Create .strm files pointing to sensitive paths
Extract database contents and credentials
|
v
Step 4: Database Extraction
Access /jellyfin/jellyfin.db via .strm
Extract admin user hashes
|
v
Step 5: Admin Privilege Escalation
Reset admin password or create new admin account
|
v
Step 6: RCE via LD_PRELOAD Injection
LD_PRELOAD=/path/to/malicious.so java
Arbitrary code execution as root
Input Validation Failure:
Format Field Validation: Expected: srt | vtt | ass | ssa | sub | subrip Actual: /../../../etc/ld.so.preload Result: NO VALIDATION > PATH TRAVERSAL ALLOWED
File Write Operation: String Concatenation: "/subtitles/" + user_format + ".srt" | NO CANONICALIZATION: Path component not resolved before write NO WHITELIST: Format values not restricted NO BOUNDS CHECK: ".." sequences not filtered | v Final Path: /etc/ld.so.preload (EXPLOITED)
### LD_PRELOAD 악용
LD_PRELOAD 기법은 Linux 시스템에서 강력한 권한 상승 및 코드 실행 방법입니다:```
LD_PRELOAD Injection Flow:
1. Attacker writes malicious .so (shared object) to /etc/ld.so.preload
/etc/ld.so.preload contents:
/path/to/attacker.so
2. Java process starts (Jellyfin runs on Java):
kernel > execve("java", ...) > glibc initialization
|
v
Check /etc/ld.so.preload
|
v
Load attacker.so FIRST
|
v
Execute attacker code
(BEFORE Java main())
3. Code Execution Context:
Process Owner: root (Jellyfin typically runs as root)
Permissions: Full system access
Timing: Before application initialization
Detection: Minimal (malicious code runs early)
4. Attacker Capabilities:
> Create reverse shell with full root privileges
> Extract sensitive data before application starts
> Modify Java application behavior
> Persist via cron jobs or systemd services
> Establish C2 communication
User Level Access > Path Traversal > Write /etc/ld.so.preload | v (Next process execution) | Kernel reads /etc/ld.so.preload > Loads attacker .so | v Malicious code executes in root context | v Full system compromise
---
## 영향 분석
### 기밀성
**치명적** - 완전한 정보 공개
- 데이터베이스 추출: 관리자 자격 증명, 사용자 비밀번호, API 키
- 자막 파일 및 미디어 메타데이터 노출
- 민감한 데이터가 포함된 구성 파일 접근
- 추가 악용을 위한 시스템 정보 수집
### 무결성
**치명적** - 시스템 전체 파일 변조
- 디스크의 임의 위치에 임의 파일 쓰기
- 애플리케이션 바이너리 변조
- 시스템 구성 변경
- 데이터베이스 손상 또는 조작
### 가용성
**치명적** - 서비스 중단 및 거부
- LD_PRELOAD의 악성 .so를 통한 시스템 종료 또는 충돌
- 대용량 파일 쓰기를 통한 디스크 공간 고갈
- 프로세스 종료 또는 리소스 고갈
- 완전한 서비스 불가
### 영향을 받는 구성 요소
- Jellyfin 미디어 서버 프로세스 (대부분의 배포에서 root로 실행됨)
- 운영 체제 커널 및 라이브러리
- 저장된 미디어 및 메타데이터
- 사용자 인증 시스템
- glibc에 링크된 시스템 전체 프로세스
### 비즈니스 영향
- **데이터 유출:** 저장된 모든 자격 증명 및 사용자 데이터가 손상됨
- **서비스 중단:** Jellyfin 및 잠재적으로 다른 서비스도 사용 불가능해짐
- **측면 이동:** 손상된 시스템이 네트워크 공격의 거점이 됨
- **규정 위반:** PII가 노출되면 GDPR, CCPA, HIPAA 위반
- **공급망 위험:** Jellyfin이 공유 또는 엔터프라이즈 미디어를 제공하는 경우
---
## 영향을 받는 버전