
Jellyfin Server 12.2 - 높음 - .strm 배치 후 원격 - FFmpeg 인자 주입 - EncodingUtils -i GHSA-wwwm의 잔여물
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · jellyfin-ffmpeg-colonslash
분류: FFmpeg 인자 주입
도달 범위: 라이브러리 .strm 심기 이후 원격 (스캔된 미디어 폴더의 작성자, 이후 비인증 스트림)
Jellyfin Server v12.2 (ca0f16eb7c195f720a1493ed469a27c4657db0c6) - Jellyfin. 이미지 jellyfin/jellyfin:12.2.
GHSA-wwwm-px48-fpvq / PR 17685는 변환 argv와 file: -i 분기에 EscapeProcessArgument를 추가했습니다. Non-File 프로토콜은 여전히 해당 이스케이프 없이 원시 경로를 따옴표로 감쌉니다 (EncodingUtils.cs:14-71). ManagedFileSystem.IsPathFile은 file://이 아닌 ://에 대해 false입니다. TranscodeManager는 여전히 ProcessStartInfo.Arguments를 하나의 문자열로 구성합니다.
첫 줄이 "를 포함하는 http URL인 스캔된 라이브러리 .strm은 Http로 분류됩니다. Uri.TryCreate는 해당 URL을 허용합니다. 비인증 GET /Videos/{id}/stream (static 없음)이 ffmpeg를 시작합니다. 실험실 로그는 다음과 같습니다:
-i "http://127.0.0.1/a" JELLYFIN-FFMPEG-COLONSLASH-WITNESS "x"
LabControl.mkv 제어는 하나의 인수로 유지됩니다: -i file:"/media/movies/LabControl.mkv".
://가 포함된 POSIX 파일명은 이 싱크에 도달하지 않습니다. 슬래시는 파일명이 될 수 없습니다. 랩에서 심은 a://b"…"x.mkv는 /media/movies/a:/b"…"x.mkv로 저장되며 이스케이프된 File 분기를 탑니다. 콜론슬래시가 포함된 파일명 변형을 제출하지 마십시오. 플러그인-DLL RCE를 주장하는 것이 아닙니다. 랩은 argv 분할만을 입증합니다.
Jellyfin 12.2 leftovers 시리즈의 남은 #4.
| ID | 아직 CVE 없음 |
| 분류 | FFmpeg 인수 주입 (CWE-88) |
| 도달 | 라이브러리 .strm 심기 후 원격, 이어서 비인증 스트림 |
| CWE | CWE-88 |
| CVSS | 높음: 7.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N |
| 제품 | Jellyfin Server |
| 영향받음 | v12.2 (ca0f16eb) 이미지 jellyfin/jellyfin:12.2 |
| 인증 | 심기에는 라이브러리 작성자; 스트림은 비인증 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
GHSA-wwwm과 동일한 심기 모델: 스캔되는 미디어 폴더(NAS / Samba / 게스트 공유)에 .strm을 작성합니다. 그런 다음 서버에 TCP로 접속할 수 있는 누구나 Authorization도 static도 없이 GET /Videos/{id}/stream을 호출할 수 있습니다. 이것이 전체 권한 집합입니다. 이 목록의 어느 것도 셸이나 플러그인-DLL RCE가 아닙니다.
| 축 | 메서드 + 경로 | 부여 | 출처 |
|---|---|---|---|
| 무결성 / argv | 라이브러리 .strm 심기 후 비인증 GET /Videos/{id}/stream | -i 따옴표 밖의 추가 ffmpeg 인수 | 랩 입증. TranscodeManager 로그 |
| 정찰 | 동일 + -vf drawtext=textfile= | 트랜스코드 내 호스트 파일 바이트 | 추론된 가젯; 실행되지 않음 |
| 무결성 | -attach / -dump_attachment | jellyfin-UID 쓰기 | 추론됨; 플러그인 로드 미입증 |
| RCE | 주장하지 않음 | - | - |
ProcessBuilder 없음. 플러그인-DLL RCE 없음. 과거 GHSA-866x 체인은 역사적이며 여기서 입증되지 않습니다.://가 포함된 POSIX 파일명은 디렉터리(a:)와 파일이 됩니다. 정규 Path에는 ://가 없으므로 이스케이프된 file: -i 분기를 탑니다.level TryParse는 종료되었습니다..strm 로컬 / file:// 경로는 삭제됩니다(ProbeProvider는 http / https / rtsp / rtp만 유지).EncoderAppPath는 인코딩 구성 API를 통해 설정할 수 없습니다..strm(GHSA-j2hf)은 종료된 상태로 유지됩니다.jellyfin/jellyfin v12.2를 고정했습니다. 스무 번의 소스 탐색 후, 네 번의 독립적인 루프백 랩을 진행했습니다. PR 17685는 변환 argv와 file: -i를 이스케이프했습니다. Http / rtsp 래퍼는 "%s"로 남겨졌습니다. 처음 시도한 심기는 ://가 포함된 POSIX 파일명이었습니다. 그 심기는 디렉터리입니다. 실제로 발동하는 남은 항목은 URL에 이미 ://와 "가 포함된 .strm입니다.
잘못된 방향, 그 순서대로: GetFileInputArgument의 path.Contains("://") 단축을 파일명 버그로 취급한 것. 슬래시는 구분자입니다. File 분기는 이미 이스케이프합니다. 비-File 분기는 그렇지 않습니다.
이 고정 버전의 형제 항목들: jellyfin-suggestions-idor, jellyfin-svg-gzip, jellyfin-playlist-itemids.
루프백 클라이언트: jellyfin-ffmpeg-colonslash-Abraxas-Labs.py. 스택: lab/ (docker-compose.yml, poc.py, run.sh). 승인된 랩 전용. 루프백과 통신합니다.
python3 jellyfin-ffmpeg-colonslash-Abraxas-Labs.py
또는:
cd lab
./run.sh
오직 http://127.0.0.1:18810만 대상으로 합니다. 이미지 jellyfin/jellyfin:12.2. Compose 프로젝트 jellyfin-ffmpeg-colonslash. Witness JELLYFIN-FFMPEG-COLONSLASH-WITNESS.
poc.py는 LabControl.mkv(대조군, 하나의 -i file:"...")와 URL이 http://127.0.0.1/a" JELLYFIN-FFMPEG-COLONSLASH-WITNESS "x인 LabPlant.strm을 작성합니다. 인증 없는 GET /Videos/{id}/stream(static 없음)은 따옴표 분리(quote-break)를 기록합니다. 마지막 줄:
SUCCESS jellyfin-ffmpeg-colonslash argv-split=yes plant-i=quote-break control-id=f603a52f649bcf822b333c4d5f21cc86 plant-id=d7aabf0935bb524e1667b1ff9bb945d9 JELLYFIN-FFMPEG-COLONSLASH-WITNESS
Http 및 rtsp를 포함한 모든 GetInputArgument 분기에서 EscapeProcessArgument를 호출하세요. 래핑은 유지하되, file: 분기가 이미 하는 방식대로 내부 문자열을 따옴표 이스케이프하세요.
MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs:14-71Emby.Server.Implementations/IO/ManagedFileSystem.cs:533-541MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs:417-431Jellyfin.Api/Controllers/VideosController.cs:314-318, 483-486Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]
GNU Affero GPL v3.0. LICENSE를 참조하세요. 루프백 실험실 전용입니다. 보증은 없습니다.