Every CVE Search/ Get API key

CVE-2026-102266

PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

7.4 HighFix available

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

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
High
Availability
None

Exploit likelihood

0.22%Unchanged since Sep 29, 2026
90%50%10%1%

What each source reports

CVE List Score used 7.4

PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
CVE-2026-102266
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-347
Updated
2026-11-02
EUVDEUVD-2026-88484 7.4

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
EUVD-2026-88484
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-9j54-fg26-wv3r 7.4

PyJWT: PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

Summary

A service that verifies HS256 tokens using an empty oct JWK through PyJWK, including a PyJWK obtained from PyJWKSet, can therefore accept attacker-generated tokens as authenticated.

PyJWT 2.13.0 rejects an empty HMAC key when it is supplied through the raw str/bytes key path, but accepts the same zero-length key when it is supplied as a symmetric PyJWK.

An oct JWK containing an empty Base64URL key value:

{"kty":"oct","k":""}

is decoded to b"". During signature verification, the PyJWK path uses this decoded value directly and does not invoke the empty-key validation in HMACAlgorithm.prepare_key. With the default enforce_minimum_key_length=False, PyJWT emits a warning and proceeds with HMAC verification using the zero-length key.

An attacker can independently calculate HMAC-SHA256(b"", signing_input) and create valid HS256 JWTs with arbitrary claims. A service that verifies HS256 tokens using an empty oct JWK through PyJWK or PyJWKSet can therefore accept attacker-generated tokens as authenticated.

The application must already contain an empty HMAC JWK, for example because a missing Base64URL configuration or secret-manager value was serialized as "k": "". The attacker does not need control of the JWK/JWKS source, a signing oracle, a private key, or a mixed algorithm allow-list.

Details

The vulnerability is caused by inconsistent validation of the same HMAC key material depending on whether it enters PyJWT as a raw key or through PyJWK.

Raw empty HMAC keys are rejected

[HMACAlgorithm.prepare_key](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L325-L357) rejects an empty HMAC key.

As a result, an empty raw key is rejected in PyJWT 2.13.0:

jwt.decode(token, b"", algorithms=["HS256"])

with InvalidKeyError.

Empty oct JWKs decode to the same key but are accepted

[HMACAlgorithm.from_jwk](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L379-L394) handles symmetric JWKs.

For:

{
    "kty": "oct",
    "k": ""
}

the empty Base64URL value is decoded to:

b""

and returned without an emptiness check.

[PyJWK.__init__](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jwk.py#L73-L82) then stores the decoded value in self.key.

The resulting PyJWK therefore contains the same zero-length byte string rejected by the raw-key path.

PyJWK verification bypasses the raw-key validation

[PyJWS._verify_signature](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jws.py#L389-L416) has a separate path for PyJWK objects.

When a PyJWK is supplied, verification uses its already-decoded key directly:

prepared_key = key.key

The value is not passed through:

alg_obj.prepare_key(key.key)

so the empty-key check in HMACAlgorithm.prepare_key is never reached.

The minimum HMAC key-length check does not reject the key under the default configuration. With enforce_minimum_key_length=False, PyJWT emits a warning and continues signature verification.

The verifier therefore receives:

b""

as the HS256 key.

This creates the following difference for identical cryptographic key material:

raw b""
    -> HMACAlgorithm.prepare_key
    -> InvalidKeyError

{"kty":"oct","k":""}
    -> HMACAlgorithm.from_jwk
    -> b""
    -> PyJWK.key
    -> PyJWS._verify_signature…
Record
GHSA-9j54-fg26-wv3r
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-347
Updated
2026-11-02
NVD 7.4

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
CVE-2026-102266
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-347
Updated
2026-11-02
OSVBELL-CVE-2026-102266 9.1
Record
BELL-CVE-2026-102266
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-07
OSV 7.4

PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
CVE-2026-102266
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-347
Updated
2026-11-04
Show 13 moreShow less
OSVDEBIAN-CVE-2026-102266 9.1

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
DEBIAN-CVE-2026-102266
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
OSVGHSA-9j54-fg26-wv3r 7.4

PyJWT: PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

Summary

A service that verifies HS256 tokens using an empty oct JWK through PyJWK, including a PyJWK obtained from PyJWKSet, can therefore accept attacker-generated tokens as authenticated.

PyJWT 2.13.0 rejects an empty HMAC key when it is supplied through the raw str/bytes key path, but accepts the same zero-length key when it is supplied as a symmetric PyJWK.

An oct JWK containing an empty Base64URL key value:

{"kty":"oct","k":""}

is decoded to b"". During signature verification, the PyJWK path uses this decoded value directly and does not invoke the empty-key validation in HMACAlgorithm.prepare_key. With the default enforce_minimum_key_length=False, PyJWT emits a warning and proceeds with HMAC verification using the zero-length key.

An attacker can independently calculate HMAC-SHA256(b"", signing_input) and create valid HS256 JWTs with arbitrary claims. A service that verifies HS256 tokens using an empty oct JWK through PyJWK or PyJWKSet can therefore accept attacker-generated tokens as authenticated.

The application must already contain an empty HMAC JWK, for example because a missing Base64URL configuration or secret-manager value was serialized as "k": "". The attacker does not need control of the JWK/JWKS source, a signing oracle, a private key, or a mixed algorithm allow-list.

Details

The vulnerability is caused by inconsistent validation of the same HMAC key material depending on whether it enters PyJWT as a raw key or through PyJWK.

Raw empty HMAC keys are rejected

[HMACAlgorithm.prepare_key](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L325-L357) rejects an empty HMAC key.

As a result, an empty raw key is rejected in PyJWT 2.13.0:

jwt.decode(token, b"", algorithms=["HS256"])

with InvalidKeyError.

Empty oct JWKs decode to the same key but are accepted

[HMACAlgorithm.from_jwk](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L379-L394) handles symmetric JWKs.

For:

{
    "kty": "oct",
    "k": ""
}

the empty Base64URL value is decoded to:

b""

and returned without an emptiness check.

[PyJWK.__init__](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jwk.py#L73-L82) then stores the decoded value in self.key.

The resulting PyJWK therefore contains the same zero-length byte string rejected by the raw-key path.

PyJWK verification bypasses the raw-key validation

[PyJWS._verify_signature](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jws.py#L389-L416) has a separate path for PyJWK objects.

When a PyJWK is supplied, verification uses its already-decoded key directly:

prepared_key = key.key

The value is not passed through:

alg_obj.prepare_key(key.key)

so the empty-key check in HMACAlgorithm.prepare_key is never reached.

The minimum HMAC key-length check does not reject the key under the default configuration. With enforce_minimum_key_length=False, PyJWT emits a warning and continues signature verification.

The verifier therefore receives:

b""

as the HS256 key.

This creates the following difference for identical cryptographic key material:

raw b""
    -> HMACAlgorithm.prepare_key
    -> InvalidKeyError

{"kty":"oct","k":""}
    -> HMACAlgorithm.from_jwk
    -> b""
    -> PyJWK.key
    -> PyJWS._verify_signature…
Record
GHSA-9j54-fg26-wv3r
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Weakness
CWE-347
Updated
2026-11-02
OSVPYSEC-2026-4143 7.4

PyJWT: PyJWK accepts empty HMAC keys, bypassing PyJWT's empty-key validation

Summary

A service that verifies HS256 tokens using an empty oct JWK through PyJWK, including a PyJWK obtained from PyJWKSet, can therefore accept attacker-generated tokens as authenticated.

PyJWT 2.13.0 rejects an empty HMAC key when it is supplied through the raw str/bytes key path, but accepts the same zero-length key when it is supplied as a symmetric PyJWK.

An oct JWK containing an empty Base64URL key value:

{"kty":"oct","k":""}

is decoded to b"". During signature verification, the PyJWK path uses this decoded value directly and does not invoke the empty-key validation in HMACAlgorithm.prepare_key. With the default enforce_minimum_key_length=False, PyJWT emits a warning and proceeds with HMAC verification using the zero-length key.

An attacker can independently calculate HMAC-SHA256(b"", signing_input) and create valid HS256 JWTs with arbitrary claims. A service that verifies HS256 tokens using an empty oct JWK through PyJWK or PyJWKSet can therefore accept attacker-generated tokens as authenticated.

The application must already contain an empty HMAC JWK, for example because a missing Base64URL configuration or secret-manager value was serialized as "k": "". The attacker does not need control of the JWK/JWKS source, a signing oracle, a private key, or a mixed algorithm allow-list.

Details

The vulnerability is caused by inconsistent validation of the same HMAC key material depending on whether it enters PyJWT as a raw key or through PyJWK.

Raw empty HMAC keys are rejected

[HMACAlgorithm.prepare_key](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L325-L357) rejects an empty HMAC key.

As a result, an empty raw key is rejected in PyJWT 2.13.0:

jwt.decode(token, b"", algorithms=["HS256"])

with InvalidKeyError.

Empty oct JWKs decode to the same key but are accepted

[HMACAlgorithm.from_jwk](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/algorithms.py#L379-L394) handles symmetric JWKs.

For:

{
    "kty": "oct",
    "k": ""
}

the empty Base64URL value is decoded to:

b""

and returned without an emptiness check.

[PyJWK.__init__](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jwk.py#L73-L82) then stores the decoded value in self.key.

The resulting PyJWK therefore contains the same zero-length byte string rejected by the raw-key path.

PyJWK verification bypasses the raw-key validation

[PyJWS._verify_signature](https://github.com/jpadilla/pyjwt/blob/7144e4534c34810f4525dc4578a32addd8212cff/jwt/api_jws.py#L389-L416) has a separate path for PyJWK objects.

When a PyJWK is supplied, verification uses its already-decoded key directly:

prepared_key = key.key

The value is not passed through:

alg_obj.prepare_key(key.key)

so the empty-key check in HMACAlgorithm.prepare_key is never reached.

The minimum HMAC key-length check does not reject the key under the default configuration. With enforce_minimum_key_length=False, PyJWT emits a warning and continues signature verification.

The verifier therefore receives:

b""

as the HS256 key.

This creates the following difference for identical cryptographic key material:

raw b""
    -> HMACAlgorithm.prepare_key
    -> InvalidKeyError

{"kty":"oct","k":""}
    -> HMACAlgorithm.from_jwk
    -> b""
    -> PyJWK.key
    -> PyJWS._verify_signature…
Record
PYSEC-2026-4143
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
OSVRLSA-2026:94500 9.1

Critical: fence-agents security update

The fence-agents packages provide a collection of scripts for handling remote power management for cluster devices. They allow failed or unreachable nodes to be forcibly restarted and removed from the cluster.

Security Fix(es):

  • pyjwt: pyjwt: Authentication bypass via empty HMAC key acceptance (CVE-2026-102266)

  • pyjwt: PyJWT: Authentication bypass via improper public key validation (CVE-2026-102268)

  • pyjwt: PyJWT: Authentication bypass via acceptance of DER public keys as HMAC secrets (CVE-2026-102271)

  • pyjwt: pyjwt: Verification key substitution via unvalidated JWKS redirects (CVE-2026-102267)

  • pyjwt: pyjwt: Token forgery via improper Unicode byte-order mark handling (CVE-2026-102272)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
RLSA-2026:94500
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-04
OSVRLSA-2026:94501 9.1

Critical: fence-agents security update

The fence-agents packages provide a collection of scripts for handling remote power management for cluster devices. They allow failed or unreachable nodes to be forcibly restarted and removed from the cluster.

Security Fix(es):

  • pyjwt: pyjwt: Authentication bypass via empty HMAC key acceptance (CVE-2026-102266)

  • pyjwt: PyJWT: Authentication bypass via improper public key validation (CVE-2026-102268)

  • pyjwt: PyJWT: Authentication bypass via acceptance of DER public keys as HMAC secrets (CVE-2026-102271)

  • pyjwt: pyjwt: Verification key substitution via unvalidated JWKS redirects (CVE-2026-102267)

  • pyjwt: pyjwt: Token forgery via improper Unicode byte-order mark handling (CVE-2026-102272)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
RLSA-2026:94501
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-04
OSVUBUNTU-CVE-2026-102266 7.4

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
UBUNTU-CVE-2026-102266
CVSS 3.1
7.4 HighCVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
CVSS 3.1
9.1 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Updated
2026-11-02
OSVALSA-2026:94500 No score

Critical: fence-agents security update

The fence-agents packages provide a collection of scripts for handling remote power management for cluster devices. They allow failed or unreachable nodes to be forcibly restarted and removed from the cluster.

Security Fix(es):

  • pyjwt: pyjwt: Authentication bypass via empty HMAC key acceptance (CVE-2026-102266)
  • pyjwt: PyJWT: Authentication bypass via improper public key validation (CVE-2026-102268)
  • pyjwt: PyJWT: Authentication bypass via acceptance of DER public keys as HMAC secrets (CVE-2026-102271)
  • pyjwt: pyjwt: Verification key substitution via unvalidated JWKS redirects (CVE-2026-102267)
  • pyjwt: pyjwt: Token forgery via improper Unicode byte-order mark handling (CVE-2026-102272)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:94500
Updated
2026-11-04
OSVALSA-2026:94501 No score

Critical: fence-agents security update

The fence-agents packages provide a collection of scripts for handling remote power management for cluster devices. They allow failed or unreachable nodes to be forcibly restarted and removed from the cluster.

Security Fix(es):

  • pyjwt: pyjwt: Authentication bypass via empty HMAC key acceptance (CVE-2026-102266)
  • pyjwt: PyJWT: Authentication bypass via improper public key validation (CVE-2026-102268)
  • pyjwt: PyJWT: Authentication bypass via acceptance of DER public keys as HMAC secrets (CVE-2026-102271)
  • pyjwt: pyjwt: Verification key substitution via unvalidated JWKS redirects (CVE-2026-102267)
  • pyjwt: pyjwt: Token forgery via improper Unicode byte-order mark handling (CVE-2026-102272)

For more details about the security issue(s), including the impact, a CVSS score, acknowledgments, and other related information, refer to the CVE page(s) listed in the References section.

Record
ALSA-2026:94501
Updated
2026-11-04
OSVAZL-105239 No score

CVE-2026-102266 affecting package python-jwt for versions less than 2.15.1-1

PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, HMACAlgorithm.from_jwk is affected because PyJWK verification path used the decoded key without applying prepare_key validation. This occurs when a trusted JWK Set contains an oct entry with an empty k value. As a result, an attacker signs an HMAC token with the same zero-length key accepted by PyJWT. Consequently, forged token can carry arbitrary authenticated claims. This issue is fixed in version 2.14.0.

Record
AZL-105239
Updated
2026-11-02
OSVopenSUSE-SU-2026:11994-1 No score

python313-PyJWT-2.15.1-1.1 on GA media

These are all security issues fixed in the python313-PyJWT-2.15.1-1.1 package on the GA media of openSUSE Tumbleweed.

Record
openSUSE-SU-2026:11994-1
Updated
2026-11-02
OSVROOT-APP-PYPI-CVE-2026-102266 No score

CVE-2026-102266 in pyjwt - Patched by Root

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

Record
ROOT-APP-PYPI-CVE-2026-102266
Updated
2026-11-02
OSVUSN-8916-1 No score

pyjwt vulnerabilities

YuSung Han discovered that PyJWT did not properly validate certain JWK keys when performing HMAC verification. An attacker could possibly use this issue to forge authentication tokens. This issue only affected Ubuntu 26.04 LTS. (CVE-2026-102266)

Rohan Das discovered that PyJWT incorrectly handled redirects when fetching key sets. A remote attacker could possibly use this issue to cause PyJWT to disclose sensitive information. This issue only affected Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS. (CVE-2026-102267)

It was discovered that PyJWT incorrectly recognized certain PEM representations. An attacker who knew the public key could possibly use this issue to forge authentication tokens. This issue only affected Ubuntu 18.04 LTS, Ubuntu 20.04 LTS, Ubuntu 22.04 LTS, Ubuntu 24.04 LTS, Ubuntu 26.04 LTS. (CVE-2026-102268)

Nuno Lopes discovered that PyJWT incorrectly handled DER public keys when performing HMAC verification. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102271)

It was discovered that PyJWT did not properly handle certain JWK keys prefixed with a byte-order mark. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102272)

Charles Vosburgh discovered that PyJWT incorrectly handled certain JWK containers when performing HMAC verification. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102273)

Record
USN-8916-1
Updated
2026-11-02
OSVUSN-8916-2 No score

pyjwt vulnerabilities

USN-8916-1 fixed vulnerabilities in PyJWT. This update provides the corresponding fix for PyJWT on Ubuntu 26.10.

Original advisory details:

YuSung Han discovered that PyJWT did not properly validate certain JWK keys when performing HMAC verification. An attacker could possibly use this issue to forge authentication tokens. (CVE-2026-102266)

Rohan Das discovered that PyJWT incorrectly handled redirects when fetching key sets. A remote attacker could possibly use this issue to cause PyJWT to disclose sensitive information. (CVE-2026-102267)

It was discovered that PyJWT incorrectly recognized certain PEM representations. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102268)

Nuno Lopes discovered that PyJWT incorrectly handled DER public keys when performing HMAC verification. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102271)

It was discovered that PyJWT did not properly handle certain JWK keys prefixed with a byte-order mark. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102272)

Charles Vosburgh discovered that PyJWT incorrectly handled certain JWK containers when performing HMAC verification. An attacker who knew the public key could possibly use this issue to forge authentication tokens. (CVE-2026-102273)

Record
USN-8916-2
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
pyjwt
PyPI
2.13.0 up to 2.14.0
2.14.0
fence-agents-aliyun
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-all
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-amt-ws
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-apc
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-apc-snmp
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-aws
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-azure-arm
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-bladecenter
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-cisco-ucs
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
Show 102 moreShow less
Affected packages
PackageAffectedFixed
fence-agents-common
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-compute
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-drac5
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-gce
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-hpblade
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ibm-powervs
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ibm-vpc
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ibmblade
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ifmib
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ilo-moonshot
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-ilo-mp
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-kdump
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-kubevirt
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-lpar
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-mpath
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-nutanix-ahv
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-openstack
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-redfish
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-rhevm
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-rsa
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-scsi
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-virsh
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-vmware-rest
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-virt
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-virtd-libvirt
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-virtd-multicast
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-virtd-serial
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
ha-cloud-support
AlmaLinux:9
From an advisory covering 5 CVEs
before 4.10.0-110.el9_8.8
4.10.0-110.el9_8.8
fence-agents-aliyun
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-all
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-amt-ws
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-apc
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-apc-snmp
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-aws
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-azure-arm
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-bladecenter
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-brocade
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-cisco-mds
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-cisco-ucs
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-common
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-drac5
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-eaton-snmp
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-emerson
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-eps
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-gce
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-heuristics-ping
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-hpblade
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ibm-powervs
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ibm-vpc
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ibmblade
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ifmib
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ilo-moonshot
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ilo-mp
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ilo-ssh
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ilo2
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-intelmodular
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ipdu
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-ipmilan
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-kdump
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-kubevirt
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-lpar
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-mpath
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-nutanix-ahv
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-openstack
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-redfish
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-rhevm
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-rsa
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-rsb
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-sbd
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-scsi
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-virsh
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-vmware-rest
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-vmware-soap
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-wti
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-agents-zvm
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virt
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd-cpg
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd-libvirt
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd-multicast
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd-serial
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
fence-virtd-tcp
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
ha-cloud-support
AlmaLinux:10
From an advisory covering 5 CVEs
before 4.16.0-21.el10_2.7
4.16.0-21.el10_2.7
python-jwt
Azure Linux:3
before 2.15.1-1
2.15.1-1
py3-jwt
Alpaquita:25
2.10.1-r0 up to 2.15.1-r0
2.15.1-r0
py3-jwt
Alpaquita:stream
2.8.0-r1 up to 2.15.1-r0
2.15.1-r0
pyjwt
Debian:13
All versions, plus listed versions
2.10.1-22.10.1-2+deb13u12.10.1-32.10.1-42.11.0-2
Show 5 moreShow less
2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-1
None known
pyjwt
Debian:14
before 2.14.0-1, plus listed versions
2.10.1-22.10.1-32.10.1-42.11.0-22.12.1-12.13.0-1
2.14.0-1
fence-agents
Rocky Linux:9
From an advisory covering 5 CVEs
before 0:4.10.0-110.el9_8.8
0:4.10.0-110.el9_8.8
fence-agents
Rocky Linux:10
From an advisory covering 5 CVEs
before 0:4.16.0-21.el10_2.7
0:4.16.0-21.el10_2.7
pyjwt
Root:PyPI
before 2.13.0+aikido.1
2.13.0+aikido.1
PyJWT
Root:PyPI
before 2.13.0+aikido.1
2.13.0+aikido.1
pyjwt
Ubuntu:26.10
before 2.13.0-1ubuntu1, plus listed versions
2.10.1-4ubuntu12.12.1-12.13.0-1
2.13.0-1ubuntu1
pyjwt
Ubuntu:26.04:LTS
before 2.10.1-4ubuntu1.2, plus listed versions
2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu12.10.1-4ubuntu1.1
2.10.1-4ubuntu1.2
pyjwt
Ubuntu:Pro:16.04:LTS
From an advisory covering 6 CVEs
before 1.3.0-1ubuntu0.1+esm3, plus listed versions
1.0.0-0ubuntu11.3.0-11.3.0-1ubuntu0.11.3.0-1ubuntu0.1+esm11.3.0-1ubuntu0.1+esm2
1.3.0-1ubuntu0.1+esm3
pyjwt
Ubuntu:Pro:18.04:LTS
From an advisory covering 6 CVEs
before 1.5.3+ds1-1ubuntu0.1+esm3, plus listed versions
1.4.2-1.11.5.3+ds1-11.5.3+ds1-1ubuntu0.11.5.3+ds1-1ubuntu0.1+esm11.5.3+ds1-1ubuntu0.1+esm2
1.5.3+ds1-1ubuntu0.1+esm3
pyjwt
Ubuntu:Pro:20.04:LTS
From an advisory covering 6 CVEs
before 1.7.1-2ubuntu2.1+esm3, plus listed versions
1.7.0-21.7.1-11.7.1-2ubuntu11.7.1-2ubuntu21.7.1-2ubuntu2.11.7.1-2ubuntu2.1+esm11.7.1-2ubuntu2.1+esm2
1.7.1-2ubuntu2.1+esm3
pyjwt
Ubuntu:22.04:LTS
From an advisory covering 6 CVEs
before 2.3.0-1ubuntu0.5, plus listed versions
1.7.1-2ubuntu22.1.0-12.3.0-12.3.0-1ubuntu0.12.3.0-1ubuntu0.22.3.0-1ubuntu0.32.3.0-1ubuntu0.4
2.3.0-1ubuntu0.5
pyjwt
Ubuntu:24.04:LTS
From an advisory covering 6 CVEs
before 2.7.0-1ubuntu0.3, plus listed versions
2.7.0-12.7.0-1ubuntu0.12.7.0-1ubuntu0.2
2.7.0-1ubuntu0.3
pyjwt
Ubuntu:26.04:LTS
From an advisory covering 6 CVEs
before 2.10.1-4ubuntu1.2, plus listed versions
2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu12.10.1-4ubuntu1.1
2.10.1-4ubuntu1.2
pyjwt
Ubuntu:26.10
From an advisory covering 6 CVEs
before 2.13.0-1ubuntu1, plus listed versions
2.10.1-4ubuntu12.12.1-12.13.0-1
2.13.0-1ubuntu1
python-PyJWT
openSUSE:Tumbleweed
From an advisory covering 9 CVEs
before 2.15.1-1.1
2.15.1-1.1

History

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

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

In short

CVE-2026-102266 is a high vulnerability (CVSS 7.4) in Jpadilla Pyjwt, published September 28, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 13th percentile. Fixed in pyjwt 2.14.0.

References

Show 43 moreShow less
This page doesn't list everything

Left out here: the rest of 3 source descriptions. The JSON record has them.

MoveEnter Open