Every CVE Search/ Get API key

CVE-2026-28490

Authlib Vulnerable to JWE RSA1_5 Bleichenbacher Padding Oracle

8.3 HighFix available

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
High
Privileges needed
None
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
Low
Availability
None

Exploit likelihood

0.14%Up 0.1 points since Mar 17, 2026
90%50%10%1%

What each source reports

CVE List Score used 8.3

Authlib Vulnerable to JWE RSA1_5 Bleichenbacher Padding Oracle

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
CVE-2026-28490
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-203, CWE-327
Updated
2026-11-02
EUVDEUVD-2026-12480 8.3

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
EUVD-2026-12480
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-7432-952r-cw78 8.3

Authlib Vulnerable to JWE RSA1_5 Bleichenbacher Padding Oracle

1. Executive Summary

A cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly.

When cryptography encounters an invalid PKCS#1 v1.5 padding, it returns a randomized byte string instead of raising an exception — the correct behavior per RFC 3218 §2.3.2. Authlib ignores this contract and raises ValueError('Invalid "cek" length') immediately after decryption, before reaching AES-GCM tag validation. This creates a clean, reliable Exception Oracle:

  • Invalid padding → cryptography returns random bytes → Authlib length check fails → ValueError: Invalid "cek" length
  • Valid padding, wrong MAC → decryption succeeds → length check passes → AES-GCM fails → InvalidTag

This oracle is active by default in every Authlib installation without any special configuration by the developer or the attacker. The three most widely used Python web frameworks — Flask, Django, and FastAPI — all expose distinguishable HTTP responses for these two exception classes in their default configurations, requiring no additional setup to exploit.

Empirically confirmed on authlib 1.6.8 + cryptography 46.0.5:

[PADDING INVALIDO]     ValueError: Invalid "cek" length
[PADDING VALIDO/MAC]   InvalidTag

2. Technical Details & Root Cause

2.1 Vulnerable Code

File: authlib/jose/rfc7518/jwe_algs.py

def unwrap(self, enc_alg, ek, headers, key):
    op_key = key.get_op_key("unwrapKey")

    # cryptography implements Bleichenbacher mitigation here:
    # on invalid padding it returns random bytes instead of raising.
    # Empirically confirmed: returns 84 bytes for a 2048-bit key.
    cek = op_key.decrypt(ek, self.padding)

    # VULNERABILITY: This length check destroys the mitigation.
    # cryptography returned 84 random bytes. len(84) * 8 = 672 != 128 (A128GCM CEK_SIZE).
    # Authlib raises a distinct ValueError before AES-GCM is ever reached.
    if len(cek) * 8 != enc_alg.CEK_SIZE:
        raise ValueError('Invalid "cek" length')   # <- ORACLE TRIGGER

    return cek

2.2 Root Cause — Active Mitigation Destruction

cryptography 46.0.5 implements the Bleichenbacher mitigation correctly at the library level. When PKCS#1 v1.5 padding validation fails, it does not raise an exception. Instead it returns a randomized byte string (empirically observed: 84 bytes for a 2048-bit RSA key). The caller is expected to pass this fake key to the symmetric decryptor, where MAC/tag validation will fail in constant time — producing an error indistinguishable from a MAC failure on a valid padding.

Authlib does not honor this contract. The length check on the following line detects that 84 bytes != 16 bytes (128-bit CEK for A128GCM) and raises ValueError('Invalid "cek" length') immediately. This exception propagates before AES-GCM is ever reached, creating two execution paths with observable differences:

Path A — invalid PKCS#1 v1.5 padding:
  op_key.decrypt() -> 84 random bytes  (cryptography mitigation active)
  len(84) * 8 = 672 != 128            (CEK_SIZE for A128GCM)
  raise ValueError('Invalid "cek" length')    <- specific exception, fast path

Path B — valid padding, wrong symmetric key:
  op_key.decrypt() -> 16 correct bytes
  len(16) * 8 = 128 == 128            -> length check passes
  AES-GCM tag validation -> mismatch
  raise InvalidTag                            <- different exception class, slow path

The single line raise ValueError('Invalid "cek" length') is the complete root cause. Removing the raise and replacing it with a silent random CEK fallback eliminates both the exception oracle and any…

Record
GHSA-7432-952r-cw78
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-203, CWE-327
Updated
2026-11-02
NVD 8.3

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
CVE-2026-28490
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N
Weakness
CWE-203, CWE-327
Updated
2026-11-02
OSV 8.3

Authlib Vulnerable to JWE RSA1_5 Bleichenbacher Padding Oracle

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
CVE-2026-28490
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-203, CWE-327
Updated
2026-11-02
OSVDEBIAN-CVE-2026-28490 6.5

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
DEBIAN-CVE-2026-28490
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N
Updated
2026-11-02
Show 7 moreShow less
OSVGHSA-7432-952r-cw78 8.3

Authlib Vulnerable to JWE RSA1_5 Bleichenbacher Padding Oracle

1. Executive Summary

A cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly.

When cryptography encounters an invalid PKCS#1 v1.5 padding, it returns a randomized byte string instead of raising an exception — the correct behavior per RFC 3218 §2.3.2. Authlib ignores this contract and raises ValueError('Invalid "cek" length') immediately after decryption, before reaching AES-GCM tag validation. This creates a clean, reliable Exception Oracle:

  • Invalid padding → cryptography returns random bytes → Authlib length check fails → ValueError: Invalid "cek" length
  • Valid padding, wrong MAC → decryption succeeds → length check passes → AES-GCM fails → InvalidTag

This oracle is active by default in every Authlib installation without any special configuration by the developer or the attacker. The three most widely used Python web frameworks — Flask, Django, and FastAPI — all expose distinguishable HTTP responses for these two exception classes in their default configurations, requiring no additional setup to exploit.

Empirically confirmed on authlib 1.6.8 + cryptography 46.0.5:

[PADDING INVALIDO]     ValueError: Invalid "cek" length
[PADDING VALIDO/MAC]   InvalidTag

2. Technical Details & Root Cause

2.1 Vulnerable Code

File: authlib/jose/rfc7518/jwe_algs.py

def unwrap(self, enc_alg, ek, headers, key):
    op_key = key.get_op_key("unwrapKey")

    # cryptography implements Bleichenbacher mitigation here:
    # on invalid padding it returns random bytes instead of raising.
    # Empirically confirmed: returns 84 bytes for a 2048-bit key.
    cek = op_key.decrypt(ek, self.padding)

    # VULNERABILITY: This length check destroys the mitigation.
    # cryptography returned 84 random bytes. len(84) * 8 = 672 != 128 (A128GCM CEK_SIZE).
    # Authlib raises a distinct ValueError before AES-GCM is ever reached.
    if len(cek) * 8 != enc_alg.CEK_SIZE:
        raise ValueError('Invalid "cek" length')   # <- ORACLE TRIGGER

    return cek

2.2 Root Cause — Active Mitigation Destruction

cryptography 46.0.5 implements the Bleichenbacher mitigation correctly at the library level. When PKCS#1 v1.5 padding validation fails, it does not raise an exception. Instead it returns a randomized byte string (empirically observed: 84 bytes for a 2048-bit RSA key). The caller is expected to pass this fake key to the symmetric decryptor, where MAC/tag validation will fail in constant time — producing an error indistinguishable from a MAC failure on a valid padding.

Authlib does not honor this contract. The length check on the following line detects that 84 bytes != 16 bytes (128-bit CEK for A128GCM) and raises ValueError('Invalid "cek" length') immediately. This exception propagates before AES-GCM is ever reached, creating two execution paths with observable differences:

Path A — invalid PKCS#1 v1.5 padding:
  op_key.decrypt() -> 84 random bytes  (cryptography mitigation active)
  len(84) * 8 = 672 != 128            (CEK_SIZE for A128GCM)
  raise ValueError('Invalid "cek" length')    <- specific exception, fast path

Path B — valid padding, wrong symmetric key:
  op_key.decrypt() -> 16 correct bytes
  len(16) * 8 = 128 == 128            -> length check passes
  AES-GCM tag validation -> mismatch
  raise InvalidTag                            <- different exception class, slow path

The single line raise ValueError('Invalid "cek" length') is the complete root cause. Removing the raise and replacing it with a silent random CEK fallback eliminates both the exception oracle and any…

Record
GHSA-7432-952r-cw78
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-203, CWE-327
Updated
2026-11-02
OSVPYSEC-2026-2116 6.5

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
PYSEC-2026-2116
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N
Updated
2026-11-02
OSVROOT-APP-PYPI-CVE-2026-28490 6.5

CVE-2026-28490 in Authlib - Patched by Root

Root has patched CVE-2026-28490 in the Authlib package for Root:PyPI. Multiple fixed versions available.

Record
ROOT-APP-PYPI-CVE-2026-28490
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N
Updated
2026-11-02
OSVUBUNTU-CVE-2026-28490 8.3

Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to version 1.6.9, a cryptographic padding oracle vulnerability was identified in the Authlib Python library concerning the implementation of the JSON Web Encryption (JWE) RSA1_5 key management algorithm. Authlib registers RSA1_5 in its default algorithm registry without requiring explicit opt-in, and actively destroys the constant-time Bleichenbacher mitigation that the underlying cryptography library implements correctly. This issue has been patched in version 1.6.9.

Record
UBUNTU-CVE-2026-28490
CVSS 4.0
8.3 HighCVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N
CVSS 3.1
6.5 MediumCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:L/A:N
Updated
2026-11-02
OSVopenSUSE-SU-2026:20392-1 No score

Security update for python-Authlib

This update for python-Authlib fixes the following issues:

Changes in python-Authlib:

  • CVE-2026-27962: JWS deserialize_compact() allows for signature bypass by accepting user-controlled embedded JWK as verification key (bsc#1259738)
  • CVE-2026-28490: cryptographic padding oracle in JWE RSA1_5 key management algorithm (bsc#1259736)
  • CVE-2026-28498: fail-open in behavior OIDC hash validation allows for bypass mandatory integrity protections (bsc#1259737)
Record
openSUSE-SU-2026:20392-1
Updated
2026-11-02
OSVSUSE-SU-2026:0975-1 No score

Security update for python-Authlib

This update for python-Authlib fixes the following issues:

  • CVE-2026-27962: JWS deserialize_compact() allows for signature bypass by accepting user-controlled embedded JWK as verification key (bsc#1259738).
  • CVE-2026-28490: cryptographic padding oracle in JWE RSA1_5 key management algorithm (bsc#1259736).
  • CVE-2026-28498: fail-open in behavior OIDC hash validation allows for bypass mandatory integrity protections (bsc#1259737).
Record
SUSE-SU-2026:0975-1
Updated
2026-11-02
OSVUSN-8557-1 No score

python-authlib vulnerabilities

Jay Neiva and Mauro Carrillo discovered that Authlib did not properly validate cryptographic keys embedded in JWT headers. An attacker could possibly use this issue to forge trusted tokens, resulting in authentication and authorization bypass. (CVE-2026-27962)

Jay Neiva and Mauro Carrillo discovered that Authlib incorrectly handled RSA1_5 encrypted tokens. An attacker could possibly use this issue to recover sensitive encrypted information, resulting in information disclosure. (CVE-2026-28490)

Jay Neiva and Mauro Carrillo discovered that Authlib did not properly reject unsupported cryptographic algorithms when validating OpenID Connect ID tokens. An attacker could possibly use this issue to bypass token integrity checks, resulting in authentication bypass. (CVE-2026-28498)

Johnny Deuss discovered that Authlib did not provide cross-site request forgery protection for the OAuth cache feature in its Starlette integration. An attacker could possibly use this issue to perform unauthorized OAuth actions, resulting in cross-site request forgery. This issue only affected Ubuntu 24.04 LTS and Ubuntu 26.04 LTS. (CVE-2026-41425)

Record
USN-8557-1
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
authlib
PyPI
through 1.6.8
1.6.9
python-authlib
Debian:12
before 1.2.0-1+deb12u2, plus listed versions
1.2.0-11.2.0-1+deb12u1
1.2.0-1+deb12u2
python-authlib
Debian:13
All versions, plus listed versions
1.6.0-11.6.0-1+deb13u11.6.1-11.6.3-11.6.4-1
Show 8 moreShow less
1.6.5-11.6.6-11.6.7-11.6.8-11.6.9-11.7.0-11.7.2-11.7.2-2
None known
python-authlib
Debian:14
before 1.6.9-1, plus listed versions
1.6.0-11.6.1-11.6.3-11.6.4-11.6.5-11.6.6-11.6.7-11.6.8-1
1.6.9-1
authlib
PyPI
before 1.6.9, plus listed versions
0.10.100.110.120.12.1
Show 45 moreShow less
0.130.140.14.10.14.20.14.30.150.15.10.15.20.15.30.15.40.15.50.15.60.1rc00.20.2.10.30.40.4.10.50.5.10.60.70.80.91.0.01.0.0a11.0.0a21.0.0b11.0.0b21.0.0rc11.0.11.1.01.2.01.2.11.3.01.3.11.3.21.4.01.4.11.5.01.5.11.5.21.6.01.6.11.6.2
1.6.9
Authlib
Root:PyPI
before 0.15.5+aikido.9
0.15.5+aikido.91.6.6+aikido.51.6.6+aikido.61.6.6+aikido.71.6.6+aikido.8
rootio-Authlib
Root:PyPI
before 0.15.5+root.io.6
0.15.5+root.io.60.15.5+root.io.70.15.5+root.io.81.6.6+root.io.31.6.6+root.io.40.15.5+root.io.91.6.6+root.io.51.6.6+root.io.61.6.6+root.io.7
python-Authlib
SUSE:Linux Enterprise Module for Python 3 15 SP7
From an advisory covering 3 CVEs
before 1.3.1-150600.3.17.1
1.3.1-150600.3.17.1
python-Authlib
SUSE:Linux Enterprise Server 15 SP6-LTSS
From an advisory covering 3 CVEs
before 1.3.1-150600.3.17.1
1.3.1-150600.3.17.1
python-Authlib
SUSE:Linux Enterprise Server for SAP Applications 15 SP6
From an advisory covering 3 CVEs
before 1.3.1-150600.3.17.1
1.3.1-150600.3.17.1
Show 10 moreShow less
Affected packages
PackageAffectedFixed
python-Authlib
openSUSE:Leap 15.6
From an advisory covering 3 CVEs
before 1.3.1-150600.3.17.1
1.3.1-150600.3.17.1
python-authlib
Ubuntu:Pro:22.04:LTS
before 0.15.5-1ubuntu0.1~esm2, plus listed versions
0.15.4-10.15.5-10.15.5-1ubuntu0.1~esm1
0.15.5-1ubuntu0.1~esm2
python-authlib
Ubuntu:Pro:24.04:LTS
before 1.3.0-1ubuntu0.1~esm2, plus listed versions
1.2.1-11.3.0-11.3.0-1ubuntu0.1~esm1
1.3.0-1ubuntu0.1~esm2
python-authlib
Ubuntu:25.10
All versions, plus listed versions
1.5.1-11.5.2-11.6.0-1
None known
python-authlib
Ubuntu:26.10
All versions, plus listed versions
1.6.7-11.7.2-11.7.2-2
None known
python-authlib
Ubuntu:Pro:26.04:LTS
before 1.6.7-1ubuntu0.1~esm1, plus listed versions
1.6.0-11.6.5-11.6.6-11.6.7-1
1.6.7-1ubuntu0.1~esm1
python-authlib
Ubuntu:Pro:22.04:LTS
From an advisory covering 4 CVEs
before 0.15.5-1ubuntu0.1~esm2, plus listed versions
0.15.4-10.15.5-10.15.5-1ubuntu0.1~esm1
0.15.5-1ubuntu0.1~esm2
python-authlib
Ubuntu:Pro:24.04:LTS
From an advisory covering 4 CVEs
before 1.3.0-1ubuntu0.1~esm2, plus listed versions
1.2.1-11.3.0-11.3.0-1ubuntu0.1~esm1
1.3.0-1ubuntu0.1~esm2
python-authlib
Ubuntu:Pro:26.04:LTS
From an advisory covering 4 CVEs
before 1.6.7-1ubuntu0.1~esm1, plus listed versions
1.6.0-11.6.5-11.6.6-11.6.7-1
1.6.7-1ubuntu0.1~esm1
python-Authlib
openSUSE:Leap 16.0
From an advisory covering 3 CVEs
before 1.5.2-bp160.3.1
1.5.2-bp160.3.1

History

History
RecordedChangedSources
affected, facts
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-28490 is a high vulnerability (CVSS 8.3) in Authlib, published March 16, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.14%, the 3rd percentile. Fixed in authlib 1.6.9.

References

Show 15 moreShow less
This page doesn't list everything

Left out here: 6 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open