The Zero Day Initiative has published ZDI-26-775, disclosing a critical heap-based buffer overflow in GStreamer's rtpL16depay element — tracked as CVE-2026-111183 and rated CVSS 9.8 (Critical). The flaw allows remote, unauthenticated attackers to execute arbitrary code on any system where a GStreamer-based application processes attacker-controlled RTP L16 audio streams.
This should be on every defender's radar for one simple reason: GStreamer is everywhere. It is the default multimedia framework on most Linux distributions and underpins desktop media players, VoIP/RTC clients, video conferencing pipelines, embedded and IoT devices, in-vehicle infotainment systems, and server-side transcoding services. Any application that ingests RTP streams carrying L16 (uncompressed 16-bit linear PCM) audio — think SIP/RTP media handling, WebRTC gateways, IP camera and intercom pipelines — can be a viable target. Per ZDI, interaction with the library is required and the exact attack pathway varies by implementation, but a CVSS 9.8 network-reachable memory corruption with no authentication requirement is about as bad as library vulnerabilities get.
Defenders need to inventory GStreamer exposure, patch immediately, and hunt for signs of exploitation or crash-based probing.
Technical Analysis
Affected Component
- Product: GStreamer multimedia framework
- Component:
rtpL16depay— the RTP payload depayloader for L16 audio (part of thegst-plugins-goodpackage, within the RTP plugin family) - Vulnerability type: Heap-based buffer overflow (CWE-122) leading to arbitrary code execution
- CVE / Advisory: CVE-2026-111183 / ZDI-26-775
- CVSS: 9.8 (Critical) — consistent with a network-vector, no-authentication, no-user-interaction memory corruption
How the Vulnerability Works
rtpL16depay converts incoming RTP packets carrying L16-encoded linear PCM audio into raw audio buffers for downstream GStreamer pipeline elements. The depayloader must parse RTP headers, determine payload length, and allocate/copy buffer data accordingly. Heap-based overflows in depayloaders typically arise when payload length fields, channel counts, or sample-rate-derived calculations are trusted without adequate bounds validation — an attacker crafts RTP packets whose declared or implied size causes the depayloader to write past the end of a heap-allocated buffer.
From a defender's perspective, the attack chain looks like this:
- Delivery: The attacker sends malformed RTP/UDP traffic (typically toward ports in the 16384–32767 dynamic RTP range, or 5004/5005 and other SIP-adjacent ports) to a host running a GStreamer-based media application, or lures a user into receiving an attacker-sourced media stream (e.g., an RTP stream negotiated through a VoIP call or media session).
- Trigger: A GStreamer pipeline containing
rtpL16depay(explicitly, or constructed automatically viartpbin/uridecodebin-style autoplugging) processes the malicious L16 payload. - Corruption: The heap overflow corrupts adjacent heap metadata or objects, giving the attacker a write primitive that is groomed into control-flow hijack.
- Execution: Arbitrary code runs in the context of the GStreamer host process — the media player, VoIP service, transcoding daemon, or embedded media process — inheriting its privileges.
Because the vulnerable code path sits at the parsing boundary of network-supplied data, no valid credentials and (in services that auto-accept media) no user interaction are required. ZDI notes the pathway varies by implementation, which means your exposure depends on which applications link GStreamer and how they ingest RTP.
Exploitation Status
At the time of this writing, ZDI-26-775 has been published as a coordinated disclosure with CVE-2026-111183 assigned. There is no confirmed public in-the-wild exploitation and no CISA KEV listing yet — but treat that as a window, not a comfort. A CVSS 9.8, unauthenticated, network-reachable memory corruption in a ubiquitously deployed library is exactly the class of bug that gets weaponized quickly, and exploit developers have a strong historical track record with media-parsing flaws. Assume proof-of-concept code will circulate and act accordingly.
Detection & Response
Pre-exploitation detection for a parser bug is hard — the malformed RTP packets themselves are the exploit. Your most reliable telemetry is behavioral: unexpected child processes or network connections from GStreamer-dependent media processes, crash artifacts in media services, and anomalous inbound RTP traffic. The rules below are tuned to fire on the consequences of exploitation, not on parsing guesses.
---
title: GStreamer Media Process Spawning Shell or Script Interpreter
description: Detects a GStreamer binary or known GStreamer-dependent media process spawning a shell, script interpreter, or download utility — consistent with post-exploitation activity following memory corruption of a media pipeline (e.g., CVE-2026-111183 rtpL16depay).
author: Security Arsenal
date: 2026/02/10
status: experimental
references:
- http://www.zerodayinitiative.com/advisories/ZDI-26-775/
- https://attack.mitre.org/techniques/T1203/
logsource:
category: process_creation
product: linux
detection:
selection_parent:
ParentImage|endswith:
- '/gst-launch-1.0'
- '/gst-play-1.0'
- '/gst-discoverer-1.0'
- '/totem'
- '/rhythmbox'
- '/cheese'
- '/pitivi'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/dash'
- '/zsh'
- '/python'
- '/python3'
- '/perl'
- '/curl'
- '/wget'
- '/nc'
- '/ncat'
- '/socat'
condition: selection_parent and selection_child
falsepositives:
- Rare; legitimate GStreamer applications do not normally spawn shells or download tools. Custom pipeline wrappers in transcoding farms should be reviewed.
level: high
tags:
- attack.execution
- attack.t1203
- attack.t1059
---
title: Crash Artifacts from GStreamer-Linked Media Processes
description: Detects repeated crashes of GStreamer-dependent media processes, which may indicate heap overflow probing or failed exploitation attempts against the rtpL16depay element (CVE-2026-111183).
author: Security Arsenal
date: 2026/02/10
status: experimental
references:
- http://www.zerodayinitiative.com/advisories/ZDI-26-775/
logsource:
category: process_creation
product: linux
detection:
selection:
CommandLine|contains:
- 'gstreamer'
- 'rtpL16depay'
- 'GstRtpL16Depay'
Image|endswith:
- '/apport'
- '/systemd-coredump'
- '/abrt-hook-ccpp'
- '/crashpad_handler'
condition: selection
falsepositives:
- Legitimate media pipeline instability; investigate source IP and RTP session history on any hit.
level: medium
tags:
- attack.initial_access
- attack.t1190
// Hunt: GStreamer-linked processes spawning shells/interpreters or making unexpected
// outbound connections — post-exploitation behavior following media parser compromise (CVE-2026-111183).
// Works with Syslog/CEF ingestion from Linux endpoints and Defender for Endpoint process telemetry.
let GstParents = dynamic(["gst-launch-1.0", "gst-play-1.0", "totem", "rhythmbox", "cheese", "pitivi", "kodi"]);
let SuspiciousChildren = dynamic(["sh", "bash", "dash", "zsh", "python", "python3", "perl", "curl", "wget", "nc", "ncat", "socat", "base64"]);
DeviceProcessEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName in~ (GstParents)
| where FileName in~ (SuspiciousChildren)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine,
FileName, ProcessCommandLine, AccountName, InitiatingProcessRemoteIP
| sort by TimeGenerated desc;
// Companion: unexpected egress from media processes
DeviceNetworkEvents
| where TimeGenerated > ago(7d)
| where InitiatingProcessFileName in~ (GstParents)
| where RemoteIP !startswith "10." and RemoteIP !startswith "192.168." and RemoteIP !startswith "172.16."
| summarize ConnectionCount = count(), Destinations = make_set(RemoteIP, 25) by DeviceName, InitiatingProcessFileName, RemotePort
| sort by ConnectionCount desc;
// Companion: crash telemetry referencing the vulnerable element (Syslog ingestion)
Syslog
| where TimeGenerated > ago(7d)
| where SyslogMessage has_any ("rtpL16depay", "GstRtpL16Depay", "gstreamer")
and SyslogMessage has_any ("segfault", "SIGSEGV", "heap", "core dumped", "abort")
| project TimeGenerated, Computer, ProcessName, SyslogMessage
| sort by TimeGenerated desc;
-- Artifact: Linux.Hunt.GStreamerExploitIndicators
-- Purpose: Identify GStreamer-linked processes with suspicious children, active RTP listeners,
-- and recently generated core dumps — triage for CVE-2026-111183 exploitation attempts.
-- 1) Running GStreamer-linked processes and their command lines
SELECT Pid, Ppid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)gstreamer|gst-launch|rtpl16|rtpbin'
OR Name =~ '(?i)gst-launch|totem|rhythmbox|kodi'
-- 2) Suspicious child processes of media applications
SELECT Pid, Ppid, Name, CommandLine, Username, CreateTime
FROM pslist()
WHERE Name =~ '(?i)^(sh|bash|dash|python3?|perl|curl|wget|nc|ncat|socat)$'
-- 3) UDP listeners in common RTP port ranges (5004/5005, 16384-32767)
SELECT Pid, Name, LocalAddress, LocalPort, RemoteAddress, RemotePort, Status
FROM netstat()
WHERE LocalPort in (5004, 5005)
OR (LocalPort >= 16384 AND LocalPort <= 32767 AND Status =~ '(?i)listen|udp')
-- 4) Recent core dumps / crash artifacts for media processes
SELECT FullPath, Size, Mtime, Atime
FROM glob(globs=['/var/lib/apport/coredump/*', '/var/crash/*', '/var/lib/systemd/coredump/*'])
WHERE FullPath =~ '(?i)gst|totem|rhythmbox|kodi|media'
ORDER BY Mtime DESC
#!/bin/bash
# CVE-2026-111183 — GStreamer rtpL16depay heap overflow: inventory, patch, verify
# Run as root on each Linux host. Review output before patching production media pipelines.
echo "=== [1] Installed GStreamer packages and versions ==="
if command -v dpkg >/dev/null 2>&1; then
dpkg -l | grep -Ei 'gstreamer|gst-plugins' | awk '{print $1, $2, $3}'
elif command -v rpm >/dev/null 2>&1; then
rpm -qa | grep -Ei 'gstreamer|gst-plugins' | sort
fi
echo "=== [2] Check for the vulnerable element (rtpL16depay) ==="
if command -v gst-inspect-1.0 >/dev/null 2>&1; then
gst-inspect-1.0 rtpl16depay >/dev/null 2>&1 && echo "[!] rtpl16depay element PRESENT — host is potentially exposed"
gst-inspect-1.0 --version | head -n1
else
echo "[-] gst-inspect-1.0 not found on this host"
fi
echo "=== [3] Processes currently linked against GStreamer libraries ==="
for pid in $(ls /proc | grep -E '^[0-9]+$'); do
if grep -qs 'libgstreamer\|libgstrtp' "/proc/$pid/maps" 2>/dev/null; then
echo "PID $pid: $(cat /proc/$pid/comm 2>/dev/null)"
fi
done
echo "=== [4] Apply vendor patches ==="
# Debian/Ubuntu:
# apt-get update && apt-get install --only-upgrade gstreamer1.0-plugins-good gstreamer1.0-plugins-base libgstreamer1.0-0
# RHEL/Fedora:
# dnf upgrade gstreamer1-plugins-good gstreamer1-plugins-base gstreamer1
# SUSE:
# zypper patch -t patch gstreamer-plugins-good
echo "=== [5] Post-patch verification — confirm package version matches vendor fixed release ==="
# dpkg -l gstreamer1.0-plugins-good # or: rpm -q gstreamer1-plugins-good
# gst-inspect-1.0 --version
echo "=== [6] Recent crash artifacts referencing GStreamer (hunting) ==="
if command -v coredumpctl >/dev/null 2>&1; then
coredumpctl list --no-pager 2>/dev/null | grep -Ei 'gst|totem|rhythmbox|media' | tail -n 20
fi
grep -Ei 'gstreamer|rtpL16' /var/log/syslog /var/log/messages 2>/dev/null | grep -Ei 'segfault|crash|abort' | tail -n 20
Remediation
1. Patch immediately. Apply the GStreamer vendor fix for CVE-2026-111183 as soon as your distribution publishes updated packages. The vulnerable code lives in the RTP plugin within gst-plugins-good, so prioritize updating gstreamer1.0-plugins-good (Debian/Ubuntu) or gstreamer1-plugins-good (RHEL/Fedora/SUSE), along with the core libgstreamer1.0 packages. Pull the exact fixed version from your distro security tracker and the upstream advisory at gstreamer.freedesktop.org/security. The ZDI advisory is at zerodayinitiative.com/advisories/ZDI-26-775.
2. Inventory exposure — this is the step most teams skip. GStreamer is linked by far more than media players. Enumerate every process and service linking libgstreamer or libgstrtp (see the script above), including VoIP gateways, PBX media services, WebRTC servers, surveillance/NVR pipelines, transcoding farms, and embedded/IoT firmware. Don't forget container images and flatpak/snap bundles — each carries its own copy of the library and must be rebuilt or updated independently.
3. Reduce attack surface where patching lags:
- If your application does not require L16 RTP audio, disable or remove the
rtpl16depayelement from pipelines, or restrict thertpplugin from autoplugging untrusted stream types. - Block or tightly restrict inbound UDP/RTP (ports 5004/5005 and 16384–32767) at network boundaries to only trusted media peers. A service that doesn't need public RTP should never see public RTP.
- For VoIP/RTC services, enforce SRTP and authenticated session signaling so media streams can only be established with legitimate peers.
4. Harden the blast radius. Run GStreamer-dependent services as dedicated low-privilege users with systemd sandboxing (ProtectSystem=strict, PrivateTmp=true, NoNewPrivileges=true, RestrictAddressFamilies where feasible). Ensure core dump capture is enabled and centralized — crash telemetry is your earliest exploitation indicator for parser bugs.
5. Hunt retrospectively. Before assuming you're clean, review crash logs, coredumps, and media service restarts over the past 30 days for GStreamer-linked processes, and correlate with inbound RTP sources you don't recognize.
6. Monitor for KEV inclusion. Given the 9.8 severity and network vector, watch CISA's Known Exploited Vulnerabilities catalog — if CVE-2026-111183 lands there, federal BOD 22-01 timelines will apply and your remediation SLA should tighten accordingly.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.