CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-61544

CVE-2026-61544: Remote Panic in libp2p-quic via Certificate Expiry Race

Alon Barad
Alon Barad
Software Engineer

Sep 16, 2026·7 min read·12 visits

Executive Summary (TL;DR)

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.

Vulnerability Overview

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.

Root Cause Analysis

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.

Code-Level Analysis and Patch Evaluation

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.

Exploitation Methodology & Proof of Concept

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.

Impact and Severity Assessment

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.

Remediation and Operational Defense

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.

Fix Analysis (2)

Technical Appendix

CVSS Score
8.2/ 10
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

Affected Systems

rust-libp2p (specifically the libp2p-quic transport)

Affected Versions Detail

Product
Affected Versions
Fixed Version
libp2p-quic
libp2p
< 0.13.10.13.1
AttributeDetail
CWE IDCWE-248
Attack VectorNetwork (AV:N)
CVSS Score8.2 (High)
ImpactDenial of Service (Process Crash)
Exploit StatusPoC (Integration Test Proof)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1499.004Endpoint Denial of Service: Application Denial of Service
Impact
CWE-248
Uncaught Exception

The product does not catch or otherwise handle an exception, which can cause the product to crash or terminate abnormally.

References & Sources

  • [1]GitHub Security Advisory GHSA-5hq8-qhww-jm7q
  • [2]Official Pull Request #6525
  • [3]Fix Commit 1 (Regression Test)
  • [4]Fix Commit 2 (QUIC Refactoring)
  • [5]CVE Registry Entry

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-119282
7.3

CVE-2026-119282: OS Command Injection via Plugin Options in Nx (@nx/maven and @nx/gradle)

An OS command injection and argument injection vulnerability exists in the Nx build system and its official Maven (@nx/maven) and Gradle (@nx/gradle) plugins. When constructing the project dependency graph, the plugins invoke underlying Java build wrappers via subshells while interpolating unsanitized plugin options directly from nx.json into the command arguments. An attacker who supplies a crafted nx.json file via a repository or pull request can execute arbitrary shell commands with the privileges of the user or CI/CD runner invoking any Nx command that computes the project graph.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 2 hours ago•CVE-2026-59978
7.5

CVE-2026-59978: Persistent Denial of Service via Array Injection in AdminNeo

AdminNeo versions 4.6.2 through 5.4.1 contain an improper input validation vulnerability (CWE-20) in the version verification endpoint (?script=version). An unauthenticated remote attacker can submit a crafted HTTP POST request containing an array parameter for 'version', which is serialized into a shared server-side temporary cache file without type checking or authentication. On subsequent requests, the application deserializes this cached array and passes it to cookie() and rawurlencode(), triggering an uncaught fatal TypeError in PHP 8.x environments and causing a persistent 24-hour Denial of Service (DoS) for all users.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 3 hours ago•GHSA-FGXM-5HVV-X4VH
5.3

GHSA-fgxm-5hvv-x4vh: Private Repository Enumeration via Go Module Discovery and HTTP Response Discrepancies in Soft Serve

Charmbracelet Soft Serve versions 0.5.0 through 0.12.2 contain an authorization bypass and observable response discrepancy vulnerability in the HTTP Git server. Remote attackers can determine the existence, exact names, and clone URLs of private repositories by issuing crafted Go remote import path discovery requests (?go-get=1) or by observing differential HTTP status codes across Git Smart HTTP, Dumb HTTP, and Git LFS endpoints.

Alon Barad
Alon Barad
5 views•12 min read
•about 4 hours ago•GHSA-F3FJ-9625-RV3M
5.9

GHSA-f3fj-9625-rv3m: Race Condition in Soft Serve Repository Cache Invalidation

A Time-of-Check to Time-of-Use (TOCTOU) race condition in Charmbracelet Soft Serve versions 0.6.0 through 0.12.2 allows unauthenticated users to retain read access to repositories after their visibility is changed from public to private. The flaw stems from premature cache invalidation in the SetPrivate method prior to committing the visibility update to the underlying database. Concurrent read requests arriving during the database transaction window repopulate the non-expiring in-memory LRU cache with stale public metadata, bypassing access controls across HTTP, SSH, and Git protocols until the server process is restarted.

Alon Barad
Alon Barad
4 views•10 min read
•about 5 hours ago•CVE-2026-119283
7.5

CVE-2026-119283: Unbounded JWE Recipients Array Causes CPU Exhaustion in Authlib joserfc

A resource consumption vulnerability exists in the Authlib joserfc Python library prior to version 1.7.5. When processing JSON Web Encryption (JWE) objects formatted using General JSON Serialization, the library fails to enforce an upper bound on the number of elements within the recipients array. An unauthenticated attacker can supply a JWE containing thousands of recipient entries targeting an RSA key management algorithm, forcing the server to perform an equivalent number of computationally expensive RSA private-key decryption operations per request and exhausting available CPU resources.

Alon Barad
Alon Barad
4 views•9 min read
•about 6 hours ago•CVE-2026-119284
6.9

CVE-2026-119284: Uncontrolled Resource Consumption in joserfc Compact Deserialization

CVE-2026-119284 (GHSA-9pg5-8c7x-5hfx) is an uncontrolled resource consumption vulnerability (CWE-400) in the compact serialization deserialization routines of joserfc prior to version 1.7.6. The library enforced individual segment size limits only after invoking Python's bytes.split(b'.') on untrusted input tokens. By sending oversized compact JWS or JWE tokens, an unauthenticated remote attacker can force the Python interpreter to duplicate and allocate memory for every segment before size validation executes, resulting in memory exhaustion and an Endpoint Denial of Service (DoS).

Amit Schendel
Amit Schendel
8 views•10 min read