
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 を単一の文字列として構築している。
スキャンされたライブラリ内の .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 です。
| ID | CVE 未割当 |
| クラス | FFmpeg 引数インジェクション (CWE-88) |
| 到達経路 | ライブラリへの .strm 設置後、リモートから、その後未認証ストリーム |
| CWE | CWE-88 |
| CVSS | High: 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 を固定しました。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-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 を参照してください。ループバックラボ専用です。保証はありません。