Aug 1, 2026·6 min read·30 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 cross-tenant boundary breach vulnerability in Vikunja allows an authenticated user to trigger global task position recalculations across all tenant instances by creating a saved filter with an empty filter string payload.
An access revocation flaw in Vikunja allows removed collaborators to retain outbound webhooks and link shares created prior to revocation, enabling persistent exfiltration of sensitive task data.
Vikunja v2.6.0 contains a permission inheritance regression in pkg/models/project_access.go where explicit down-restrictions on sub-projects are overridden by higher parent project permissions due to MAX aggregation across project tree nodes.
An authorization bypass vulnerability in Vikunja's link share deletion handlers allows project members with Write privileges to delete Admin-tier link shares. The handler passes an unpopulated struct to the authorization check, causing the permission evaluation to fall back to default Write permissions instead of requiring Admin privileges.
Vikunja versions 2.2.0 through 2.6.0 contain a Cross-Origin Resource Sharing (CORS) misconfiguration flaw in `code.vikunja.io/api`. Default configurations permit wildcard origins for localhost (`http://127.0.0.1:*` and `http://localhost:*`) with credentialed requests (`Access-Control-Allow-Credentials: true`). Because configuring a public service URL appends to this default list rather than overriding it, production environments inadvertently trust all local origins. A local page or application on a user's machine can execute a credentialed cross-origin request to the token refresh endpoint, extract the returned JWT access token, and achieve complete account takeover.
An insufficient session invalidation vulnerability exists in pyLoad (pyload-ng) versions 0.5.0b3.dev98 through 0.5.0b3.dev101. When administrative actions like privilege revocation or password changes are executed via the public REST API, active user sessions on disk are not updated or invalidated. Consequently, affected sessions remain fully authenticated with stale permissions for up to 31 days.