CVE-2026-102269
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. 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
- Low
- Integrity
- Low
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
4.8
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
CVE-2026-102269- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-180
- Updated
- 2026-11-02
EUVDEUVD-2026-88536
4.8
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
EUVD-2026-88536- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-hxm8-2xgr-2p9m
4.8
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
Summary
PyJWT 2.13.0 accepts compact JWS signature segments containing characters that
are not in the Base64URL alphabet. Appending !!!! to a valid signature does
not change the decoded signature bytes or authenticated claims, but it changes
the serialized token and its SHA-256 hash. An application that indexes logout
or revocation state by the raw token therefore rejects the logged-out token and
accepts its no-key alternate serialization.
This report separates two issues: permissive compact-JWS decoding is the
library behavior, while using raw serialized JWT text as a security identity is
a dangerous application composition. A jti-indexed control blocks both
representations.
Affected Version
Confirmed with PyJWT 2.13.0 on CPython 3.13. The mutation changes only the signature segment and requires no signing key.
End-to-End Reproduction
.venv-research/bin/python 06-practical-testing/revocation-bypass-lab.py
The loopback-only lab performs:
- Issue a valid HS256 admin token.
- Access
/protectedsuccessfully. - Log out the canonical token and store
SHA256(raw_token). - Confirm canonical replay returns HTTP 401.
- Append
!!!!to only the signature segment. - Confirm the mutated token has the same verified claims and signature bytes, a different raw hash, and receives HTTP 200.
- Repeat with
jti-indexed revocation and confirm both forms return HTTP 401.
Observed statuses for raw-token revocation were 200 -> logout -> 401 for the
canonical token and 200 for the alternate serialization. The jti control
returned 401 for both replays after logout.
Security Boundaries and Severity
This is not signature forgery: the attacker starts with a valid token and cannot alter its claims. Impact requires a consumer to bind revocation, replay state, rate limits, or cache identity to the raw compact string. Under that composition, an authenticated user can bypass logout or token-specific revocation without the signing key. Medium is suggested for triage because the security impact is real but application-dependent.
Recommended Fix
- Reject signature segments containing characters outside
[A-Za-z0-9_-]. - Reject padding and other non-canonical Base64URL encodings for compact JWS.
- Add regression tests proving malformed signature encodings fail before or during verification.
- Document that applications must use a semantic identifier such as
jti, not the raw serialized token, for revocation and replay state.
Maintainer update — 2026-09-09
We reproduced the reported behavior on the verified master commit 8915570: appending !!!! to a valid compact-JWS signature segment is accepted, produces the same decoded signature bytes and claims, and changes the serialized token hash. Existing JWS verification controls pass. The behavior is present in the tested release range represented by tags 2.4.0, 2.8.0, 2.10.1, 2.12.1, and 2.13.0.
The security impact is conditional on an application using the raw serialized token as the identity for logout, revocation, replay, rate-limit, or cache state. Under that composition, an attacker who already holds a valid token can use an alternate serialization after the canonical string is revoked. This is not signature forgery or claim alteration; applications should use a semantic identifier such as jti for token identity.
The report is ready to be accepted as a draft for continued remediation. A narrow fix assessment recommends rejecting non-canonical Base64URL characters and padding in compact-JWS segments. No fix commit or release is claimed yet.
Maintainer update — 2026-09-09
The fix has been rebased onto the current master as e6f48401001609a8f99e71fcaf355fb895d508a8 and is ready to be pushed. Compact-JWS header, payload, and signature segments are now required to use the unpadded Base64URL alphabet and canonical re-encoding; a signature segment containing non-canonical characters such as !!!! is rejected…
- Record
GHSA-hxm8-2xgr-2p9m- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-180
- Updated
- 2026-11-02
NVD
4.8
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
CVE-2026-102269- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-180
- Updated
- 2026-11-02
OSVBELL-CVE-2026-102269
5.4
- Record
BELL-CVE-2026-102269- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-07
OSV
4.8
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
CVE-2026-102269- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-180
- Updated
- 2026-11-03
Show 20 moreShow less
OSVDEBIAN-CVE-2026-102269
5.4
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
DEBIAN-CVE-2026-102269- CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVGHSA-hxm8-2xgr-2p9m
4.8
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
Summary
PyJWT 2.13.0 accepts compact JWS signature segments containing characters that
are not in the Base64URL alphabet. Appending !!!! to a valid signature does
not change the decoded signature bytes or authenticated claims, but it changes
the serialized token and its SHA-256 hash. An application that indexes logout
or revocation state by the raw token therefore rejects the logged-out token and
accepts its no-key alternate serialization.
This report separates two issues: permissive compact-JWS decoding is the
library behavior, while using raw serialized JWT text as a security identity is
a dangerous application composition. A jti-indexed control blocks both
representations.
Affected Version
Confirmed with PyJWT 2.13.0 on CPython 3.13. The mutation changes only the signature segment and requires no signing key.
End-to-End Reproduction
.venv-research/bin/python 06-practical-testing/revocation-bypass-lab.py
The loopback-only lab performs:
- Issue a valid HS256 admin token.
- Access
/protectedsuccessfully. - Log out the canonical token and store
SHA256(raw_token). - Confirm canonical replay returns HTTP 401.
- Append
!!!!to only the signature segment. - Confirm the mutated token has the same verified claims and signature bytes, a different raw hash, and receives HTTP 200.
- Repeat with
jti-indexed revocation and confirm both forms return HTTP 401.
Observed statuses for raw-token revocation were 200 -> logout -> 401 for the
canonical token and 200 for the alternate serialization. The jti control
returned 401 for both replays after logout.
Security Boundaries and Severity
This is not signature forgery: the attacker starts with a valid token and cannot alter its claims. Impact requires a consumer to bind revocation, replay state, rate limits, or cache identity to the raw compact string. Under that composition, an authenticated user can bypass logout or token-specific revocation without the signing key. Medium is suggested for triage because the security impact is real but application-dependent.
Recommended Fix
- Reject signature segments containing characters outside
[A-Za-z0-9_-]. - Reject padding and other non-canonical Base64URL encodings for compact JWS.
- Add regression tests proving malformed signature encodings fail before or during verification.
- Document that applications must use a semantic identifier such as
jti, not the raw serialized token, for revocation and replay state.
Maintainer update — 2026-09-09
We reproduced the reported behavior on the verified master commit 8915570: appending !!!! to a valid compact-JWS signature segment is accepted, produces the same decoded signature bytes and claims, and changes the serialized token hash. Existing JWS verification controls pass. The behavior is present in the tested release range represented by tags 2.4.0, 2.8.0, 2.10.1, 2.12.1, and 2.13.0.
The security impact is conditional on an application using the raw serialized token as the identity for logout, revocation, replay, rate-limit, or cache state. Under that composition, an attacker who already holds a valid token can use an alternate serialization after the canonical string is revoked. This is not signature forgery or claim alteration; applications should use a semantic identifier such as jti for token identity.
The report is ready to be accepted as a draft for continued remediation. A narrow fix assessment recommends rejecting non-canonical Base64URL characters and padding in compact-JWS segments. No fix commit or release is claimed yet.
Maintainer update — 2026-09-09
The fix has been rebased onto the current master as e6f48401001609a8f99e71fcaf355fb895d508a8 and is ready to be pushed. Compact-JWS header, payload, and signature segments are now required to use the unpadded Base64URL alphabet and canonical re-encoding; a signature segment containing non-canonical characters such as !!!! is rejected…
- Record
GHSA-hxm8-2xgr-2p9m- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Weakness
- CWE-180
- Updated
- 2026-11-02
OSVOESA-2026-4453
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT get_signing_key_from_jwt is affected because unknown kid misses force refreshes without a negative cache or minimum refresh interval. This occurs when unauthenticated tokens repeatedly use the same unknown kid or varying kid values absent from the cached JWKS. As a result, each cache miss causes PyJWKClient to refresh the JWKS. Consequently, attacker traffic can amplify outbound requests to the configured JWKS endpoint. This issue is fixed in version 2.14.0.(CVE-2026-101917)
PyJWT is a Python implementation of JSON Web Token standards. From 2.0.0a1 until 2.15.0, PyJWT PyJWKClient.get_signing_key_from_jwt is affected because payload parser catches ValueError but not RecursionError. This occurs when an attacker-controlled recursively nested payload reaches json.loads. As a result, documented PyJWT exception handling does not contain the failure. Consequently, an unauthenticated request can raise an exception that may produce an HTTP 500 response. The advisory-defined affected implementation also includes jwt/api_jwt.py, verify_signature=False. This issue is fixed in version 2.15.0.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4453- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4454
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
PyJWT is a Python implementation of JSON Web Token standards. From 2.0.0a1 until 2.15.0, PyJWT PyJWKClient.get_signing_key_from_jwt is affected because payload parser catches ValueError but not RecursionError. This occurs when an attacker-controlled recursively nested payload reaches json.loads. As a result, documented PyJWT exception handling does not contain the failure. Consequently, an unauthenticated request can raise an exception that may produce an HTTP 500 response. The advisory-defined affected implementation also includes jwt/api_jwt.py, verify_signature=False. This issue is fixed in version 2.15.0.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4454- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4455
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT get_signing_key_from_jwt is affected because unknown kid misses force refreshes without a negative cache or minimum refresh interval. This occurs when unauthenticated tokens repeatedly use the same unknown kid or varying kid values absent from the cached JWKS. As a result, each cache miss causes PyJWKClient to refresh the JWKS. Consequently, attacker traffic can amplify outbound requests to the configured JWKS endpoint. This issue is fixed in version 2.14.0.(CVE-2026-101917)
PyJWT is a Python implementation of JSON Web Token standards. From 2.0.0a1 until 2.15.0, PyJWT PyJWKClient.get_signing_key_from_jwt is affected because payload parser catches ValueError but not RecursionError. This occurs when an attacker-controlled recursively nested payload reaches json.loads. As a result, documented PyJWT exception handling does not contain the failure. Consequently, an unauthenticated request can raise an exception that may produce an HTTP 500 response. The advisory-defined affected implementation also includes jwt/api_jwt.py, verify_signature=False. This issue is fixed in version 2.15.0.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4455- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVOESA-2026-4456
6.5
python-jwt security update
setup.py test %endif
Security Fix(es):
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT get_signing_key_from_jwt is affected because unknown kid misses force refreshes without a negative cache or minimum refresh interval. This occurs when unauthenticated tokens repeatedly use the same unknown kid or varying kid values absent from the cached JWKS. As a result, each cache miss causes PyJWKClient to refresh the JWKS. Consequently, attacker traffic can amplify outbound requests to the configured JWKS endpoint. This issue is fixed in version 2.14.0.(CVE-2026-101917)
PyJWT is a Python implementation of JSON Web Token standards. From 2.0.0a1 until 2.15.0, PyJWT PyJWKClient.get_signing_key_from_jwt is affected because payload parser catches ValueError but not RecursionError. This occurs when an attacker-controlled recursively nested payload reaches json.loads. As a result, documented PyJWT exception handling does not contain the failure. Consequently, an unauthenticated request can raise an exception that may produce an HTTP 500 response. The advisory-defined affected implementation also includes jwt/api_jwt.py, verify_signature=False. This issue is fixed in version 2.15.0.(CVE-2026-101918)
PyJWT is a Python implementation of JSON Web Token standards. From 2.13.0 until 2.14.0, PyJWS._load in jwt/api_jws.py is affected because parser catches ValueError but not RecursionError. This occurs when a deeply nested token header reaches json.loads. As a result, RecursionError escapes the documented PyJWT error hierarchy. Consequently, an unauthenticated malformed token can cause a request-level failure and HTTP 500. This issue is fixed in version 2.14.0.(CVE-2026-102265)
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.(CVE-2026-102269)
PyJWT is a Python implementation of JSON Web Token standards. From 2.1.0 until 2.15.0, PyJWT OKPAlgorithm.from_jwk in jwt/algorithms.py is affected because private-JWK import path does not compare the public key derived from d with x. This occurs when an OKP private JWK supplies non-corresponding x and d components. As a result, identity derived from x can differ from operations performed with d. Consequently, if an integration also accepts private key parameters from a proof header without rejecting them, an attacker may use a stolen sender-constrained token without the legitimate private key. This issue is fixed in version 2.15.0.(CVE-2026-102275)
- Record
OESA-2026-4456- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:H/A:N - Updated
- 2026-11-02
OSVPYSEC-2026-4147
4.8
PyJWT: Non-canonical signature segments enable raw-token revocation bypass
Summary
PyJWT 2.13.0 accepts compact JWS signature segments containing characters that
are not in the Base64URL alphabet. Appending !!!! to a valid signature does
not change the decoded signature bytes or authenticated claims, but it changes
the serialized token and its SHA-256 hash. An application that indexes logout
or revocation state by the raw token therefore rejects the logged-out token and
accepts its no-key alternate serialization.
This report separates two issues: permissive compact-JWS decoding is the
library behavior, while using raw serialized JWT text as a security identity is
a dangerous application composition. A jti-indexed control blocks both
representations.
Affected Version
Confirmed with PyJWT 2.13.0 on CPython 3.13. The mutation changes only the signature segment and requires no signing key.
End-to-End Reproduction
.venv-research/bin/python 06-practical-testing/revocation-bypass-lab.py
The loopback-only lab performs:
- Issue a valid HS256 admin token.
- Access
/protectedsuccessfully. - Log out the canonical token and store
SHA256(raw_token). - Confirm canonical replay returns HTTP 401.
- Append
!!!!to only the signature segment. - Confirm the mutated token has the same verified claims and signature bytes, a different raw hash, and receives HTTP 200.
- Repeat with
jti-indexed revocation and confirm both forms return HTTP 401.
Observed statuses for raw-token revocation were 200 -> logout -> 401 for the
canonical token and 200 for the alternate serialization. The jti control
returned 401 for both replays after logout.
Security Boundaries and Severity
This is not signature forgery: the attacker starts with a valid token and cannot alter its claims. Impact requires a consumer to bind revocation, replay state, rate limits, or cache identity to the raw compact string. Under that composition, an authenticated user can bypass logout or token-specific revocation without the signing key. Medium is suggested for triage because the security impact is real but application-dependent.
Recommended Fix
- Reject signature segments containing characters outside
[A-Za-z0-9_-]. - Reject padding and other non-canonical Base64URL encodings for compact JWS.
- Add regression tests proving malformed signature encodings fail before or during verification.
- Document that applications must use a semantic identifier such as
jti, not the raw serialized token, for revocation and replay state.
Maintainer update — 2026-09-09
We reproduced the reported behavior on the verified master commit 8915570: appending !!!! to a valid compact-JWS signature segment is accepted, produces the same decoded signature bytes and claims, and changes the serialized token hash. Existing JWS verification controls pass. The behavior is present in the tested release range represented by tags 2.4.0, 2.8.0, 2.10.1, 2.12.1, and 2.13.0.
The security impact is conditional on an application using the raw serialized token as the identity for logout, revocation, replay, rate-limit, or cache state. Under that composition, an attacker who already holds a valid token can use an alternate serialization after the canonical string is revoked. This is not signature forgery or claim alteration; applications should use a semantic identifier such as jti for token identity.
The report is ready to be accepted as a draft for continued remediation. A narrow fix assessment recommends rejecting non-canonical Base64URL characters and padding in compact-JWS segments. No fix commit or release is claimed yet.
Maintainer update — 2026-09-09
The fix has been rebased onto the current master as e6f48401001609a8f99e71fcaf355fb895d508a8 and is ready to be pushed. Compact-JWS header, payload, and signature segments are now required to use the unpadded Base64URL alphabet and canonical re-encoding; a signature segment containing non-canonical characters such as !!!! is rejected…
- Record
PYSEC-2026-4147- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-102269
4.8
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
UBUNTU-CVE-2026-102269- CVSS 3.1
- 4.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:N - CVSS 3.1
- 5.4 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N - Updated
- 2026-11-02
OSVAZL-104985 No score
CVE-2026-102269 affecting package python-jwt for versions less than 2.15.1-1
PyJWT is a Python implementation of JSON Web Token standards. Prior to 2.14.0, PyJWT signature segment is affected because signature segment decoding accepts characters outside the canonical Base64URL representation. This occurs when non-Base64URL characters are appended to a valid compact JWS signature segment. As a result, base64url_decode produces the same signature bytes for different serialized segments. Consequently, raw-token revocation checks can fail to recognize an equivalent modified token. This issue is fixed in version 2.14.0.
- Record
AZL-104985- Updated
- 2026-11-02
OSVCLSA-2026-1790839846 No score
TuxCare security update for pyjwt (6 CVEs)
TuxCare rebuilt pyjwt to address 6 CVEs. Fixed in 2.10.1.post5+tuxcare.
- Record
CLSA-2026-1790839846- Updated
- 2026-11-02
OSVCLSA-2026-1790843991 No score
TuxCare security update for pyjwt (6 CVEs)
TuxCare rebuilt pyjwt to address 6 CVEs. Fixed in 2.8.0.post4+tuxcare.
- Record
CLSA-2026-1790843991- Updated
- 2026-11-02
OSVCLSA-2026-1791271338 No score
TuxCare security update for pyjwt (7 CVEs)
TuxCare rebuilt pyjwt to address 7 CVEs. Fixed in 2.3.0.post4+tuxcare.
- Record
CLSA-2026-1791271338- Updated
- 2026-11-02
OSVCLSA-2026-1791272933 No score
TuxCare security update for pyjwt (3 CVEs)
TuxCare rebuilt pyjwt to address 3 CVEs. Fixed in 1.7.1.post4+tuxcare.
- Record
CLSA-2026-1791272933- 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
OSVopenSUSE-SU-2026:22074-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
openSUSE-SU-2026:22074-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24126-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24126-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24134-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- Record
SUSE-SU-2026:24134-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24219-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24219-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24377-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102274: Malformed RSA JWK aborts parsing of an entire JWK Set (bsc#1283071).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- CVE-2026-103001: reused mutable options mapping can cause verification checks bypass on subsequent decode calls (bsc#1283829).
- Record
SUSE-SU-2026:24377-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:5064-1 No score
Security update for python-PyJWT
This update for python-PyJWT fixes the following issues:
- CVE-2026-101917: attacker traffic can amplify outbound requests to the configured JWKS endpoint (bsc#1283060).
- CVE-2026-101918: unauthenticated request can raise an exception that may produce an HTTP 500 response (bsc#1283061).
- CVE-2026-102267: forwarded credentials may be disclosed or verification keys may be substituted (bsc#1283064).
- CVE-2026-102268: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283065).
- CVE-2026-102269: raw-token revocation checks can fail to recognize an equivalent modified token (bsc#1283066).
- CVE-2026-102270: an attacker can cause intensive CPU consumption (bsc#1283067).
- CVE-2026-102271: an attacker who knows the public key can forge authenticated HMAC tokens (bsc#1283068).
- CVE-2026-102275: an attacker may use a stolen sender-constrained token without the legitimate private key (bsc#1283072).
- Record
SUSE-SU-2026:5064-1- Updated
- 2026-11-03
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
pyjwtPyPI |
through 2.13.0 | 2.14.0 |
python-jwtAzure Linux:3 |
before 2.15.1-1 | 2.15.1-1 |
py3-jwtAlpaquita:25 |
2.10.1-r0 up to 2.15.1-r0 | 2.15.1-r0 |
py3-jwtAlpaquita:stream |
2.8.0-r1 up to 2.15.1-r0 | 2.15.1-r0 |
pyjwtTuxCare:PyPI From an advisory covering 6 CVEs |
2.10.1 up to 2.10.1.post5+tuxcare, plus listed versions 2.10.1.post1+tuxcare2.10.1.post2+tuxcare2.10.1.post3+tuxcare2.10.1.post4+tuxcare |
2.10.1.post5+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 6 CVEs |
2.8.0 up to 2.8.0.post4+tuxcare, plus listed versions 2.8.0.post1+tuxcare2.8.0.post2+tuxcare2.8.0.post3+tuxcare |
2.8.0.post4+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 7 CVEs |
2.3.0 up to 2.3.0.post4+tuxcare, plus listed versions 2.3.0.post1+tuxcare2.3.0.post2+tuxcare2.3.0.post3+tuxcare |
2.3.0.post4+tuxcare |
pyjwtTuxCare:PyPI From an advisory covering 3 CVEs |
1.7.1 up to 1.7.1.post4+tuxcare, plus listed versions 1.7.1.post1+tuxcare1.7.1.post2+tuxcare1.7.1.post3+tuxcare |
1.7.1.post4+tuxcare |
pyjwtDebian:12 |
All versions, plus listed versions 2.10.1-12.10.1-22.10.1-32.10.1-42.11.0-2 Show 8 moreShow less2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-12.6.0-12.6.0-1+deb12u12.7.0-1 |
None known |
pyjwtDebian: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 less2.12.1-12.13.0-12.14.0-12.15.0-12.15.1-1 |
None known |
Show 32 moreShow less
| Package | Affected | Fixed |
|---|---|---|
pyjwtDebian: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 |
pyjwtPyPI |
before 2.14.0, plus listed versions 0.1.10.1.20.1.30.1.40.1.5 Show 45 moreShow less0.1.60.1.70.1.80.1.90.2.00.2.10.2.30.3.00.3.10.3.20.4.00.4.10.4.20.4.31.0.01.0.11.1.01.3.01.4.01.4.11.4.21.5.01.5.11.5.21.5.31.6.01.6.11.6.31.6.41.7.01.7.12.0.02.0.0a12.0.0a22.0.12.1.02.10.02.10.12.11.02.12.02.12.12.13.02.2.02.3.02.4.0 |
2.14.0 |
python-jwtopenEuler:24.03-LTS-SP4 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp4 | 2.8.0-11.oe2403sp4 |
python-jwtopenEuler:22.03-LTS-SP4 From an advisory covering 4 CVEs |
before 2.3.0-12.oe2203sp4 | 2.3.0-12.oe2203sp4 |
python-jwtopenEuler:24.03-LTS-SP1 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp1 | 2.8.0-11.oe2403sp1 |
python-jwtopenEuler:24.03-LTS-SP3 From an advisory covering 5 CVEs |
before 2.8.0-11.oe2403sp3 | 2.8.0-11.oe2403sp3 |
python-PyJWTSUSE:Linux Micro 6.2 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Micro 6.0 From an advisory covering 9 CVEs |
before 2.9.0-159998.1.1 | 2.9.0-159998.1.1 |
python-PyJWTSUSE:Linux Enterprise Server 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP applications 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
python-PyJWTSUSE:Linux Micro 6.1 From an advisory covering 10 CVEs |
before 2.12.1-slfo.1.1_3.1 | 2.12.1-slfo.1.1_3.1 |
python-PyJWTSUSE:Linux Enterprise Module for Public Cloud 15 SP4 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Module for Python 3 15 SP7 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP4-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP5-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server 15 SP6-LTSS From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP4 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP5 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
python-PyJWTSUSE:Linux Enterprise Server for SAP Applications 15 SP6 From an advisory covering 8 CVEs |
before 2.8.0-150400.8.20.1 | 2.8.0-150400.8.20.1 |
pyjwtUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 1.0.0-0ubuntu11.3.0-11.3.0-1ubuntu0.11.3.0-1ubuntu0.1+esm11.3.0-1ubuntu0.1+esm21.3.0-1ubuntu0.1+esm31.3.0-1ubuntu0.1+esm4 |
None known |
pyjwtUbuntu:Pro:18.04:LTS |
All versions, 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+esm21.5.3+ds1-1ubuntu0.1+esm31.5.3+ds1-1ubuntu0.1+esm4 |
None known |
pyjwtUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 1.7.0-21.7.1-11.7.1-2ubuntu11.7.1-2ubuntu21.7.1-2ubuntu2.1 Show 4 moreShow less1.7.1-2ubuntu2.1+esm11.7.1-2ubuntu2.1+esm21.7.1-2ubuntu2.1+esm31.7.1-2ubuntu2.1+esm4 |
None known |
pyjwtUbuntu:22.04:LTS |
All versions, plus listed versions 1.7.1-2ubuntu22.1.0-12.3.0-12.3.0-1ubuntu0.12.3.0-1ubuntu0.2 Show 4 moreShow less2.3.0-1ubuntu0.32.3.0-1ubuntu0.42.3.0-1ubuntu0.52.3.0-1ubuntu0.6 |
None known |
pyjwtUbuntu:24.04:LTS |
All versions, plus listed versions 2.7.0-12.7.0-1ubuntu0.12.7.0-1ubuntu0.22.7.0-1ubuntu0.32.7.0-1ubuntu0.4 |
None known |
pyjwtUbuntu:26.10 |
All versions, plus listed versions 2.10.1-4ubuntu12.12.1-12.13.0-12.13.0-1ubuntu12.13.0-1ubuntu1.1 |
None known |
pyjwtUbuntu:26.04:LTS |
All versions, plus listed versions 2.10.1-22.10.1-32.10.1-3build12.10.1-42.10.1-4ubuntu12.10.1-4ubuntu1.12.10.1-4ubuntu1.22.10.1-4ubuntu1.3 |
None known |
python-PyJWTopenSUSE:Tumbleweed From an advisory covering 9 CVEs |
before 2.15.1-1.1 | 2.15.1-1.1 |
python-PyJWTopenSUSE:Leap 16.0 From an advisory covering 10 CVEs |
before 2.12.1-160000.3.1 | 2.12.1-160000.3.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases, references | OSV | |
| affected | OSV | |
| affected, aliases, facts, references | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-102269 is a medium vulnerability (CVSS 4.8) 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
github.com/jpadilla/pyjwt/security/advisories/GHSA-hxm8-2xgr-2p9m
github.com/jpadilla/pyjwt/commit/e6f48401001609a8f99e71fcaf355fb895d508a8
github.com/jpadilla/pyjwt/releases/tag/2.14.0
nvd.nist.gov/vuln/detail/CVE-2026-102269
github.com/advisories/GHSA-hxm8-2xgr-2p9m
docs.bell-sw.com/security/cves/CVE-2026-102269
Show 41 moreShow less
github.com/CVEProject/cvelistV5/tree/main/cves/2026/102xxx/CVE-2026-102269.json
security-tracker.debian.org/tracker/CVE-2026-102269
github.com/jpadilla/pyjwt
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4453
nvd.nist.gov/vuln/detail/CVE-2026-101917
nvd.nist.gov/vuln/detail/CVE-2026-101918
nvd.nist.gov/vuln/detail/CVE-2026-102265
nvd.nist.gov/vuln/detail/CVE-2026-102275
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4454
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4455
openeuler.org/zh/security/security-bulletins/detail?id=openEuler-SA-2026-4456
pypi.org/project/pyjwt
suse.com/support/update/announcement/2026/suse-su-202624126-1
bugzilla.suse.com/1283060
bugzilla.suse.com/1283061
bugzilla.suse.com/1283064
bugzilla.suse.com/1283065
bugzilla.suse.com/1283066
bugzilla.suse.com/1283067
bugzilla.suse.com/1283068
bugzilla.suse.com/1283071
bugzilla.suse.com/1283072
bugzilla.suse.com/1283829
suse.com/security/cve/CVE-2026-101917
suse.com/security/cve/CVE-2026-101918
suse.com/security/cve/CVE-2026-102267
suse.com/security/cve/CVE-2026-102268
suse.com/security/cve/CVE-2026-102269
suse.com/security/cve/CVE-2026-102270
suse.com/security/cve/CVE-2026-102271
suse.com/security/cve/CVE-2026-102274
suse.com/security/cve/CVE-2026-102275
suse.com/security/cve/CVE-2026-103001
suse.com/support/update/announcement/2026/suse-su-202624134-1
suse.com/support/update/announcement/2026/suse-su-202624219-1
suse.com/support/update/announcement/2026/suse-su-202624377-1
suse.com/support/update/announcement/2026/suse-su-20265064-1
ubuntu.com/security/CVE-2026-102269
cve.org/CVERecord?id=CVE-2026-102269
suse.com/security/cve/CVE-2026-102266
suse.com/security/cve/CVE-2026-102272
Left out here: 5 versions and the rest of 3 source descriptions. The JSON record has them.