CVE-2026-61544
libp2p-quic: Remote panic via certificate expiry race during QUIC handshake
CVE-2026-61544 is a high vulnerability (CVSS 8.2) in Libp2p Rust-libp2p, published July 10, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.28%, the 21st percentile. Fixed in libp2p-quic 0.13.1.
- Severity
- 8.2 HighCVSS 4.0, CVE List
- Exploit chance
- 0.28%EPSS, 21st percentile
- Exploitation
- None knownNot on CISA’s or ENISA’s lists
- Fixed in
0.13.1libp2p-quic +3 more
Description
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Exploit likelihood
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
libp2p-quiccrates.io | before 0.13.1 | 0.13.1 |
libp2p-quiccrates.io | 0.0.0-0 up to 0.13.1 | 0.13.1 |
rust-libp2p-identityUbuntu:26.10 | All versions, plus listed versions 0.2.13+ds-1 | None known |
rust-libp2p-identityUbuntu:26.04:LTS | All versions, plus listed versions 0.2.10+20250205+ds-10.2.12+20250805+ds-20.2.13+ds-1 | None known |
What each source reports
CVE List Score used 8.2
libp2p-quic: Remote panic via certificate expiry race during QUIC handshake
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
- Record
CVE-2026-61544- CVSS 4.0
- 8.2 High
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 - Weakness
- CWE-248
- Updated
- 2026-11-02
EUVDEUVD-2026-79501 8.2
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
- Record
EUVD-2026-79501- CVSS 4.0
- 8.2 High
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 - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-5hq8-qhww-jm7q 8.2
libp2p-quic: Remote panic via certificate expiry race during QUIC handshake
Summary
libp2p-quic can panic on an inbound QUIC handshake if a malicious peer presents a valid, short lived libp2p TLS certificate and delays the final TLS 1.3 handshake fragment until the certificate expires.
This is remotely reachable by a network peer and can crash applications exposing a libp2p QUIC listener.
Details
During the TLS handshake, libp2p-tls parses and validates the peer certificate. After Quinn reports handshake completion, libp2p-quic re-parses the same certificate in the post-handshake upgrade path and assumes this cannot fail:
However, libp2p_tls::certificate::parse() re-runs certificate verification on every call, including a wall-clock validity check. A certificate that was valid during the first handshake time parse can expire before the second post-handshake parse, causing the expect(...) to panic.
PoC
A malicious peer can trigger this by:
- Opening a QUIC connection to a libp2p QUIC listener.
- Presenting a valid libp2p TLS certificate with a very short lifetime.
- Allowing the initial handshake-time certificate validation to succeed.
- Withholding the final client handshake fragment packet until after the certificate expires, but before the QUIC handshake timeout elapses.
- The listener completes the handshake and hits the post-handshake certificate re-parse, which panics.
Impact
Remote unauthenticated denial of service. Any application exposing an affected libp2p-quic listener can be crashed by a network peer that performs a valid-looking QUIC/TLS handshake with attacker-controlled timing. No malformed packets are required.
- Record
GHSA-5hq8-qhww-jm7q- CVSS 4.0
- 8.2 High
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 - Updated
- 2026-11-02
NVD 8.2
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
- Record
CVE-2026-61544- CVSS 4.0
- 8.2 High
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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Weakness
- CWE-248
- Updated
- 2026-11-02
OSV 8.2
libp2p-quic: Remote panic via certificate expiry race during QUIC handshake
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
- Record
CVE-2026-61544- CVSS 4.0
- 8.2 High
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 - Weakness
- CWE-248
- Updated
- 2026-11-13
OSVGHSA-5hq8-qhww-jm7q 8.2
libp2p-quic: Remote panic via certificate expiry race during QUIC handshake
Summary
libp2p-quic can panic on an inbound QUIC handshake if a malicious peer presents a valid, short lived libp2p TLS certificate and delays the final TLS 1.3 handshake fragment until the certificate expires.
This is remotely reachable by a network peer and can crash applications exposing a libp2p QUIC listener.
Details
During the TLS handshake, libp2p-tls parses and validates the peer certificate. After Quinn reports handshake completion, libp2p-quic re-parses the same certificate in the post-handshake upgrade path and assumes this cannot fail:
However, libp2p_tls::certificate::parse() re-runs certificate verification on every call, including a wall-clock validity check. A certificate that was valid during the first handshake time parse can expire before the second post-handshake parse, causing the expect(...) to panic.
PoC
A malicious peer can trigger this by:
- Opening a QUIC connection to a libp2p QUIC listener.
- Presenting a valid libp2p TLS certificate with a very short lifetime.
- Allowing the initial handshake-time certificate validation to succeed.
- Withholding the final client handshake fragment packet until after the certificate expires, but before the QUIC handshake timeout elapses.
- The listener completes the handshake and hits the post-handshake certificate re-parse, which panics.
Impact
Remote unauthenticated denial of service. Any application exposing an affected libp2p-quic listener can be crashed by a network peer that performs a valid-looking QUIC/TLS handshake with attacker-controlled timing. No malformed packets are required.
- Record
GHSA-5hq8-qhww-jm7q- CVSS 4.0
- 8.2 High
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 - Updated
- 2026-11-13
OSVUBUNTU-CVE-2026-61544 8.2
libp2p-rust is the official Rust language implementation of the libp2p networking stack. Prior to 0.13.1, libp2p-quic could panic during an inbound QUIC handshake when a remote peer presented a valid short-lived libp2p TLS certificate and delayed the final TLS 1.3 handshake fragment until after the certificate expired. In the Quinn post-handshake upgrade path, transports/quic/src/connection/connecting.rs called libp2p_tls::certificate::parse a second time in remote_peer_id and used expect on the result. The repeated wall-clock validity check could reject the now-expired certificate, causing the expect call to terminate any application exposing an affected libp2p-quic listener. This vulnerability is fixed in 0.13.1.
- Record
UBUNTU-CVE-2026-61544- CVSS 4.0
- 8.2 High
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 - Updated
- 2026-11-02
OSVRUSTSEC-2026-0525No score
Remote panic when a peer certificate expires during the QUIC handshake
After the QUIC handshake finished, the peer's libp2p TLS certificate was parsed a second time to get its peer ID, and the result was unwrapped with expect, on the assumption that it could not fail because the certificate had already been validated. Parsing checks the certificate's validity period again against the current time. A remote peer can present a certificate that is about to expire and delay the end of the handshake until it has expired, so the second parse fails and the process panics. No authentication is needed; any application with a reachable QUIC listener is affected.
The fix returns a connection error instead of panicking when the peer identity or certificate cannot be read after the handshake. It is in 0.13.1, and was backported to the main branch in libp2p/rust-libp2p#6525 for 0.14.0.
- Record
RUSTSEC-2026-0525- Updated
- 2026-11-13
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, facts, published, references | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
References
github.com/libp2p/rust-libp2p/security/advisories/GHSA-5hq8-qhww-jm7q
github.com/libp2p/rust-libp2p/pull/6525
github.com/libp2p/rust-libp2p/commit/212f3774af048e2cecfb2e6b1e08477685e52b22
github.com/libp2p/rust-libp2p/commit/e8f35e12c2418b04df6e9cdf036005e8aee3c7a2
github.com/advisories/GHSA-5hq8-qhww-jm7q
github.com/CVEProject/cvelistV5/tree/main/cves/2026/61xxx/CVE-2026-61544.json