Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
jellyfin-svg-gzip — Jellyfin Server 12.2 - 高危 - 远程 - SSRF - gzip data:image/png 遗留的 GHSA-cf3c 仍会获取 http 和 file | Kitploit
工具/GitHubGitHub/abraxas/jellyfin-svg-gzip
漏洞分析漏洞利用Web应用程序漏洞利用信息收集渗透测试实验室与实践
GitHubabraxas/jellyfin-svg-gzip

jellyfin-svg-gzip

Jellyfin Server 12.2 - 高危 - 远程 - SSRF - gzip data:image/png 遗留的 GHSA-cf3c 仍会获取 http 和 file

查看仓库
31天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

Abraxas Labs - jellyfin-svg-gzip

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  jellyfin-svg-gzip

jellyfin-svg-gzip

类别: SSRF + 文件读取 + memex 触达范围: 远程(任意已认证用户 POST /UserImage;光栅化无需认证 GET /UserImage)

Jellyfin Server 12.2(ca0f16eb)- Jellyfin。Svg.Skia 3.7.0。

GHSA-cf3c-8m59-2vhx 关闭了个人资料 SVG 上的外部 http 和 file href。12.2 仍固定使用 Svg.Skia 3.7.0。SvgDocument.ResolveExternalImages = ExternalType.None 被 3.7.0 的 ImageDrawable 忽略。SvgSecurityValidator.ValidateDataUri 对任何媒体类型不恰好为 image/svg+xml 的 data URI 在 gzip 遍历之前返回允许。Svg.Skia 的 GetImageFromDataUri:mimeType.StartsWith("image/") 加上 gzip 魔数会调用 LoadSvgz,且没有 Jellyfin 的重新扫描。内部 SVG 的 http(s) / file href 会进入 WebRequest.Create。这就是原始 GHSA-cf3c 的汇聚点。

任意已认证用户上传一个 gzip-png 包裹的 SVG。对该个人资料图片发起未认证的 GET 请求,会使服务器在光栅化过程中获取攻击者的 http / https / file://。

ID暂无 CVE
类别SSRF + 文件读取 + memex
触达范围远程。 任意用户 POST /UserImage。光栅化无需认证 GET /UserImage?userId=
CWECWE-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 主机名 oracle:8080,命中数=1,路径中包含见证
侦察同上若 file:// 字节可解码为图像,则被绘制进请求者下载的 PNG/WebP/JPEG 中推断。与 GHSA-cf3c 相同的 WebRequest.Create 汇聚点
可用性同上,内部 file:///dev/urandom无界读取保留在托管堆上。之后每次图像 GET 都会重复,无需重新上传推断。在 GHSA-cf3c 中已测量
完整性无无用户策略写入、无插件安装、无会话窃取已排除

保持关闭: 外层 SVG 上的直接 http/file href(实验:GET 仍返回 image/svg+xml,oracle 为 0);嵌套的 data:image/svg+xml(已重新扫描,包括 gzip);DTD SYSTEM;GHSA-vcmh 内联 XSS(Content-Disposition: attachment 加栅格化);插件图片路径遍历;Magick/PDF。不是 RCE。不是会话 XSS。SSRF 的响应体是 Skia 绘制的内容,而不是原始 HTTP 响应。

我是如何发现的

12.2 是已经包含 GHSA-cf3c 预扫描的标签。我还是搁置了它。在一个仍然会发起请求的库前面加一个校验器,这种补丁是份礼物:你读一遍校验器遍历了什么,然后问这个库仍然会解析什么。

Directory.Packages.props 仍然锁定 Svg.Skia 3.7.0。上游 wieslawsoltes/Svg.Skia#448(已在 #501 中修复):ImageDrawable 从不查询 ResolveExternalImages。Jellyfin 的三处 ExternalType.None 赋值在这个锁定版本上是空操作。Renovate #17076 不在该标签中。

于是预扫描成了唯一的关卡。ValidateReference 会拒绝所有非片段、非 data: 的 href。嵌套的 image/svg+xml 会被重新解析,包括 gzip。SvgSecurityValidator.cs:169-173 处的注释说任何其他媒体类型都是栅格,并在 0x1F 0x8B 遍历之前返回允许。Svg.Skia 3.7.0 的 GetImageFromDataUri 并不这么认为:任何带有 gzip 魔数的 image/* 都是 LoadSvgz。

已经记录下来的错误方向:因为负向对照仍返回 image/svg+xml 就认为 GHSA-cf3c 已关闭;嵌套的 data:image/svg+xml gzip(已重新扫描);DTD SYSTEM;GHSA-vcmh 内联 XSS;插件图片路径遍历;Magick/PDF;管理员 RemoteImages/Download(有意为之的封面图获取);一个不属于此遗留问题的像素炸弹 DoS;一个反向 shell。全是做戏。

实验环境

python3 jellyfin-svg-gzip-Abraxas-Labs.py

或:

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 所获取的地址。

负向:POST 一个 profile SVG,其 image 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

仅作见证。无漏洞利用载荷。无反向 shell。授权实验室。回环。

修复方案

在 SvgSecurityValidator 中遍历 gzip 和嵌套的 data URI,即使声明的媒体类型不是 image/svg+xml。或者将 Svg.Skia 升级到超过 ImageDrawable ExternalType.None 忽略问题的版本(上游 #448 / #501;renovate #17076 不在该标签中)。两者皆可。库标志是预期的终止开关。验证器不应谎报库将解析的内容。

参考资料

  • github.com/jellyfin/jellyfin 标签 v12.2(ca0f16eb7c195f720a1493ed469a27c4657db0c6)
  • SvgSecurityValidator.cs · SkiaEncoder.cs · ImageController.cs
  • 已关闭,非此遗留问题:GHSA-cf3c-8m59-2vhx · GHSA-vcmh-9wx9-rfqh
  • 上游:Svg.Skia#448 · #501。Renovate 不在标签中:jellyfin#17076
  • 系列:Jellyfin 12.2 遗留问题 · #1 Suggestions IDOR
  • CWE-918 · CWE-611 · CWE-400

许可证

GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验室。不提供任何担保。

下载工具