Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
jellyfin-ffmpeg-colonslash — Jellyfin Server 12.2 - 高 - .strm 設置後のリモート - FFmpeg 引数インジェクション - EncodingUtils -i GHSA-wwwm の残存 | Kitploit
ツール/GitHubGitHub/abraxas/jellyfin-ffmpeg-colonslash
脆弱性分析エクスプロイトウェブアプリケーション悪用セキュリティ仮想化ペネトレーションテストラボと実践
GitHubabraxas/jellyfin-ffmpeg-colonslash

jellyfin-ffmpeg-colonslash

Jellyfin Server 12.2 - 高 - .strm 設置後のリモート - FFmpeg 引数インジェクション - EncodingUtils -i GHSA-wwwm の残存

リポジトリを見る
11日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Abraxas Labs - jellyfin-ffmpeg-colonslash

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

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 を単一の文字列として構築している。

スキャンされたライブラリ内の .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 を制御する場合も引数は 1 つのままです: -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 です。

IDCVE 未割当
クラスFFmpeg 引数インジェクション (CWE-88)
到達経路ライブラリへの .strm 設置後、リモートから、その後未認証ストリーム
CWECWE-88
CVSSHigh: 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_attachmentjellyfin UID での書き込み推測。プラグイン読み込みは未確認
RCE主張せず--

この残存項目が与えないもの

  • シェルなし。ProcessBuilder なし。プラグイン DLL による RCE なし。旧 GHSA-866x のチェーンは過去のものであり、ここでは示していません。
  • 引用符のみの File パスは File ブランチ上でエスケープされたままです。
  • :// を含む POSIX ファイル名はディレクトリ (a:) とファイルに分かれます。正規化された Path には :// が含まれないため、エスケープされた file: の -i ブランチに到達します。
  • GHSA-jh22 の level の TryParse は修正済みです。
  • コーデックのクエリ文字列は依然として正規表現に一致します。
  • .strm のローカル / file:// パスは破棄されます (ProbeProvider は http / https / rtsp / rtp のみを保持)。
  • EncoderAppPath はエンコーディング設定 API 経由では設定できません。
  • 字幕アップロードの .strm (GHSA-j2hf) は修正済みのままです。

発見の経緯

jellyfin/jellyfin v12.2 を固定しました。20 回のソース調査の後、4 つの独立したループバックラボを実施しました。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。ウィットネスは JELLYFIN-FFMPEG-COLONSLASH-WITNESS。

poc.py は LabControl.mkv(コントロール、-i file:"..." を1つ)と、URL が http://127.0.0.1/a" JELLYFIN-FFMPEG-COLONSLASH-WITNESS "x である LabPlant.strm を書き出す。未認証の 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 分岐(Http および rtsp を含む)で EscapeProcessArgument を呼び出します。ラップは維持しますが、file: 分岐が既に行っているのと同じ方法で、内側の文字列をクォートエスケープします。

ソース

  • MediaBrowser.MediaEncoding/Encoder/EncodingUtils.cs:14-71
  • Emby.Server.Implementations/IO/ManagedFileSystem.cs:533-541
  • MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs:417-431
  • Jellyfin.Api/Controllers/VideosController.cs:314-318, 483-486
  • クローズ済みの関連項目: GHSA-wwwm-px48-fpvq / PR 17685

連絡先

Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]

ライセンス

GNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。

ツールをダウンロード