
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 उस :// के लिए false है जो file:// नहीं है। TranscodeManager अभी भी ProcessStartInfo.Arguments को एक स्ट्रिंग के रूप में बनाता है।
एक स्कैन की गई लाइब्रेरी .strm जिसकी पहली पंक्ति " युक्त http URL है, 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:) और एक फ़ाइल बन जाता है। Canonical 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 फ़ाइलनाम था। वह प्लांट एक डायरेक्टरी है। जो शेष सक्रिय होता है वह एक .strm है जिसके URL में पहले से :// और " हैं।
गलत मोड़, उसी क्रम में: 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। विटनेस JELLYFIN-FFMPEG-COLONSLASH-WITNESS।
poc.py LabControl.mkv (नियंत्रण, एक -i file:"...") और LabPlant.strm लिखता है जिसका URL http://127.0.0.1/a" JELLYFIN-FFMPEG-COLONSLASH-WITNESS "x है। अनऑथ GET /Videos/{id}/stream (बिना static) कोट-ब्रेक लॉग करता है। अंतिम पंक्ति:
SUCCESS jellyfin-ffmpeg-colonslash argv-split=yes plant-i=quote-break control-id=f603a52f649bcf822b333c4d5f21cc86 plant-id=d7aabf0935bb524e1667b1ff9bb945d9 JELLYFIN-FFMPEG-COLONSLASH-WITNESS
हर GetInputArgument शाखा पर EscapeProcessArgument कॉल करें, जिसमें Http और rtsp भी शामिल हैं। रैपिंग बनाए रखें, लेकिन आंतरिक स्ट्रिंग को उसी तरह कोट-एस्केप करें जैसे file: शाखा पहले से करती है।