A single malformed, unauthenticated UDP packet sent to a SIPSorcery media socket could crash the receive path and close the entire RTP/ICE channel, dropping an active call, with no handshake or credentials. Tracked as GHSA-28gm-jrmw-xx93 / CVE-2026-54632 (High, 7.5), it was fixed in PR #1677; upgrade SIPSorcery to 10.0.9 or later.
SIPSorcery is a widely used .NET stack for real-time communications: SIP telephony, VoIP, and WebRTC. Like every RTC stack, its media plane lives on UDP: audio and video arrive as RTP packets, and the connection is negotiated with ICE, whose keep-alives are STUN packets. That media socket takes bytes straight off the network, before any authentication. That is simply how real-time media works.
We found that a single crafted UDP packet, sent by anyone who could reach that port, could crash the receive path and close the entire RTP/ICE channel, dropping the call. No handshake, no credentials, no session state required. One packet.
Send one short, malformed RTP or STUN packet at the media socket and the receiver throws while parsing it, and then tears down the whole channel in response.
The bug is the seam between two pieces of code that are each locally reasonable:
Neither is obviously wrong on its own. A parser may assume well-formed input; a receive loop may want to fail loudly. But put them together on a socket that accepts unauthenticated packets from the open network, and the invariant that actually matters, “a malformed packet is dropped, not fatal,” is violated. One packet drives the channel into the closed state.
// the shape of the receive path, before the fix OnPacket(byte[] buf) { var pkt = RTPPacket.Parse(buf); // reads fixed offsets; a short buf throws ... } OnException(ex) { Close(); // one bad packet -> whole channel torn down }
Because UDP is connectionless and the source address is spoofable, the attacker needs no place in the call and no prior packets. The media port is discoverable from the SDP/ICE exchange, and a single datagram is enough to end an in-progress session: a clean, cheap, pre-authentication denial of service.
SIPSorcery PR #1677 (merged) closes both halves of the seam:
UdpReceiver no longer closes when an exception occurs processing a single packet. In the maintainer's words, that behaviour “was a potential DoS vector.” A bad packet is now dropped and the channel keeps running.The issue was reported privately ahead of the fix and is tracked as advisory GHSA-28gm-jrmw-xx93 / CVE-2026-54632 (High, 7.5). Everything up to and including 10.0.8 is affected; if you build on SIPSorcery, take 10.0.9 or later.
Update, August 2026: this one was picked up by the RTCSec News newsletter, in an issue whose editorial makes the case that AI-found vulnerabilities need a lab and a skeptic before they need a CVSS score. More on that, and on what we verified before sending the report, in Reproduce before you rate.
A parser that reads fixed offsets and a receive loop that closes on error each pass code review in isolation; nothing in either file is a “known-bad” pattern a linter flags. The defect only exists in the relationship between them, on the specific socket that receives untrusted input. RedMirror models how a packet actually flows through the receive path and looks for a reachable state where an unauthenticated input drives the system somewhere it shouldn't go: here, an active channel reaching closed with no consent from either peer. It reports the concrete input that gets there, so the maintainer can reproduce it before an attacker does.
A single malformed, unauthenticated UDP packet sent to the media socket could crash the SIPSorcery receive path and close the entire RTP/ICE channel, dropping an active call. No handshake, credentials, or session state were required. It is tracked as GHSA-28gm-jrmw-xx93 / CVE-2026-54632 (High, 7.5).
Two locally reasonable pieces of code met at a fatal seam. The RTP and STUN parsers read fields at fixed offsets and threw on a short or truncated packet, and the UDP receive loop treated any exception while processing a packet as fatal and closed the channel. Together, one bad packet drove the channel into the closed state.
Yes. It was fixed in PR #1677, which adds minimum-length checks for RTP-channel packets and STUN attributes and stops the UdpReceiver from closing when a single packet throws. Everything up to and including 10.0.8 is affected, so upgrade to 10.0.9 or later.
SIPSorcery, a widely used .NET and C# stack for real-time communications: SIP telephony, VoIP, and WebRTC. The defect was on its media socket, which takes bytes straight off the network before any authentication.
RedMirror models how a packet flows through the receive path and looks for a reachable state where an unauthenticated input drives the system somewhere it should not go: here, an active channel reaching closed with no consent from either peer. It reports the concrete input that gets there, so the maintainer can reproduce it before an attacker does.
Anything that parses untrusted bytes off a socket (media, protocol handlers, deserializers) has a seam like this. RedMirror audits for exactly the shape: an unauthenticated input that reaches a bad state, reported as a concrete, reproducible path.
Get RedMirror Read the docs