chore(deps): update dependency authlib to v1.6.5 [security] #37
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
This PR contains the following updates:
==1.6.1->==1.6.5GitHub Vulnerability Alerts
CVE-2025-59420
Summary
Authlib’s JWS verification accepts tokens that declare unknown critical header parameters (
crit), violating RFC 7515 “must‑understand” semantics. An attacker can craft a signed token with a critical header (for example,borkorcnf) that strict verifiers reject but Authlib accepts. In mixed‑language fleets, this enables split‑brain verification and can lead to policy bypass, replay, or privilege escalation.Affected Component and Versions
authlib.jose.JsonWebSignature.deserialize_compact(...)critDetails
RFC 7515 (JWS) §4.1.11 defines
critas a “must‑understand” list: recipients MUST understand and enforce every header parameter listed incrit, otherwise they MUST reject the token. Security‑sensitive semantics such as token binding (e.g.,cnffrom RFC 7800) are often conveyed viacrit.Observed behavior with Authlib 1.6.3:
crit: ["cnf"]and acnfobject, orcrit: ["bork"]with an unknown parameter, Authlib verifies the signature and returns the payload without rejecting the token or enforcing semantics of the critical parameter.josev5 both reject such tokens by default whencritlists unknown names.Impact in heterogeneous fleets:
critcarries binding or policy information.Proof of Concept (PoC)
This repository provides a multi‑runtime PoC demonstrating the issue across Python (Authlib), Node (
josev5), and Java (Nimbus).Prerequisites
Setup
Enter the directory authlib-crit-bypass-poc & run following commands.
Tokens minted
tokens/unknown_crit.jwtwith protected header:{ "alg": "HS256", "crit": ["bork"], "bork": "x" }tokens/cnf_header.jwtwith protected header:{ "alg": "HS256", "crit": ["cnf"], "cnf": {"jkt": "thumb-42"} }Reproduction
Run the cross‑runtime demo:
Expected output for each token (strict verifiers reject; Authlib accepts):
For
tokens/unknown_crit.jwt:For
tokens/cnf_header.jwt:Environment notes:
1.6.3(from PyPI)joseversion:^59.37.x0123456789abcdef0123456789abcdefImpact
crit“must‑understand” semantics; specification non‑compliance leading to authentication/authorization policy bypass.critto carry mandatory security semantics (e.g., token binding viacnf) or operates in a heterogeneous fleet with strict verifiers elsewhere.References
critcnf)CVE-2025-61920
Summary
Authlib’s JOSE implementation accepts unbounded JWS/JWT header and signature segments. A remote attacker can craft a token whose base64url‑encoded header or signature spans hundreds of megabytes. During verification, Authlib decodes and parses the full input before it is rejected, driving CPU and memory consumption to hostile levels and enabling denial of service.
Impact
Attack vector: unauthenticated network attacker submits a malicious JWS/JWT.
Effect: base64 decode + JSON/crypto processing of huge buffers pegs CPU and allocates large amounts of RAM; a single request can exhaust service capacity.
Observed behaviour: on a test host, the legacy code verified a 500 MB header, consuming ~4 GB RSS and ~9 s CPU before failing.
Severity: High. CVSS v3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H (7.5).
Affected Versions
Authlib ≤ 1.6.3 (and earlier) when verifying JWS/JWT tokens. Later snapshots with 256 KB header/signature limits are not affected.
Proof of concept
Local demo (do not run against third-party systems):
Download jws_segment_dos_demo.py the PoC in direcotry authlib/
Run following Command
Environment: Python 3.13.6, Authlib 1.6.4, Linux x86_64, CPUs=8

Sample output: Refined
The compilation script prints separate “[ATTACKER]” (token construction) and “[SERVER]” (Authlib verification) RSS deltas so defenders can distinguish client-side preparation from server-side amplification. Regression tests authlib/tests/dos/test_jose_dos.py further capture the issue; the saved original_util.py/original_jws.py reproductions still accept the malicious payload.
Remediation
Apply the upstream patch that introduces decoded size limits:
MAX_HEADER_SEGMENT_BYTES = 256 KB
MAX_SIGNATURE_SEGMENT_BYTES = 256 KB
Enforce Limits in authlib/jose/util.extract_segment and _extract_signature.
Deploy the patched release immediately.
For additional defence in depth, reject JWS/JWT inputs above a few kilobytes at the proxy or WAF layer, and rate-limit verification endpoints.
Workarounds (temporary)
Enforce input size limits before handing tokens to Authlib.
Use application-level throttling to reduce amplification risk.
Resources
Demo script: jws_segment_dos_demo.py
Tests: authlib/tests/dos/test_jose_dos.py
OWASP JWT Cheat Sheet (DoS guidance)
CVE-2025-62706
Summary
Authlib’s JWE
zip=DEFpath 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
zip=DEF(DEFLATE) support.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.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.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
joserfcproject guardszip=DEFdecompression with a fixed maximum (256 KB) and raisesExceededSizeErrorif 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.
Set current directory to /authlib
Download jwe_deflate_dos_demo.py in /authlib
Sample output (abridged):
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:
alg=dir,enc=A256GCM, header includes{ "zip": "DEF" }."A" * N).--sizeto stress memory; the--max-rss-mbflag helps avoid destabilizing the host during testing.Impact
zip=DEFtokens.zip=DEFand where an attacker can submit tokens that will be successfully decrypted (e.g., shareddirkey, token reflection, or compromised/abused issuers).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:
alg=dirand shared keys across services.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
zip=DEFfor inbound JWEs at the application boundary until a fix is available.zlib.decompress(..., max_length)viadecompressobj().decompress(data, MAX_SIZE)), returning an error when output exceeds a safe limit.Remediation Guidance (for maintainers)
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.References
authlib/authlib/jose/rfc7518/jwe_zips.py,authlib/authlib/jose/rfc7516/jwe.pyRelease Notes
authlib/authlib (authlib)
v1.6.5Compare Source
What's Changed
requestparam to RFC7591generate_client_infoandgenerate_client_secretmethods by @azmeuk in #825New Contributors
Full Changelog: authlib/authlib@v1.6.4...v1.6.5
v1.6.4Compare Source
What's Changed
InsecureTransportErrorraising by @azmeuk in #810New Contributors
Full Changelog: authlib/authlib@v1.6.3...v1.6.4
v1.6.3: Version 1.6.3Compare Source
What's Changed
id_token_signed_response_algclient metadata by @azmeuk in #802Full Changelog: authlib/authlib@v1.6.2...v1.6.3
v1.6.2: Version 1.6.2Compare Source
What's Changed
Full Changelog: authlib/authlib@v1.6.1...v1.6.2
Configuration
📅 Schedule: Branch creation - "" in timezone UTC, Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.