CVE-2025-62706 is a medium-severity (CVSS 6.5) Uncontrolled Resource Consumption vulnerability in authlib. A fix is available for authlib — see the affected versions and patch details below.
Authlib : JWE zip=DEF decompression bomb enables DoS
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
How urgent is this, really
CVE-2025-62706 plotted by exploitation likelihood (EPSS) against impact (CVSS). The shaded corner — EPSS 50%+ and CVSS 7.0+ — is where this CVE doesn't sit, though severity or exploitability alone can still warrant action.
Where this sits among everything scored
Of 377,636 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Real counts from FIRST.org, not a sample — log-scaled since the landscape is heavily right-skewed.
Real-World Exposure
authlibReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects PyPI packages — download data is not available via public APIs for these ecosystems.
Description
Summary
Authlib’s JWE zip=DEF path performs unbounded DEFLATE decompression. A very small ciphertext can expand into tens or hundreds of megabytes on decrypt, allowing an attacker who can supply decryptable tokens to exhaust memory and CPU and cause denial of service.
Details
- Affected component: Authlib JOSE, JWE
zip=DEF(DEFLATE) support. - In
authlib/authlib/jose/rfc7518/jwe_zips.py,DeflateZipAlgorithm.decompresscallszlib.decompress(s, -zlib.MAX_WBITS)without a maximum output limit. This permits unbounded expansion of compressed payloads. - In the JWE decode flow (
authlib/authlib/jose/rfc7516/jwe.py), when the protected header contains"zip": "DEF", the library routes the decrypted ciphertext into thedecompressmethod and assigns the fully decompressed bytes to the plaintext field before returning it. No streaming limit or quota is applied. - Because DEFLATE achieves extremely high ratios on highly repetitive input, an attacker can craft a tiny
zip=DEFciphertext that inflates to a very large plaintext during decrypt, spiking RSS and CPU. Repeated requests can starve the process or host.
Code references (from this repository version):
authlib/authlib/jose/rfc7518/jwe_zips.py–DeflateZipAlgorithm.decompressuses unboundedzlib.decompress.authlib/authlib/jose/rfc7516/jwe.py– JWE decode path applieszip_.decompress(msg)whenzip=DEFis present in the header.
Contrast: The joserfc project guards zip=DEF decompression with a fixed maximum (256 KB) and raises ExceededSizeError if output would exceed this limit, preventing the bomb. Authlib lacks such a guard in this codebase snapshot.
PoC
Environment: Python 3.10+ inside a venv; Authlib installed editable from this repository so source changes are visible. The PoC script demonstrates both a benign and a compressible-bomb payload and prints wall/CPU time, RSS, and size ratios.
- Create venv and install Authlib (editable): Set current directory to /authlib Download jwe_deflate_dos_demo.py in /authlib
python3 -m venv .venv
.venv/bin/pip install --upgrade pip
.venv/bin/pip install -e .
- Run the PoC (included in this repo):
.venv/bin/python /authlib/jwe_deflate_dos_demo.py --size 50 --max-rss-mb 2048
Sample output (abridged):
LOCAL TEST ONLY – do not send to third-party systems.
Runtime: Python 3.13.6 / Authlib 1.6.4 / zip=DEF via A256GCM
[CASE] normal plaintext=13B ciphertext=117B decompressed=13B wall_s=0.000 cpu_s=0.000 peak_rss_mb=31.0 ratio=0.1
[CASE] malicious plaintext=50MB ciphertext=~4KB decompressed=50MB wall_s=~2.3 cpu_s=~2.2 peak_rss_mb=800+ ratio=12500+
The second case shows the decompression spike: a few KB of ciphertext forces allocation and processing of ~50 MB during decrypt. Repeated requests can quickly exhaust available memory and CPU.
Reproduction notes:
- Algorithm:
alg=dir,enc=A256GCM, header includes{ "zip": "DEF" }. - The PoC uses a 32‑byte local symmetric key and a highly compressible payload (
"A" * N). - Increase
--sizeto stress memory; the--max-rss-mbflag helps avoid destabilizing the host during testing.
Impact
- Effect: Denial of service (memory/CPU exhaustion) during JWE decrypt of
zip=DEFtokens. - Who is impacted: Any service that uses Authlib to decrypt JWE tokens with
zip=DEFand where an attacker can submit tokens that will be successfully decrypted (e.g., shareddirkey, token reflection, or compromised/abused issuers). - Confidentiality/Integrity: No direct C/I impact; availability impact is high.
Severity (CVSS v3.1)
Base vector (typical shared‑secret scenario where the attacker must produce a decryptable token):
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H→ 6.5 (MEDIUM)
Rationale:
- Network‑reachable (AV:N), low complexity (AC:L), no user interaction (UI:N), scope unchanged (S:U).
- Attacker must hold or gain ability to mint a decryptable token for the target (PR:L) — common with
alg=dirand shared keys across services. - No confidentiality or integrity loss (C:N/I:N); availability is severely impacted (A:H) due to decompression expansion. If arbitrary unprivileged parties can submit JWEs that will be decrypted (PR:N), the base vector becomes:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H→ 7.5 (HIGH)
Mitigations / Workarounds
- Reject or strip
zip=DEFfor inbound JWEs at the application boundary until a fix is available. - Fork and add a bounded decompression guard (e.g.,
zlib.decompress(..., max_length)viadecompressobj().decompress(data, MAX_SIZE)), returning an error when output exceeds a safe limit. - Enforce strict maximum token sizes and fail fast on oversized inputs; combine with rate limiting.
Remediation Guidance (for maintainers)
- Mirror
joserfc’s approach: add a conservative maximum output size (e.g., 256 KB by default) and raise a specific error when exceeded; document a controlled way to raise this ceiling for trusted environments. - Consider streaming decode with chunked limits to avoid large single allocations.
References
- Authlib source:
authlib/authlib/jose/rfc7518/jwe_zips.py,authlib/authlib/jose/rfc7516/jwe.py
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐍PyPI | authlib | all versions | 1.6.5pip install --upgrade 'authlib==1.6.5' |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for authlib, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update authlib to 1.6.5 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2025-62706 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like CVE-2025-62706 can be triaged on real exposure rather than presence alone.
Tailored to CVE-2025-62706. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Fixing This On Your OS
If you run this on a Linux distribution, patch through your package manager against the distro's own security advisory below — it tracks the exact backported fix for your release, which can ship on a different timeline (and sometimes a different severity) than the upstream project.
| Product | Fixed in | Advisory |
|---|---|---|
| Red Hat Ansible Automation Platform 2.6 | ansible-automation-platform-26/lightspeed-chatbot-rhel9:1768915992 | RHSA-2026:1596 |
| Red Hat Satellite 6.18 | satellite/foreman-mcp-server-rhel9:1767868827 | RHSA-2026:0629 |
Frequently Asked Questions
Is CVE-2025-62706 in your dependencies?
O3 Security finds CVE-2025-62706 across PyPI dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.