
Jellyfin Server 12.2 - उच्च - रिमोट - SSRF - gzip data:image/png GHSA-cf3c का अवशेष अभी भी http और file प्राप्त करता है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · jellyfin-svg-gzip
वर्ग: SSRF + फ़ाइल पढ़ना + memex
पहुँच: रिमोट (कोई भी प्रमाणित उपयोगकर्ता POST /UserImage; रैस्टराइज़ अनप्रमाणित GET /UserImage)
Jellyfin Server 12.2 (ca0f16eb) - Jellyfin. Svg.Skia 3.7.0.
GHSA-cf3c-8m59-2vhx ने प्रोफ़ाइल SVGs पर बाहरी http और file hrefs को बंद कर दिया। 12.2 अभी भी Svg.Skia 3.7.0 को पिन करता है। SvgDocument.ResolveExternalImages = ExternalType.None को 3.7.0 ImageDrawable द्वारा अनदेखा किया जाता है। SvgSecurityValidator.ValidateDataUri किसी भी ऐसे data URI के लिए allow लौटाता है जिसका मीडिया प्रकार ठीक image/svg+xml नहीं है, gzip वॉक से पहले। Svg.Skia GetImageFromDataUri: mimeType.StartsWith("image/") के साथ-साथ gzip मैजिक LoadSvgz को कॉल करता है, बिना किसी Jellyfin पुनः-स्कैन के। आंतरिक SVG के http(s) / file hrefs WebRequest.Create पर जाते हैं। यही मूल GHSA-cf3c सिंक है।
कोई भी प्रमाणित उपयोगकर्ता gzip-png में लिपटा SVG अपलोड करता है। उस प्रोफ़ाइल छवि का अनप्रमाणित GET सर्वर को रैस्टराइज़ करते समय हमलावर के http / https / file:// को फ़ेच करवाता है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | SSRF + फ़ाइल पढ़ना + memex |
| पहुँच | रिमोट। कोई भी उपयोगकर्ता POST /UserImage। रैस्टराइज़ अनप्रमाणित GET /UserImage?userId= है |
| CWE | CWE-918 / CWE-611 / CWE-400 |
| CVSS | उच्च: 7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:L |
| उत्पाद | Jellyfin Server |
| प्रभावित | 12.2 (ca0f16eb7c195f720a1493ed469a27c4657db0c6), इमेज jellyfin/jellyfin:12.2, Svg.Skia 3.7.0 |
| प्रमाणीकरण | प्रमाणित अपलोड। अनप्रमाणित रैस्टराइज़। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1 |
Jellyfin 12.2 leftovers श्रृंखला का शेष #2। सहोदर #1 Suggestions IDOR। वही पिन: playlist ItemIds, FFmpeg colon-slash।
अभिनेता कोई भी साइन-इन किया हुआ Jellyfin उपयोगकर्ता है। प्रोफ़ाइल छवि केवल एडमिन के लिए नहीं है। रैस्टराइज़ को सत्र की आवश्यकता नहीं है।
| अक्ष | विधि + पथ | अनुदान | उद्गम |
|---|---|---|---|
| रेकॉन | POST /UserImage (Content-Type: image/svg+xml, BASE64 बॉडी) फिर अनप्रमाणित GET /UserImage?userId= | Skia द्वारा रैस्टराइज़ करते समय हमलावर के http/https (लूपबैक, RFC1918, लिंक-लोकल/IMDS) का सर्वर GET | लैब-प्रमाणित। ओरेकल होस्टनाम oracle:8080, hits=1, पथ में साक्षी |
| रेकॉन | वही | file:// बाइट्स उस PNG/WebP/JPEG में चित्रित जो अनुरोधकर्ता डाउनलोड करता है, यदि वे छवि के रूप में डिकोड हों | अनुमानित। GHSA-cf3c के समान WebRequest.Create सिंक |
| उपलब्धता | वही, आंतरिक file:///dev/urandom | मैनेज्ड हीप पर बिना सीमा के पढ़ाई बनी रहती है। बिना पुनः-अपलोड के हर बाद के छवि GET पर दोहराती है | अनुमानित। GHSA-cf3c में मापा गया |
| अखंडता | कोई नहीं | कोई उपयोगकर्ता-नीति लेखन नहीं, कोई प्लगइन इंस्टॉल नहीं, कोई सत्र चोरी नहीं | बंद |
बंद रहता है: बाहरी SVG पर सीधे http/file hrefs (lab: GET image/svg+xml ही रहा, oracle 0); नेस्टेड data:image/svg+xml (पुनः-स्कैन किया गया, gzip सहित); DTD SYSTEM; GHSA-vcmh इनलाइन XSS (Content-Disposition: attachment के साथ-साथ rasterize); plugin-image traversal; Magick/PDF। RCE नहीं। session XSS नहीं। SSRF body वही है जो Skia पेंट करता है, कच्चा HTTP response नहीं।
12.2 वही टैग है जिसमें GHSA-cf3c प्री-स्कैन पहले ही शिप हो चुका था। फिर भी मैंने इसे टाल दिया। ऐसे पैच जो किसी ऐसी लाइब्रेरी के आगे validator जोड़ते हैं जो अब भी fetch करती है, एक उपहार हैं: आप पढ़ते हैं कि validator क्या-क्या चलता है, फिर पूछते हैं कि लाइब्रेरी अब भी क्या parse करती है।
Directory.Packages.props अब भी Svg.Skia 3.7.0 को pin किए हुए है। अपस्ट्रीम wieslawsoltes/Svg.Skia#448 (#501 में ठीक किया गया): ImageDrawable कभी ResolveExternalImages की सलाह नहीं लेता। Jellyfin के तीन ExternalType.None असाइनमेंट इस pin पर no-op हैं। Renovate #17076 टैग में नहीं है।
तब प्री-स्कैन ही एकमात्र गेट है। ValidateReference हर गैर-fragment, गैर-data: href को अस्वीकार करता है। नेस्टेड image/svg+xml पुनः-parse होता है, gzip सहित। SvgSecurityValidator.cs:169-173 पर टिप्पणी कहती है कि कोई भी अन्य media type raster है और 0x1F 0x8B walk से पहले allow लौटाता है। Svg.Skia 3.7.0 का GetImageFromDataUri इससे सहमत नहीं है: gzip magic वाला कोई भी image/* LoadSvgz है।
पहले से दर्ज गलत रास्ते: GHSA-cf3c को बंद मान लेना क्योंकि negative control image/svg+xml ही रहता है; नेस्टेड data:image/svg+xml gzip (पुनः-स्कैन किया गया); DTD SYSTEM; GHSA-vcmh इनलाइन XSS; plugin-image traversal; Magick/PDF; admin RemoteImages/Download (इरादतन artwork fetch); एक pixel-bomb DoS जो यह leftover नहीं है; एक reverse shell। नाटक।
python3 jellyfin-svg-gzip-Abraxas-Labs.py
or:
cd lab
./run.sh
केवल लूपबैक: Jellyfin http://127.0.0.1:18780, oracle http://127.0.0.1:18781. इमेज jellyfin/jellyfin:12.2. Oracle एक 1x1 PNG लौटाता है और अनुरोध पथ को लॉग करता है। Compose होस्टनाम oracle:8080 वही है जिसे Skia फ़ेच करता है।
नकारात्मक: एक प्रोफ़ाइल SVG POST करें जिसका इमेज href http://oracle:8080/negative.png है। GET image/svg+xml ही रहता है, oracle 0. सकारात्मक: एक आंतरिक SVG का gzip जिसका href http://oracle:8080/JELLYFIN-SVG-SVGSKIA-WITNESS.png है, बाहरी SVG पर data:image/png;base64 के रूप में लपेटा गया। GET image/png है, oracle 1.
SUCCESS jellyfin-svg-gzip gzip-png-ssrf hits=1 negative=0 JELLYFIN-SVG-SVGSKIA-WITNESS
केवल साक्षी। कोई एक्सप्लॉइट पेलोड नहीं। कोई रिवर्स शेल नहीं। अधिकृत लैब। लूपबैक।
SvgSecurityValidator में gzip और नेस्टेड डेटा URI को वॉक करें, भले ही घोषित मीडिया प्रकार image/svg+xml न हो। या Svg.Skia को ImageDrawable ExternalType.None इग्नोर (अपस्ट्रीम #448 / #501; renovate #17076 इस टैग में नहीं है) से आगे बढ़ाएँ। दोनों। लाइब्रेरी फ़्लैग ही इच्छित किल स्विच है। वैलिडेटर को इस बारे में झूठ नहीं बोलना चाहिए कि लाइब्रेरी क्या पार्स करेगी।