Skip to main content
Vulnerability Database/CVE-2026-92091

CVE-2026-92091: jwcrypto JWK Key Import DOS Vulnerability

CVE-2026-92091 is a denial of service vulnerability in jwcrypto that allows attackers to consume excessive CPU time through malicious JWK key_ops arrays. This article covers technical details, affected versions, and mitigation.

Published:

CVE-2026-92091 Overview

CVE-2026-92091 is a denial-of-service flaw in jwcrypto, a Python library that implements JSON Web Key (JWK), JSON Web Signature (JWS), and JSON Web Encryption (JWE) primitives. The JWK.import_key() function validates the key_ops JWK member for duplicate entries using an algorithm with O(n^2) time complexity, and the array length is not bounded. A remote, unauthenticated attacker can submit a JWK with a large key_ops array to any endpoint that imports attacker-controlled key material, consuming excessive CPU time. The issue is tracked under CWE-407: Inefficient Algorithmic Complexity.

Critical Impact

Unauthenticated attackers can exhaust CPU resources on any service that imports untrusted JWKs via ECDH-ES key agreement, OIDC dynamic client registration, DPoP, or ACME account key registration.

Affected Products

  • jwcrypto Python library (upstream project maintained by latchset)
  • Red Hat products consuming the jwcrypto package (see Red Hat CVE-2026-92091 Advisory)
  • Applications exposing JWK import via OIDC, DPoP, ACME, or ECDH-ES key agreement flows

Discovery Timeline

  • 2026-09-16 - CVE-2026-92091 published to NVD
  • 2026-09-16 - Last updated in NVD database

Technical Details for CVE-2026-92091

Vulnerability Analysis

The vulnerability resides in JWK.import_key(), the entry point used by jwcrypto to parse and validate JWK objects. During validation, the function inspects the key_ops array — an optional JWK member that lists permitted key operations such as sign, verify, encrypt, or decrypt. To reject duplicate operations, the routine performs pairwise comparisons rather than using a hash-based deduplication strategy. The result is quadratic scaling with the array length.

Because jwcrypto does not enforce an upper bound on key_ops, an attacker can submit an array containing tens or hundreds of thousands of entries. Each additional element multiplies the work performed by the validator. Any protocol flow that accepts an attacker-supplied JWK inherits the flaw. That includes Elliptic Curve Diffie-Hellman Ephemeral Static (ECDH-ES) key agreement in JWE, OpenID Connect (OIDC) dynamic client registration, Demonstrating Proof-of-Possession (DPoP), and Automatic Certificate Management Environment (ACME) account key registration.

Root Cause

The root cause is an algorithmic complexity flaw in duplicate detection combined with the absence of input-size limits. Validation should complete in linear time using a set-based membership check, and the parser should reject oversized key_ops arrays before scanning them.

Attack Vector

The attack requires no authentication and no user interaction. An attacker crafts a JWK JSON document containing an oversized key_ops array and submits it to any exposed endpoint that calls JWK.import_key() on the payload. A single request can pin a worker process on CPU for an extended period. Repeated requests exhaust worker pools and degrade or halt service availability.

Refer to the GitHub Security Advisory GHSA-pwgw-f7xr-863h for upstream technical details.

Detection Methods for CVE-2026-92091

Indicators of Compromise

  • Inbound HTTP requests containing JWK payloads with key_ops arrays exceeding a few dozen entries.
  • Sustained high CPU on worker processes handling OIDC registration, DPoP, ACME, or JWE endpoints without a corresponding rise in successful transactions.
  • Elevated request latency or timeouts on endpoints that call jwcrypto.jwk.JWK.import_key().

Detection Strategies

  • Instrument the JWK import path to log the size of the key_ops array and emit an alert when it exceeds a policy threshold.
  • Deploy web application firewall (WAF) rules that inspect JSON bodies for key_ops arrays above a safe length limit and drop the request.
  • Baseline CPU time per request for endpoints that process JWKs and alert on statistical outliers.

Monitoring Recommendations

  • Correlate slow-request telemetry with source IP addresses to identify abusive clients targeting JWK-consuming endpoints.
  • Track process CPU saturation events alongside request logs for OIDC, DPoP, and ACME services to surface algorithmic DoS attempts.
  • Ingest application and WAF logs into a centralized analytics platform for cross-service correlation of anomalous JWK payloads.

How to Mitigate CVE-2026-92091

Immediate Actions Required

Patch Information

The upstream jwcrypto project has released a fix that bounds the key_ops array and replaces the quadratic duplicate-detection routine. Consult the GitHub Security Advisory GHSA-pwgw-f7xr-863h for the exact fixed version and the Red Hat CVE-2026-92091 Advisory for downstream package updates.

Workarounds

  • Enforce a maximum JSON request body size at the reverse proxy or WAF to cap the possible key_ops length.
  • Add pre-validation that rejects JWKs whose key_ops array exceeds the small set of values defined by RFC 7517.
  • Apply per-client rate limiting and CPU-time quotas on endpoints that call JWK.import_key().
  • Require authentication on JWK-consuming endpoints where the protocol permits it.
bash
# Configuration example
# Pre-validate key_ops length before calling jwcrypto
MAX_KEY_OPS=16
python - <<'PY'
import json, sys
MAX = 16
data = json.load(sys.stdin)
ops = data.get("key_ops", [])
if isinstance(ops, list) and len(ops) > MAX:
    sys.exit("reject: key_ops too large")
PY

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.