Aug 1, 2026·6 min read·5 visits
An unauthenticated remote attacker can crash any Go application utilizing Pion DTLS prior to v3.1.4 by sending a crafted 2-byte ServerKeyExchange packet during the DTLS handshake using ECDHE_PSK.
CVE-2026-54908 is a Denial of Service (DoS) vulnerability in the Pion DTLS library, where a malformed ServerKeyExchange message triggers an uncaught out-of-bounds slice read panic during handshake unmarshaling, terminating the hosting application process.
Pion DTLS is a widely utilized Go language implementation of Datagram Transport Layer Security (DTLS). It is commonly deployed in WebRTC applications, communication servers, and IoT gateways to secure UDP traffic. Because DTLS handles encrypted handshake negotiations on public-facing endpoints, its message-parsing engine constitutes a critical attack surface.
This vulnerability, designated as CVE-2026-54908, is a remote Denial of Service (DoS) bug class. It resides in the parsing logic for incoming ServerKeyExchange handshake packets. Specifically, the flaw is triggered when the library processes key exchange sequences under the Elliptic Curve Diffie-Hellman Ephemeral with Pre-Shared Key (ECDHE_PSK) cipher suites.
By transmitting a malformed ServerKeyExchange packet, an unauthenticated network adversary can force the Go runtime to panic. Because the Pion DTLS connection listener loop fails to recover from this panic, the entire host application process terminates abruptly. This leads to a complete loss of service availability for all active connections.
The structural flaw is located in the Unmarshal function within pkg/protocol/handshake/message_server_key_exchange.go. During the DTLS handshake using ECDHE_PSK, the parsing code sequentially processes several variable-length parameters starting with the Pre-Shared Key (PSK) Identity Hint.
The parsing logic reads the first two bytes of the payload to determine the length of the identity hint string. It then uses this parsed length to slice the remaining data buffer. If the parsed length is valid, the data buffer is sliced forward to parse subsequent parameters, including the Elliptic Curve Type and the Ephemeral Public Key.
The logic fails because it lacks a boundary validation check immediately following the PSK Identity Hint extraction. If an attacker delivers a ServerKeyExchange payload containing exactly two bytes, such as 0x00, 0x00, the parser interprets this as a PSK Identity Hint of length zero. The buffer is sliced with data = data[0:], which leaves the slice empty (length 0). Following this, the code attempts to read the Elliptic Curve Type by directly indexing data[0]. This out-of-bounds array access triggers a runtime panic.
The vulnerable code path lacks validation before accessing index zero of the remaining byte slice. In Go, indexing a slice with zero length generates an immediate runtime panic, as shown below:
// Vulnerable Implementation in pkg/protocol/handshake/message_server_key_exchange.go
func (m *MessageServerKeyExchange) Unmarshal(data []byte) error {
// ...
hintLen := binary.BigEndian.Uint16(data[0:2])
data = data[2:]
if len(data) < int(hintLen) {
return errLengthMismatch
}
m.IdentityHint = data[:hintLen]
data = data[hintLen:] // If data is now empty, len(data) is 0
// CRITICAL BUG: No check if len(data) > 0 before indexing
if _, ok := elliptic.CurveTypes()[elliptic.CurveType(data[0])]; ok {
m.EllipticCurveType = elliptic.CurveType(data[0])
}
// ...
}The patch addresses this issue by inserting an explicit length validation check right after the data slice operation. If the remaining slice length is zero, the function returns an errBufferTooSmall error instead of panicking:
// Patched Implementation in pkg/protocol/handshake/message_server_key_exchange.go
func (m *MessageServerKeyExchange) Unmarshal(data []byte) error {
// ...
m.IdentityHint = data[:hintLen]
data = data[hintLen:]
// Added validation check
if len(data) == 0 {
return errBufferTooSmall
}
if _, ok := elliptic.CurveTypes()[elliptic.CurveType(data[0])]; ok {
m.EllipticCurveType = elliptic.CurveType(data[0])
}
// ...
}The following diagram visualizes this execution path during the unmarshaling of the ServerKeyExchange message:
Exploitation of CVE-2026-54908 requires minimal complexity. To trigger the panic, an attacker must participate in a DTLS handshake negotiation where the target service supports or accepts ECDHE_PSK cipher suites. No authentication is required to reach the vulnerable handshake parsing code path.
The attack payload consists of a crafted ServerKeyExchange DTLS handshake packet. Within this packet, the PSK Identity Hint length fields are populated with zero-value bytes (0x00, 0x00), and no subsequent payload bytes are appended. When the target application receives this packet, the parsing routine proceeds through the identity hint step and immediately triggers the out-of-bounds slice index on the missing Elliptic Curve Type byte.
Because DTLS runs over the connectionless User Datagram Protocol (UDP), an attacker can easily transmit these handshake packets without maintaining complex connection state machines. This characteristic facilitates spoofing attacks and high-volume scans designed to continuously disrupt vulnerable nodes.
The security impact of CVE-2026-54908 is a persistent, complete Denial of Service. In Go, an unrecovered runtime panic on any goroutine terminates the entire process execution. Because the Pion DTLS connection listener does not implement a recovery mechanism to handle panic propagation from individual handshakes, a single malicious packet successfully crashes the entire server or client.
This vulnerability is assigned a CVSS v4.0 score of 6.3. The severity is moderate because it does not enable remote code execution or data exposure, but it completely undermines system availability.
For enterprise environments deploying Pion DTLS in microservices (e.g., inside Kubernetes pods), orchestrators may automatically restart crashed containers. However, continuous transmission of the exploit payload by an attacker will induce a crash loop, rendering the services unavailable indefinitely.
The primary resolution for this vulnerability is upgrading the Pion DTLS dependency in Go projects to version 3.1.4 or later. Note that version 3.1.3 was initially published but quickly retracted due to a certificate-handling bug that disrupted compatibility with Firefox clients. Security teams must ensure they bypass 3.1.3 and target 3.1.4 directly.
To identify potential exploitation attempts, security personnel should implement log monitoring for Go runtime panic traces containing the signature pattern of MessageServerKeyExchange.Unmarshal. System administrators can also configure intrusion detection rules to flag DTLS handshake packets containing empty PSK Identity Hint lengths followed by payload termination under the ECDHE_PSK cipher negotiation.
If immediate dependency upgrading is not possible, organizations should disable cipher suites utilizing the ECDHE_PSK key exchange algorithm within their DTLS configuration profiles. This configuration prevents the execution of the vulnerable Unmarshal code block entirely.
| Product | Affected Versions | Fixed Version |
|---|---|---|
Pion DTLS Pion | < 3.1.4 | 3.1.4 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-125 (Out-of-bounds Read) |
| Attack Vector | Network |
| CVSS Score | 6.3 (Medium) |
| Exploit Status | PoC Available |
| CISA KEV Status | Not Listed |
| Ransomware Use | No |
The software reads data past the end, or before the beginning, of the intended buffer.
A remote denial of service vulnerability exists in the pion/stun package before version 3.1.3. A malformed STUN packet containing a short or empty XOR-MAPPED-ADDRESS attribute triggers a runtime slice-bounds panic during parsing, terminating the entire Go process.
An open redirect vulnerability exists in core-geonetwork from versions 3.12.0 until 4.2.16 and 4.4.11 due to unsafe redirect validation in GeonetworkOAuth2LoginAuthenticationFilter and KeycloakAuthenticationProcessingFilter. An attacker can construct a protocol-relative URL to bypass local redirection checks and redirect authenticated users to malicious external domains.
An observable response discrepancy vulnerability in WPGraphQL versions 2.0.0 through 2.15.0 allows unauthenticated remote attackers to enumerate users and extract public profile metadata. Although the password reset mutation is designed to return a uniform success response to prevent enumeration, a legacy deprecated field resolver bypasses this mechanism by resolving the associated user profile if the target account exists.
Between versions 1.0.0 and 1.3.1, the gemini-bridge Model Context Protocol (MCP) server failed to restrict candidate file paths to the workspace root when processing files in inline mode. This allowed unauthenticated local users, or remote attackers executing prompt-injection payloads against connected AI agents, to traverse the directory tree and read arbitrary system files. The retrieved contents were subsequently forwarded to the external Gemini AI CLI and returned in the round-trip response.
FileBrowser Quantum (a fork of Filebrowser) prior to version 1.4.3-beta is vulnerable to multiple directory traversal flaws in its subtitle handler endpoint (`GET /api/media/subtitles`). This allows authenticated users with standard access to read arbitrary text files on the host system.
A security vulnerability in sigstore-go prior to version 1.2.1 allowed the use of expired or retired self-managed long-lived public keys wrapped in an ExpiringKey configuration to successfully sign code or artifacts. Because the verification pipeline verified the cryptographic signatures and RFC 3161 timestamps but failed to perform a temporal boundary check on the public key's validity window, verifiers running affected versions would mistakenly accept signatures produced outside of the key's designated operational lifetime.