
2026/06/13 7:13
FFmpeg の 0 日 exploit で二十一件
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Depthfirst の自律型セキュリティエージェントは、大規模な FFmpeg ライブラリで 21 つのゼロデイ脆弱性を発見し、Google や Anthropic が以前同一コードベース内で問題を見出したことを続く深層分析のパターンを続けて、著しい進展を達成しました。特に、この発見は従来の高コスト AI モデル(Anthropic の Mythos モデルを使用し約 1 万ドルの支出)に関連する費用の何分の一という低コストで成し遂げられました(約 1,000 ドル)。エージェントは高度な脅威モデル化とデータフロー監査を活用し、発見されたすべての件について再現可能な概念実証を確保しました。これらの問題のうち 8 件の CVE 識別子が付与され、残り 13 件は内部で追跡されています。これらに含まれるのは、AV1 RTP デパケタイザーの不具合(DFVULN-127/CVE の可能性あり)で、認証を必要とせずに標準的な RTSP ストリームを通じて悪意のあるコマンドを注入しリモートコード実行を可能にするという重大なリスクです。この脆弱性は外部 URL に FFmpeg を曝しているあらゆるシステムに影響を与え、メディア受信パイプラインや監視ネットワークを含むためです。したがって、そのようなシステムに依存する組織は、これらの欠陥が通常のスートストリームコマンドを通じて悪用され、機密データやインフラを世界的に損なう可能性があるため、即座にパッチ適用を最優先事項とすべきです。
本文
Depthfirst の自動セキュリティエージェントによる FFmpeg ゼロデイ脆弱性の発見報告
Google と Anthropic が実施した集中的なセキュリティ分析において、depthfirst社の自律型セキュリティエージェントが FFmpeg における 21 件のゼロデイ脆弱性を特定しました。
調査の背景と意義
- コスト効率:
- Anthropic の Mythos モデルを使用した場合の費用は約 $10,000 ですが、今回の PoC(概念証明)入力生成にはその10% に相当する約 $1,000という極めて低いコストで実証されました。
- 単なる理論的解析ではなく、**実用的な Proof of Concept(PoC)**を作成しました。
- 脆弱性の性質:
- 特定された中には、長年沈静化していた潜伏型バグが含まれていました。
- これらのバグを悪用し、**リモートコード実行(RCE)**を実現するための Exploit を含む PoC を開発しました。
- FFmpeg の重要性:
- 世界で最も普及率の高いソフトウェアの一つであり、ブラウザから大規模なストリーミングプラットフォームまで広く使用されています。
- 信頼できないメディアデータを常時解析するため、本質的にセキュリティクリティカルです。
- ゼロクリック攻撃の主要な標的となっています。
Depthfirst のセキュリティエージェント
コーディングエージェントと異なり、セキュリティエージェントは既存システム内の悪用可能な問題を発見することに特化しています。
- アプローチの違い:
- コーディングエージェント: 人間からの指示に基づきコード生成を行い、エッジケースや対抗入力への考慮が少ない傾向があります。
- セキュリティエージェント: 暗黙的なアーキテクチャ理解、公開パーサーの特定、攻撃対象マッピングを行います。データフローを追跡して直接的に監査します。
- 検証プロセス:
- 前提条件の捏造を防ぐ堅牢なガードレールを備えています。
- 「攻撃者が本当に制御可能な入力を提供しているか」を厳しくチェックします。
- 単なる理論的なレポートではなく、実行経路を追跡し、再帰可能な具体的な入力を作成して脆弱性を自動確認します。
発見事項:ゼロデイ脆弱性のリスト
エージェントは TS デマルチミュークサーから VP9 デコーダーまでを網羅する 21 件のゼロデイ脆弱性を発見しました。 合計費用は約 $1,000(Mythos モデル利用時)です。そのうち 8 件について CVE が割り当てられています。
CVE 割付済み (8 件)
- CVE-2026-39210: Heap Buffer Overflow
- 対象: TS デマルチミュークサー
- 詳細: 2010 年の導入時に、長さの境界チェックが欠落しており、2 バイト読み取り前に問題が発生。
- CVE-2026-39211: Integer Overflow
- 対象: swscale リファクタリング
- 詳細: 2010 年の導入時で、サイズファクター式に上限がなく、ユーザー制御パラメータによる任意のスケーリングが可能。
- CVE-2026-39212: Stack Overflow
- 対象: ffmpeg_opt.c
- 詳細: 2025 年 7 月の回帰(regression)。プリセットファイルが再帰的にオプションを解析できるのに深度制限が存在しない。
- CVE-2026-39213: Heap Buffer Overflow
- 対象: yuv4mpegenc の rawvideo 入力経路
- 詳細: 2023 年の導入時で、パケットサイズに対して次元検証を行わなかった。
- CVE-2026-39214: Stack Buffer Overflow
- 対象: オリジナル SDT(Service Description Table)実装
- 詳細: 2003 年の導入時で、サービスエントリを記録せずに書き込みを行った。23 年間にわたり潜伏。
- CVE-2026-39215: Heap Buffer Overflow
- 対象: update_mb_info()
- 詳細: 2012 年の導入時で、ロジックエラーにより呼び出し後に割り当てられたバッファに 12 バイトの先書きが行われた。
- CVE-2026-39216: Heap Buffer Overflow
- 対象: img2enc.c
- 詳細: 2012 年の導入時で、安全な色空間サイズが無制限に次元導出サイズで置き換わった。
- CVE-2026-39217: Heap Buffer Overflow
- 対象: VP9 デコーダー
- 詳細: 2025 年 3 月の回帰。再定義されたサイズ更新関数がタイルスレッドバッファの割り当てを逃した。
CVE 未割付(内部追跡 ID) (13 件)
- DFVULN-127: Heap Buffer Overflow
- 対象: RTP AV1 デパケットアイザー (
)rtpdec_av1.c - 詳細:
をスキップする際にバッファ境界超過書き込みが発生。2024 年の導入以降存在。Temporal Delimiter OBU
- 対象: RTP AV1 デパケットアイザー (
- DFVULN-126: Heap Buffer Overflow
- 対象: swscale グラフコード (
)graph.c - 詳細: 交差結合 YUV420P→NV12 変換の不適切な処理により、宛先オーバーフロー(576 バイト超過)。2024 年の導入。
- 対象: swscale グラフコード (
- DFVULN-125: Stack Buffer Overflow
- 対象: RTP JPEG デパケットアイザー (
)rtpdec_jpeg.c - 詳細: 量子化テーブル構築時、適切にスペースを割り当てずバッファ境界超過。2012 年の回帰。
- 対象: RTP JPEG デパケットアイザー (
- DFVULN-124: Heap Buffer Overflow
- 対象: AVIF オーバーレイ経路 (
)ffmpeg_demux.c - 詳細: ゼロタイルエントリを持つ引用を拒否できず、境界超過読み込みが発生。2025 年の導入。
- 対象: AVIF オーバーレイ経路 (
- DFVULN-123: Integer Overflow
- 対象: RTP LATM デパケットアイザー (
)rtpdec_latm.c - 詳細: 符号付き足し算のオーバーフローで境界チェックバイパス、約 1 GB の読み込みが可能。2010 年の導入。
- 対象: RTP LATM デパケットアイザー (
- DFVULN-122: Heap Buffer Overflow
- 対象: RTP MPEG-4 デパケットアイザー (
)rtpdec_mpeg4.c - 詳細: AU ヘッダー長を 0 と受け入れ、バッファ境界超過。2005 年の導入で 20 年間潜伏。最も古く深刻な欠陥の一つ。
- 対象: RTP MPEG-4 デパケットアイザー (
- DFVULN-121: Heap Buffer Underflow
- 対象: CAF デマルチミュークサー (
)cafdec.c - 詳細:
で配列インデックスチェックを欠落し、負インデックスアクセス。2009 年の導入。read_seek()
- 対象: CAF デマルチミュークサー (
- DFVULN-120: Integer Underflow
- 対象: AVI デマルチミュークサー (
)avidec.c - 詳細: サイズ検証不足により、サイズ 0 の LIST チャンクで約 4 GB のアンダーフロー(DoS)。2011 年の導入。
- 対象: AVI デマルチミュークサー (
- DFVULN-119: Heap Buffer Overflow
- 対象: オプションパーサー (
)ffmpeg_opt.c - 詳細: ファイルインデックスとストリームインデックスの誤解釈、負インデックスでのメモリ読み取り。2025 年の回帰。
- 対象: オプションパーサー (
- DFVULN-118: Heap Buffer Overflow
- 対象: RTSP サーバー経路 (
)rtspdec.c - 詳細: 負の Content-Length を有効扱い、境界超過書き込み。2021 年の回帰。
- 対象: RTSP サーバー経路 (
- DFVULN-117: Heap Buffer Overflow
- 対象: RTMP クライアント (
)rtmpproto.c - 詳細: チェック条件の誤り(in_size < 3 を < 8 に)により、割り当て不足のバッファからの読み取り。2012 年の導入。
- 対象: RTMP クライアント (
- DFVULN-116: Heap Buffer Overflow
- 対象: RTSP SDP パース (
)rtsp.c - 詳細: 空文字列での計算誤りにより、事前バッファ読み込みが発生。2010 年の導入。
- 対象: RTSP SDP パース (
主要な RCE: AV1 RTP デパケットアイザーの脆弱性
21 件の発見事項の中で特に際立つのは、FFmpeg の AV1 RTP デパケットアイザー (
)における Heap Buffer Overflowです。libavformat/rtpdec_av1.c
- 到達可能性: ネットワーク上で直接到達可能で、特別なフラグは不要です。
- 利用方法: 誰もが利用する
コマンドだけで実行可能です。ffmpeg -i rtsp://attacker/stream - **トリガー:**わずか 183 バイトの RTP パケットで、コード実行をリダイレクトできます。
根本原因: Temporal Delimiter (TD) の処理ミス
AV1 ビデオは RTP プロトコルで配信され、FFmpeg がデパケット化して要素流に戻します。 仕様上、Temporal Delimiter (TD) という特殊なマーカーは「無視して削除」するよう指示されていますが、その処理が脆弱性の原因となります。
- コードの挙動:
TD をスキップすると、出力ポインタ
は宣言されたpktpos
分だけ進みますが、メモリの割り当ては行われません。obu_size// libavformat/rtpdec_av1.c:250-254 if ((obu_type == AV1_OBU_TEMPORAL_DELIMITER) || (obu_type == AV1_OBU_TILE_LIST)) { pktpos += obu_size; // ポインタを進めるが... rem_pkt_size -= obu_size; // カウンタを減らす obu_cnt++; continue; // ← メモリ割り当てをスキップ! } - 問題点:
- 書き込みポインタの毒化: TD (
) をスキップした後、obu_size = 148
は 148 ですが、対応するメモリは未割り当てです。pktpos - 攻撃者の制御: 次のループでは、この先読みされた位置に通常 sized OBU の処理が行われますが、そこには**攻撃者が提供したデータ(偽装された TD ヘッダー)**が書かれようとしています。
- 書き込みポインタの毒化: TD (
Exploit: コード実行への昇格
単なるバッファオーバーフローだけではコード実行は困難ですが、FFmpeg の
メカニズムを利用することで可能になります。av_buffer_alloc
- ターゲットの位置:
はデータを割り当てますが、その直後にav_grow_packet
構造体が配置されます。この構造体内には、バッファを解放するコールバックポインタAVBuffer
が存在します。free- オフセット +24 に位置し、これがコード実行のターゲットとなります。
- 攻撃手法:
- 攻撃者は TD のペイロード内で、第 3 の「偽装された OBU」を埋め込みます。
- これにより、もう一つの
が呼び出され、FFmpeg は新しいバッファを割り当てて古いバッファを解放します(av_grow_packet
とは異なる挙動)。realloc - 新しいバッファを確保する際、腐敗した
ポインタがコールバックとして呼び出されます。free
- コードフロー:
// libavutil/buffer.c:209-214 if (!(buf->buffer->flags_internal & BUFFER_FLAG_REALLOCATABLE) || ...) { ret = av_buffer_realloc(&new, size); memcpy(new->data, buf->data, ...); buffer_replace(pbuf, &new); // ← 古いバッファ解放処理の開始 } // libavutil/buffer.c:129-130 if (atomic_fetch_sub_explicit(&b->refcount, 1, ...) == 1) { b->free(b->opaque, b->data); // ← ここがコールされ、0xdeadbeef が実行される }
影響範囲
この脆弱性は認証なしで、通常の RTSP PLAY プロセス中にトリガーされます。以下の全てのデプロイメントにリスクがあります。
- メディアイントレストパイプライン(ユーザーが供給するストリーム URL を処理するもの)
- 監視および CCTV システム(RTSP フィードを引くもの)
- リモート AV1-over-RTP ソースを処理するトランスコーディングサービス
以下は、脆弱性を悪用するための概念実証コードの概要です:
# 攻撃者のコマンドライン ffmpeg -i rtsp://attacker/stream [出力ファイル]
この PoC コードにより、183 バイトのパケットが RCE を達成することが確認できます。