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



GHSA-435G-FCV3-8J26

High Assurance, Low Availability: The Libcrux Triple Threat

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 12, 2026·5 min read·64 visits

Executive Summary (TL;DR)

Libcrux, a high-assurance crypto library, suffered from three distinct flaws: 1) An unauthenticated remote DoS caused by panicking on failed decryption, 2) Incorrect Ed25519 key derivation (clamping the seed instead of the scalar), and 3) Broken X25519 validation logic. Patches were released in Feb 2026.

In the world of cryptography, 'High Assurance' and 'Formally Verified' are the golden tickets. They promise mathematical certainty that code does exactly what it's supposed to do. But in February 2026, the `libcrux` library—a poster child for this movement—demonstrated that you can prove a theorem but still crash a server. This report details a trifecta of failures: a remotely triggerable Denial of Service via a Rust `unwrap()`, a cryptographic clamping error that rendered keys incompatible with the rest of the world, and a validation check so logically broken it rejected its own valid keys.

The Hook: When 'Verified' Meets Reality

There is a delicious irony in finding basic implementation bugs in software marketed as 'High Assurance.' libcrux is designed to be the Fort Knox of cryptography, using formal verification to prove correctness. It’s the kind of library you use when you don't trust standard OpenSSL implementations. But verification often proves that the code matches a specification, not that the specification—or the glue code around it—is sane.

In early 2026, researchers at Symbolic Software popped the hood on libcrux and found three glaring issues that range from 'cryptographically annoying' to 'operationally fatal.' The most embarrassing? A classic Rust newbie mistake: handling fallible operations with a panic.

While the cryptographic math might have been sound in a vacuum, the implementation committed the cardinal sin of systems programming: assuming inputs will always be well-formed. This report dissects how a library built for safety left the door open for a cheap Denial of Service and generated keys that looked correct but were mathematically isolated from the rest of the RFC-compliant world.

The Flaw: A Comedy of Errors

This vulnerability isn't one bug; it's a trench coat containing three smaller bugs standing on each other's shoulders.

1. The Panic Button (DoS): In libcrux-psq, the library implemented AEAD (Authenticated Encryption with Associated Data). When decrypting data, the library must verify the authentication tag. If the tag is wrong (spoofed or corrupted), decryption fails. In Rust, you handle this with a Result. libcrux decided to handle it with .unwrap(). This means if an attacker sends any garbage data, the decryption returns an error, .unwrap() panics, and the entire application crashes. Unauthenticated, remote, instant kill.

2. The Clamping Confusion (Ed25519): Curve25519 requires 'clamping'—setting specific bits to ensure security properties. RFC 8032 says: take the 32-byte seed, SHA-512 hash it, then clamp the resulting scalar. libcrux got eager and clamped the seed before hashing it. This reduced the entropy of the seed (wasting 5 bits) and, critically, generated public keys that no other standard library (Sodium, OpenSSL, etc.) could reproduce from the same seed. It’s like speaking a dialect of English that only you understand.

3. The Impossible Check (X25519): The library tried to validate imported keys with the logic: if value[31] & 64 != 1. Let's do the math. value[31] is a byte. 64 is 0x40 (binary 01000000). A bitwise AND between any byte and 64 results in either 0 or 64. Neither of those is 1. The condition is logically nonsensical, leading to valid keys being rejected or accepted based on flawed premises.

The Code: The Smoking Gun

Let's look at the diffs, because they paint a vivid picture of the oversight.

The DoS (AEAD Unwrap): Here is the culprit in src/aead.rs. The code was unwrapping the result of the decryption. If the ciphertext was tampered with, decrypt returns an Err, and unwrap sends the process to the graveyard.

// BEFORE (Vulnerable)
let plaintext = aead::decrypt(key, nonce, associated_data, ciphertext)
    .unwrap(); // <--- The self-destruct button
 
// AFTER (Fixed)
let plaintext = aead::decrypt(key, nonce, associated_data, ciphertext)
    .map_err(|_| Error::DecryptionFailed)?; // Propagate the error safely

The Logical Falacy (X25519 Check): The validation logic in libcrux-psq was trying to enforce bit settings but failed basic boolean logic.

// BEFORE (Broken Logic)
// 64 is 0x40. (x & 0x40) is either 0 or 64. It is never 1.
if value[31] & 64 != 1 {
    return Err(Error::InvalidKey);
}
 
// AFTER (Corrected)
// Checks if the 6th bit is set (which is 0x40)
if value[31] & 0x40 == 0 {
     return Err(Error::InvalidKey);
}

The Clamping Mix-up: The fix involved moving the bit-clearing operations to happen after the SHA-512 expansion, aligning the implementation with RFC 8032.

The Exploit: Crashing the Party

Exploiting the encryption flaws (clamping) is subtle and mostly results in broken interoperability. However, exploiting the AEAD panic is trivial and devastating for availability.

Target: A server using libcrux-psq to handle encrypted sessions (e.g., a secure handshake or VPN termination).

Attack Chain:

  1. Recon: Identify the service is using libcrux (perhaps via banner grabbing or specific protocol behavior).
  2. Weaponization: Construct a packet that looks like a valid encrypted message but contains a random, invalid authentication tag (MAC). You don't need the key; you just need to fail the integrity check.
  3. Delivery: Send the packet to the listening port.
  4. Execution:
    • The server receives the packet.
    • It calls aead::decrypt().
    • The Poly1305 (or equivalent) tag check fails.
    • The library returns Err.
    • The code calls .unwrap() on the Err.
    • SIGABRT. The server process terminates immediately.

This is an asymmetric attack. It costs the attacker one packet and zero CPU to crash a high-assurance system that might take seconds or minutes to restart.

The Mitigation: Fixing the Foundation

The remediation is straightforward: upgrade the library. The flaws are implementation defects, not protocol weaknesses, so no configuration change will save you. You must replace the binary.

Steps:

  1. Update libcrux crates to the latest version (released post-Feb 9, 2026).
  2. Key Rotation (Crucial): If you generated Ed25519 keys using the vulnerable version, those keys are technically 'valid' curve points, but they are non-standard. If you try to import them into OpenSSL or Go's crypto library, they will likely derive a different public key or fail verification. You should regenerate these keys using the patched library to ensure RFC compliance.
  3. Audit Dependents: Check any Rust code in your organization for unwrap() calls on cryptographic operations. This pattern is a plague. Use clippy or custom linting rules to ban .unwrap() in production network paths.

Official Patches

CryspenPull request merging fixes for reported issues

Fix Analysis (2)

Technical Appendix

CVSS Score
7.5/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
EPSS Probability
0.04%

Affected Systems

Rust applications using libcrux-ed25519Rust applications using libcrux-ecdhRust applications using libcrux-psqSystems relying on high-assurance implementations of Noise or MLS using these crates

Affected Versions Detail

Product
Affected Versions
Fixed Version
libcrux-ed25519
Cryspen
< Feb 2026 PatchCommit 4d6f5d3
libcrux-psq
Cryspen
< Feb 2026 PatchCommit f303b64
AttributeDetail
CWE-248Uncaught Exception (Panic)
CWE-326Inadequate Encryption Strength (Entropy Loss)
CWE-20Improper Input Validation
CVSS7.5 (High)
Attack VectorNetwork (Unauthenticated)
ImpactDenial of Service & Interoperability Failure

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1499.004Application or System Exploitation
Impact
CWE-248
Uncaught Exception

Known Exploits & Detection

GitHubAnalysis and PoC by Symbolic Software

Vulnerability Timeline

Symbolic Software identifies issues and submits PRs
2026-02-04
Symbolic Software publishes 'On the Promises of High-Assurance Cryptography'
2026-02-05
Cryspen merges fixes for AEAD panic and Ed25519 clamping
2026-02-09

References & Sources

  • [1]On the Promises of 'High-Assurance' Cryptography
  • [2]GHSA Advisory

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

•9 minutes ago•CVE-2026-56677
8.6

CVE-2026-56677: Unauthenticated Server-Side Request Forgery in 9Router OIDC Test Endpoint

A high-severity security vulnerability exists in 9Router, an AI router and token saver dashboard. When dashboard authentication features are disabled or left in default configurations, the application exposes administrative testing routines directly to the public internet. Unauthenticated network adversaries can exploit the OIDC configuration validation endpoint to initiate arbitrary HTTP requests, routing unauthorized traffic to local loops, adjacent container ports, and cloud resource metadata interfaces.

Amit Schendel
Amit Schendel
0 views•5 min read
•about 1 hour ago•CVE-2026-64849
9.3

CVE-2026-64849: Server-Side Request Forgery (SSRF) in MLflow Webhooks via DNS Rebinding

CVE-2026-64849 is a critical Server-Side Request Forgery (SSRF) vulnerability affecting MLflow tracking servers prior to version 3.15.0. It allows unauthenticated remote attackers to bypass outbound request destination filters using DNS rebinding or HTTP redirects. This exposure risks compromising sensitive cloud infrastructure metadata and internal microservices.

Alon Barad
Alon Barad
2 views•5 min read
•about 2 hours ago•CVE-2026-69146
6.5

CVE-2026-69146: Missing Authorization Bypass in MLflow Basic Authentication Middleware

This technical report details a missing authorization vulnerability (CVE-2026-69146 / GHSA-3p64-6gvh-82v5) affecting the MLflow platform from version 3.13.0 to 3.15.0. When MLflow is configured with the built-in basic-auth plugin, authenticated users can bypass run-level UPDATE authorization checks, enabling unauthorized dataset and model lineage metadata injection.

Alon Barad
Alon Barad
2 views•7 min read
•about 3 hours ago•CVE-2026-69148
7.1

CVE-2026-69148: Broken Object Level Authorization (BOLA) in MLflow Model Registry

MLflow prior to version 3.15.0 fails to perform proper authorization checks when registering model versions, allowing authenticated users with access to a registered model to link and access artifacts from runs and models belonging to other users without authorization.

Amit Schendel
Amit Schendel
4 views•7 min read
•about 4 hours ago•CVE-2026-59893
7.5

CVE-2026-59893: Regular Expression Denial of Service in sqlparse Lexer

A high-severity Regular Expression Denial of Service (ReDoS) vulnerability in the sqlparse Python library prior to version 0.6.0 allows unauthenticated remote attackers to trigger CPU exhaustion and application denial of service via crafted SQL inputs containing unmatched dollar-quoted literals or unclosed multiline comments.

Alon Barad
Alon Barad
4 views•6 min read
•about 5 hours ago•GHSA-FHGH-WQ4Q-R37X
7.8

GHSA-FHGH-WQ4Q-R37X: Remote Code Execution via Sigstore Signature Verification Bypass in uniget CLI

A high-severity logic inversion flaw in the uniget CLI completely bypasses Sigstore cryptographic signature verification on metadata files by default. If an attacker can poison the package metadata cache or repository, they can execute arbitrary OS commands under the privileges of the active user.

Alon Barad
Alon Barad
5 views•5 min read