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-69249

CVE-2026-69249: Exponential Backtracking Denial of Service in python-cryptography X.509 Verification Engine

Alon Barad
Alon Barad
Software Engineer

Aug 3, 2026·5 min read·5 visits

Executive Summary (TL;DR)

Unauthenticated remote attackers can cause complete CPU exhaustion and Denial of Service (DoS) on endpoints using python-cryptography by submitting malformed certificate chains containing duplicate self-signed intermediates, triggering an exponential path-building backtracking loop.

An uncontrolled resource consumption vulnerability (CWE-400) exists in the python-cryptography library's Rust-based X.509 verification engine. The flaw allows unauthenticated remote attackers to trigger severe CPU exhaustion and Denial of Service (DoS) by supplying specially crafted certificate chains containing duplicate self-signed certificates, forcing the recursive path builder into an exponential state-search loop.

Vulnerability Overview

The python-cryptography library utilizes a Rust-based path validation module, cryptography-x509-verification, to construct and validate certificate paths from an end-entity leaf certificate back to a trusted anchor.

This engine exposes a critical attack surface on any server, application, or gateway that accepts client certificates, validates S/MIME signatures, or performs custom X.509 validations on untrusted user-supplied certificate inputs.

The vulnerability is classified under CWE-400: Uncontrolled Resource Consumption. Under adversarial conditions, the verification engine is susceptible to algorithmic complexity exploitation, wherein a relatively short, maliciously structured validation chain triggers high CPU usage and complete system unavailability.

Root Cause Analysis

The path building process in ChainBuilder::potential_issuers functions by mapping subject names to find candidate parents from the trust store and the untrusted intermediate certificate pool.

Prior to version 49.0.0, when the pool of untrusted intermediates contained multiple identical or structurally identical copies of a self-signed certificate, the potential_issuers method retrieved and processed each duplicate independently.

Because the recursive function build_chain_inner failed to deduplicate these candidate issuers or bound the number of cryptographic signature operations, the resolver entered a recursive backtracking search. For $k$ duplicate intermediate certificates and a maximum path search depth $d$, the engine performs up to $k^d$ recursive states and corresponding signature validations. This combinatorial explosion quickly saturates the host CPU.

Code Analysis and Remediation Patch

The vulnerability was resolved in commit 4a12cf49675a184e47f912b00b04f3a629283582 by implementing two complementary mitigation policies within the Rust engine.

First, a global signature validation budget of 128 check operations is introduced. Every signature verification decrements this budget, preventing unbound verification cycles. Second, candidate parent certificates are sorted and prioritized based on matching authority and subject key identifiers (AKI/SKI), pushing unlikely or duplicate name-colliding certificates to the bottom of the evaluation list.

Below is the structured representation of the path traversal workflow showing how validation flow has been bounded:

Let us review the key differences in src/rust/cryptography-x509-verification/src/lib.rs:

struct Budget {
    name_constraint_checks: usize,
+   signature_checks: usize,
}
 
impl Budget {
+   const DEFAULT_SIGNATURE_CHECK_LIMIT: usize = 1 << 7; // Max 128 checks
 
+   fn signature_check<'chain, B: CryptoOps>(&mut self) -> ValidationResult<'chain, (), B> {
+       self.signature_checks = self.signature_checks.checked_sub(1).ok_or_else(|| {
+           ValidationError::new(ValidationErrorKind::FatalError(
+               "Exceeded maximum signature check limit",
+           ))
+       })?;
+       Ok(())
+   }
}

The implementation of potential_issuers now performs a stable sort to group the most viable candidate issuers first, using AKI-to-SKI matching:

-   fn potential_issuers(
-       &self,
-       cert: &'a VerificationCertificate<'chain, B>,
-   ) -> impl Iterator<Item = &'a VerificationCertificate<'chain, B>> + '_ {
+   fn potential_issuers(
+       &self,
+       cert: &'a VerificationCertificate<'chain, B>,
+       cert_extensions: &Extensions<'chain>,
+   ) -> Vec<&'a VerificationCertificate<'chain, B>> {
+       let mut candidates: Vec<&'a VerificationCertificate<'chain, B>> = self
+           .store
+           .get_by_subject(&cert.certificate().tbs_cert.issuer)
+           .iter()
+           .chain(self.intermediates.iter().filter(|&candidate| {
+               candidate.certificate().subject() == cert.certificate().issuer()
+           }))
+           .collect();
+
+       let want_kid: Option<&[u8]> = cert_extensions
+           .get_extension(&AUTHORITY_KEY_IDENTIFIER_OID)
+           .and_then(|ext| ext.value::<AuthorityKeyIdentifier<'_, Asn1Read>>().ok())
+           .and_then(|aki| aki.key_identifier);
+
+       candidates.sort_by_key(|candidate| {
+           let have_kid: Option<&[u8]> = 
+               candidate.certificate().extensions().ok().and_then(|exts| {
+                   exts.get_extension(&SUBJECT_KEY_IDENTIFIER_OID)
+                       .and_then(|ext| ext.value::<&[u8]>().ok())
+               });
+
+           match (want_kid, have_kid) {
+               (Some(want), Some(have)) if want == have => 0, // Match (high priority)
+               (Some(_), Some(_)) => 2, // Mismatch (low priority)
+               _ => 1u8, // Missing ID (medium priority)
+           }
+       });
+       candidates
+   }

Exploitation & Benchmark Analysis

Exploitation does not require authentication or elevated privileges. An attacker simply submits a structured certificate chain containing several duplicates of a self-signed certificate.

Because the path validation engine explores all possible path combinations recursively, the CPU time increases exponentially relative to the number of duplicates. If the target server uses the unpatched verification engine, this process will block the executing thread indefinitely or until it hits a global worker timeout.

To demonstrate the vulnerability, the following performance table measures the validation duration of the unpatched vs. the patched library configuration:

DuplicatesMax Search DepthUnpatched Execution TimePatched Execution Time
170.00046 seconds0.00066 seconds
270.02515 seconds0.00122 seconds
370.48992 seconds0.00161 seconds
474.30940 seconds0.00214 seconds
381.46819 seconds0.00181 seconds
48TIMEOUT (> 5.00s)0.00241 seconds
57TIMEOUT (> 5.00s)0.00264 seconds
66TIMEOUT (> 5.00s)0.00282 seconds

Residual Attack Vectors and Limitations

Although the patch addresses the exponential explosion of cryptographic signature verification, some architectural edge cases remain.

First, potential_issuers continues to load and copy all matching intermediate certificates into a heap-allocated Vec before sorting. An attacker who uploads a chain with thousands of candidates can still force the server to allocate memory and perform $O(N \log N)$ operations. However, this is significantly less intensive than cryptographic signature operations.

Second, the name constraint budget of $2^{20}$ checks remains large. In highly complex, nested name constraint topologies, verification tasks could still introduce non-trivial latency overhead, though not sufficient to trigger a prolonged Denial of Service.

Official Patches

PyCAPull Request #14960 resolving path validation algorithmic complexity bugs

Fix Analysis (1)

Technical Appendix

CVSS Score
8.7/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Affected Systems

Python environments utilizing the cryptography package version < 49.0.0Application servers implementing custom X.509 chain building or client certificate verification using PolicyBuilderS/MIME and client-authenticated TLS validation gateways relying on the pyca/cryptography engine

Affected Versions Detail

Product
Affected Versions
Fixed Version
cryptography
PyCA
< 49.0.049.0.0
AttributeDetail
CWE IDCWE-400
Attack VectorNetwork (AV:N)
CVSS v4.0 Score8.7 (High)
ImpactDenial of Service (DoS) via CPU Exhaustion
Exploit StatusProof-of-Concept (PoC) available
KEV StatusNot listed on CISA KEV

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

The software does not properly control the allocation and maintenance of a limited resource, enabling an actor to influence the amount of resources consumed and leading to a denial of service.

Known Exploits & Detection

GitHub Security AdvisoryAdvisory containing the explanation and reproduction code demonstrating path construction resource consumption.

References & Sources

  • [1]GHSA-jwv3-5hgf-82ww: Path validation algorithmic complexity vulnerability
  • [2]Fix Commit 4a12cf49675a184e47f912b00b04f3a629283582
  • [3]Authoritative CVE-2026-69249 Record

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

•33 minutes ago•CVE-2026-69247
8.2

CVE-2026-69247: Bleichenbacher Oracle in pyca/cryptography PKCS#7 Decryption

A side-channel vulnerability in pyca/cryptography (versions 44.0.0 through 49.9.9) allows unauthenticated remote attackers to expose a Bleichenbacher oracle. This flaw exists within the PKCS#7 decryption module (specifically pkcs7_decrypt_der, pkcs7_decrypt_pem, and pkcs7_decrypt_smime) during Content Encryption Key (CEK) decryption when using RSA PKCS#1 v1.5 padding. Differences in error classification and symmetric execution timing allow an attacker to reconstruct plaintext keys.

Amit Schendel
Amit Schendel
1 views•7 min read
•about 3 hours ago•CVE-2026-69248
6.9

CVE-2026-69248: Name Constraints Bypass via Wildcard SANs in Python cryptography

An improper certificate validation vulnerability (CWE-295) in the Rust-based X.509 verification engine of python-cryptography allows wildcard Subject Alternative Names (SANs) to bypass permitted Name Constraints. This enables an attacker to construct certificates that escape the restricted scope of a subordinate Certificate Authority (CA) and successfully authenticate against vulnerable client installations. The vulnerability is tracked as CVE-2026-69248 and GHSA-m2h6-j472-rp4c, with a CVSS v4.0 base score of 6.9.

Alon Barad
Alon Barad
4 views•6 min read
•about 4 hours ago•CVE-2026-69244
7.1

CVE-2026-69244: Heap Out-of-Bounds Read in aiohttp C-Parser Error Handling

A high-severity heap-based out-of-bounds (OOB) read vulnerability exists in the Cython-based HTTP response and request parser extension of aiohttp. When processing malformed HTTP traffic, the parser fails to properly handle raw C pointers returned by the underlying llhttp library during error-message construction. This triggers an uncontrolled strlen() call on non-null-terminated network buffers, which can result in a Denial of Service (DoS) via worker process crash or the exposure of adjacent heap memory inside exception messages.

Alon Barad
Alon Barad
4 views•7 min read
•about 5 hours ago•CVE-2026-69192
7.7

CVE-2026-69192: SSRF Bypass via Parser Differential (Octal vs Decimal) in ip-address JavaScript Library

CVE-2026-69192 is a critical parser differential vulnerability in the 'ip-address' JavaScript library (versions <= 10.3.0). The library parses IPv4 octets containing leading zeros as base-10 (decimal), whereas standard system resolvers and web environments parse them as base-8 (octal). This discrepancy allows remote attackers to bypass SSRF guards and route malicious requests to internal RFC 1918 networks.

Alon Barad
Alon Barad
9 views•6 min read
•about 6 hours ago•CVE-2026-69151
7.6

CVE-2026-69151: Stored Cross-Site Scripting (XSS) in Angular Compiler i18n Pipeline via Event-Handler Attributes

A high-severity security vulnerability has been identified within the Angular compiler's internationalization (i18n) metadata collection and translation pipeline. Angular implements strict defenses against client-side execution injection by validating standard attribute and property bindings. However, when parsing elements containing both i18n translation attributes and inline event-handler elements (such as `i18n-onerror`), the compiler failed to assert the safety of the target attribute. Consequently, compromised or untrusted localization translation source files can supply arbitrary JavaScript payloads that replace static event-handler bindings. This arbitrary code is compiled directly into the localized build bundle and executed dynamically by the web browser, bypassing runtime sanitization, security checks, and standard binding constraints.

Amit Schendel
Amit Schendel
4 views•8 min read
•about 7 hours ago•CVE-2026-69153
6.3

CVE-2026-69153: Arbitrary File Read via Path Traversal in PostCSS

A directory traversal and arbitrary file read vulnerability exists in PostCSS due to an incomplete fix of CVE-2026-45623. When parsing a CSS file containing a sourceMappingURL comment with the 'from' parameter unset, path traversal and absolute path validations are bypassed, enabling attackers to read arbitrary local .map files.

Amit Schendel
Amit Schendel
6 views•5 min read