Sep 16, 2026·7 min read·3 visits
Unauthenticated remote attackers can crash libp2p-quic nodes by stalling handshakes with short-lived certificates that expire during the connection phase.
CVE-2026-61544 is a high-severity remote Denial of Service (DoS) vulnerability in libp2p-quic, the QUIC transport implementation of the official Rust networking stack for libp2p. It allows unauthenticated remote attackers to trigger an uncaught panic and crash listener applications.
The libp2p-quic crate provides QUIC-based transport mechanisms for the Rust implementation of the libp2p network stack. The library supports peer identification and encryption on inbound network connections, relying on the QUIC transport and a TLS 1.3 handshake to exchange peer certificates. This setup establishes identity authenticity and provides cryptographic verification of public keys.
A high-severity denial of service vulnerability exists in the post-handshake identity extraction pipeline. An unauthenticated remote attacker can force a host application to crash by presenting a certificate with a very short validity window and actively stalling the TLS handshake process. The flaw is categorized as an uncaught exception (CWE-248) stemming from unsafe parsing assumptions when evaluating the certificate chain.
The attack surface is exposed on any active libp2p node listening for inbound QUIC connections. Since peer verification happens during connection setup before any application-level authentication, any exposed port running libp2p-quic is susceptible. The vulnerability does not require prior privileges or user interaction, representing a high availability threat.
To understand the failure mode, it is necessary to examine how rust-libp2p performs connection upgrades. When a remote node initiates a connection, the underlying TLS library (rustls via the quinn crate) handles the initial cryptographic handshake. During this phase, rustls validates the peer's certificate chain, verifying cryptographic signatures and ensuring the host's current clock falls between the certificate's not_before and not_after bounds.
Once the TLS handshake succeeds, libp2p-quic executes a post-handshake upgrade routine in transports/quic/src/connection/connecting.rs via the remote_peer_id() function. This routine extracts the Peer ID from the established TLS session by passing the peer's certificate back to the libp2p_tls::certificate::parse() function. The developers assumed that since the certificate had just survived validation by rustls, parsing it immediately afterward was an infallible operation.
Based on this assumption, the code used .expect("the certificate was validated during TLS handshake; qed") to unwrap the parsing result. However, libp2p_tls::certificate::parse() does not merely decode the certificate structure; it also performs its own validation, including re-evaluating the temporal validity against the system clock. This creates a time-of-check to time-of-use (TOCTOU) race condition.
If an attacker issues a certificate with an expiration time designed to lapse during the brief window of the handshake, the initial check by rustls succeeds. By intentionally delaying the transport of the final TLS handshake messages, the attacker ensures the system clock passes the certificate's expiration time before remote_peer_id() is evaluated. When parse() is called during the post-handshake phase, it detects the expired certificate, returns an Err, and triggers the .expect() panic, crashing the supervisor thread.
A comparison of the vulnerable and patched code reveals how the logic was refactored to replace infallible unwraps with explicit error propagation. In the vulnerable implementation of remote_peer_id(), multiple assumptions were made using panicking assertions like .expect() and .unwrap(). The critical vulnerability point occurred when calling libp2p_tls::certificate::parse().
In commit e8f35e12c2418b04df6e9cdf036005e8aee3c7a2, the function signature of remote_peer_id() was modified to return a Result<PeerId, Error> rather than returning a raw PeerId and panicking on failure. The team introduced a local helper function, transport_err(), which converts parsing failures and missing credentials into structured QUIC transport errors. These errors map specifically to the PROTOCOL_VIOLATION transport error code.
Instead of forcing a thread panic, the updated logic uses ok_or_else(), map_err(), and the ? operator to safely surface the validation failures. The caller function, representing the Future execution block of the Connecting state, propagates this error upward to the network stack. Rather than terminating the entire listener application, the stack aborts the specific connection attempt while maintaining the availability of the host node.
The fix is highly effective and complete because it removes the assumption of post-handshake infallibility. By transforming a fatal runtime panic into a standard network transport error, the system safely sheds malicious connections. No variant attacks against this specific path remain viable as all unwrap and expect calls have been removed from the handshake parse phase.
Exploiting this vulnerability requires precise network transport control but is structurally straightforward. An attacker generates an asymmetric key pair and constructs a self-signed certificate. Crucially, the certificate's not_after expiration timestamp is set to a window only slightly ahead of the current global time, such as 50 to 100 milliseconds into the future.
The attacker then initiates a standard QUIC connection with the target node. When the target's TLS layer processes the initial handshake packets, the certificate is temporally valid, allowing the connection sequence to proceed. At this point, the attacker deliberately holds back or throttles the final handshake packets, forcing the target's connection state machine to stall.
During this injected delay, the certificate's narrow validity window expires. Once the delay threshold is met, the attacker releases the final packets, completing the TLS session. The target node transitions to the post-handshake identity extraction phase, executes the re-parsing function, and triggers the fatal panic.
A simple API-level integration test demonstrates that expired certificates correctly yield errors rather than panics post-patch, proving the efficacy of the remediation.
The primary consequence of successful exploitation is a complete Denial of Service (DoS) of the affected libp2p node. Because the crash occurs within the execution context of the main network supervisor thread, the uncaught panic propagates to the process boundary. This shuts down the host application, terminating all active peer connections and preventing new connections from being established.
In decentralized networks where rust-libp2p is widely deployed, such as Ethereum consensus clients, Polkadot validator nodes, or IPFS infrastructure, this vulnerability represents an operational threat. A malicious actor could systematically scan the network and crash peer nodes, potentially disrupting consensus networks or file-sharing swarms. The low attack complexity and lack of authentication credentials heighten the overall risk profile.
The CVSS v4.0 score of 8.2 (High) accurately reflects these parameters. The attack vector is Network (AV:N), complexity is High (AC:H) due to the timing constraints, and privileges required are None (PR:N). While there is no impact on confidentiality (VC:N) or integrity (VI:N), the availability impact is High (VA:H), meaning system operators must prioritize deployment of the patch.
The definitive remediation for this vulnerability is upgrading the libp2p-quic dependency to version 0.13.1 or higher. For complete systems relying on the bundled libp2p meta-crate, developers should verify that the underlying transport resolves to the patched version. Since the Rust compiler statically links dependencies, affected applications must be recompiled and redeployed.
In environments where immediate software updates are impossible, network operators can implement temporary mitigations. Restricting access to the QUIC port using stateful firewalls or rate-limiting incoming connection requests can reduce the efficiency of scanning tools. Additionally, deploying service managers configured to automatically restart the application upon a crash can partially offset the impact of successful DoS attempts, though it does not address the underlying flaw.
Developers are advised to review other handshake and protocol transition logic for similar uses of .expect() or .unwrap(). In Rust network programming, assuming that external input remains valid across state boundaries is a common anti-pattern. Validating all external data at the exact point of consumption, rather than relying on prior state assumptions, is essential for writing robust, panic-free network services.
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
libp2p-quic libp2p | < 0.13.1 | 0.13.1 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-248 |
| Attack Vector | Network (AV:N) |
| CVSS Score | 8.2 (High) |
| Impact | Denial of Service (Process Crash) |
| Exploit Status | PoC (Integration Test Proof) |
| KEV Status | Not Listed |
The product does not catch or otherwise handle an exception, which can cause the product to crash or terminate abnormally.
CVE-2026-69201 is a critical directory traversal vulnerability in the http4s Scala library. Affected versions of ResourceService and WebjarService allow attackers to escape the configured resource directory and access arbitrary files on the classpath or filesystem by using percent-encoded path separators. The flaw arises from decoding URL segments prior to validating them against directory escape patterns.
An uncontrolled resource consumption vulnerability in the http4s Ember HTTP/2 server and client implementation leads to unauthenticated heap memory exhaustion and denial of service. The vulnerability stems from deferring frame size validation until the entire declared payload size is buffered.
CVE-2026-61554 is a high-severity uncontrolled resource consumption vulnerability in the http_poll transport component of the emp3r0r Command and Control (C2) framework. In affected versions prior to 4.2.5, the C2 server allocates session tracking resources, spawns execution routines, and routes incoming unauthenticated request bodies into the core dispatch engine before verifying the client's cryptographic authentication token. This logical ordering flaw allows unauthenticated remote attackers to exhaust critical host system resources and trigger a sustained denial of service.
A constellation of five distinct security flaws (F1 through F5) in `@zereight/mcp-gitlab` prior to version 2.1.30 allows unauthenticated remote access, read-only policy bypasses, DNS rebinding, and denial-of-service via session exhaustion.
A critical security vulnerability has been identified in the @zereight/mcp-gitlab implementation of the Model Context Protocol (MCP) server. Prior to version 2.1.30, the server lacks HTTP Host and Origin header validation on its Streamable HTTP transport interface (/mcp). This security omission permits remote attackers to bypass the Same-Origin Policy (SOP) via a DNS Rebinding attack. Under this vector, an attacker can route malicious API requests to the victim's local or internal MCP server, thereby gaining unauthorized control over the victim's GitLab account and resources.
A critical Server-Side Request Forgery (SSRF) vulnerability in @zereight/mcp-gitlab allows attackers to leak sensitive GitLab Private-Tokens by supplying an arbitrary external hostname via the X-GitLab-API-URL header when dynamic routing is enabled.