Summary
CVE-2026-96760 is a critical signature verification bypass in Authlib, a widely used Python library for OAuth and JOSE (JWT/JWS/JWE) functionality. The JsonWebSignature.deserialize_json() function (and its generic deserialize() dispatcher) in Authlib versions 1.7.2 and earlier accepts General JSON Serialization JWS objects whose signatures array is empty, and incorrectly returns the payload as successfully verified without ever performing a cryptographic signature check or requiring a key. The flaw carries a CVSS v3.1 base score of 9.8 (Critical) and can allow unauthenticated attackers to forge arbitrary signed payloads over the network.
Technical details
- Root cause: In
authlib/jose/rfc7515/jws.py, the verification routine initializes a localis_validflag toTruebefore iterating over the JWS object’ssignaturesarray to validate each signature. If thesignaturesarray is empty, the loop body — which contains all of the actual cryptographic verification logic — never executes, sois_validremainsTrueand the function returns the payload as verified. - Trigger condition: An attacker submits a JSON Serialization JWS object containing an attacker-controlled
payloadbut with an emptysignatures: []array toJsonWebSignature.deserialize_json()(or the genericdeserialize()entry point). - Attack vector: Network-based, no authentication, no user interaction, and no cryptographic key required — the attacker only needs to craft the malformed JWS structure.
- Scope limitation: The flaw is confined to Authlib’s General JSON Serialization JWS handling in the
authlib.josemodule; the compact serialization path used byjwt.decode()is not affected. - Impact: Successful exploitation lets an attacker forge authentication/authorization claims, bypass identity checks, escalate privileges, inject trusted messages between services, or tamper with signed configuration data in any application that relies on Authlib’s JSON JWS deserialization to validate trust.
Affected software
- Authlib (Python) versions up to and including 1.7.2, specifically the
authlib.joseJWS General JSON Serialization deserialization path. - Compact-serialization JWT usage via
jwt.decode()is not affected. - Authlib 1.8.0 (released August 30, 2026) removed the
authlib.josemodule entirely; its release notes and code changes do not explicitly confirm a fix for this specific logic flaw.
Severity
- CVSS v3.1 Base Score: 9.8 (Critical)
- Vector:
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
Mitigation and recommended actions
- Immediate: No official patch exists for the
authlib.josemodule as of disclosure; the vendor could not be reached during the coordinated disclosure process. Organizations should monitor the official Authlib GitHub repository for a security fix and upgrade as soon as one is released. - Interim workaround: Applications that use
JsonWebSignature.deserialize_json()or the genericdeserialize()function to process untrusted JSON Serialization JWS input should stop trusting its output for authentication or authorization decisions until a fix is confirmed, or add explicit application-level checks that reject JWS objects with an emptysignaturesarray before passing them to Authlib. - Longer-term: Evaluate migrating to Authlib 1.8.0 or later, which removes the affected
authlib.josemodule, or switch JWS/JWT validation to the compact serialization path (jwt.decode()), which is not affected by this flaw. Confirm with upstream whether any replacement JOSE handling in 1.8+ has been independently verified to perform proper signature validation before relying on it.

