CVE-2026-32597 is a PyJWT token-validation flaw, not a Windows operating system vulnerability, and the practical fix is to update the Python dependency in applications and containers that verify JSON Web Tokens. PyJWT versions before 2.12.0 accepted JWS tokens declaring unknown critical header extensions in the crit field—behavior RFC 7515 explicitly says must invalidate the token.

Microsoft’s Security Update Guide carries an entry for the CVE, but there is no Microsoft patch to deploy through Windows Update. The affected component is the third-party

pyjwt

package used by Python applications, automation services, API back ends, and identity-adjacent tooling. For Windows administrators, the relevant estate is IIS-hosted Python workloads, Windows Server application services, developer virtual environments, Azure-hosted containers, CI runners, and any packaged product that bundles Python and PyJWT.

GitHub’s PyJWT advisory, published March 12, 2026, rates the issue High with a CVSS 3.1 score of 7.5. NVD and Red Hat describe the same defect: a token can carry a

crit

array naming a header extension the recipient does not understand, yet vulnerable PyJWT versions continue processing the token after a valid signature check. PyJWT 2.12.0 added validation that rejects unsupported critical extensions.

Security diagram showing rejection of vulnerable PyJWT and remediation by upgrading to version 2.12.0.The crit field is supposed to stop silent policy downgrades​

A JWS header can include

crit

, short for critical, to announce extensions whose meaning changes how a recipient must handle the token. The RFC rule is deliberately strict: if a recipient does not understand and process every listed critical header parameter, the JWS is invalid.

That rule exists to prevent one component from treating a token as carrying a mandatory security control while another component quietly ignores it. A token might, for example, declare an extension related to proof-of-possession, multi-factor enforcement, a constrained scope, or a tenant-specific authorization condition. If the extension is critical, software that cannot enforce it must reject the token rather than accept an incomplete interpretation of the issuer’s intent.

Before 2.12.0, PyJWT did not do that. Its decoder parsed the header and verified the signature but did not validate the

crit

declaration. The PyJWT advisory demonstrates a token with an unknown header called

x-custom-policy

listed under

crit

; vulnerable code accepts the token and returns its claims. An RFC-compliant verifier would reject the same token.

This is not a cryptographic signature break. An attacker does not gain the ability to forge an HS256, RS256, or ES256 token merely by adding

crit

. The signature still has to validate. The risk emerges when a validly signed token reaches a PyJWT-based service that is expected to honor a policy communicated through a critical header extension—or when different parts of a token-processing path use different JWT libraries.

Mixed JWT stacks are where the defect turns into an authorization problem​

The clearest operational scenario is a split-brain verifier arrangement. An API gateway, authentication proxy, or broker may use one library and correctly reject a token because it contains an unknown critical extension. A downstream Windows-hosted Python service using vulnerable PyJWT may accept that same signed token and authorize the request without applying the extension’s security semantics.

That can happen in environments where token issuers, gateways, sidecars, and application services were assembled by different teams or products. It is especially plausible in a service mesh or API-management design where JWT verification happens at more than one tier, but the verification libraries and policy engines differ.

The flaw also deserves attention in products that mint custom JWT headers for internal federation. Many ordinary OAuth 2.0 and OpenID Connect deployments will not use critical JWS extensions at all. In those installations, the vulnerable parser is still noncompliant, but the immediate exploit path may be absent. Administrators should not mistake that narrower exposure for a reason to leave the package unpatched: the application may accept third-party tokens, add custom headers later, or have an upstream component already relying on a critical extension that the back end never enforced.

Red Hat’s advisory gives the CVE the same 7.5 High score and reports no generally suitable mitigation short of remediation. Its product records also show that the issue reached real enterprise dependency chains, including components in Red Hat Ansible Automation Platform. That is a useful warning for Windows teams: a package does not need to be installed directly with

pip install PyJWT

for it to be present. It may arrive inside an automation suite, a management service, a Python SDK, a container base image, or a vendor appliance.


The advisory has a version-range error that can mislead inventory work​

The most important wrinkle in this CVE is not the severity score; it is an inconsistency in the primary records.

GitHub’s PyJWT advisory lists affected versions as earlier than 2.11.0 while also naming 2.12.0 as the patched release. Those two statements cannot both define the complete affected range. PyJWT 2.11.0 was released on January 30, 2026, and its source code still lacks critical-header validation during token decoding. The 2.12.0 source adds

_validate_crit()

and invokes header validation before signature verification completes. The PyJWT 2.12.0 release notes explicitly identify validation of the RFC 7515

crit

parameter as its security change.

NVD’s CVE record gets the practical boundary right: all versions before 2.12.0 are affected. Debian’s security tracking also lists 2.6.0 as affected and shipped a security update for its 2.10.1 package line. The conclusion is straightforward: treat PyJWT 2.11.0 as vulnerable despite the GitHub advisory’s displayed

< 2.11.0

affected-version field.

That discrepancy matters for vulnerability management. SBOM scanners, GitHub Advisory Database consumers, dependency dashboards, and internal exception processes do not all normalize advisory data the same way. A rule that keys only on the erroneous

< 2.11.0

range could incorrectly mark a deployment of PyJWT 2.11.0 as unaffected. Security teams should query installed versions directly rather than accept a green finding at face value.

On a Windows application host or build agent, the quickest checks are typically:

Code:
py -m pip show PyJWT
py -m pip freeze | Select-String -Pattern '^PyJWT=='

For each application-specific virtual environment, run the commands through that environment’s interpreter rather than the system Python launcher. For containers, inspect the built image or generate an SBOM from the final image layer; checking only the source repository’s requirements file will miss transitive dependencies and pinned wheel bundles.

Upgrade to PyJWT 2.12.0 at minimum, but test 2.13.0 deliberately​

PyJWT 2.12.0, released March 12, 2026, is the minimum upstream version that fixes CVE-2026-32597. PyJWT 2.12.1 followed on March 13 with a Python compatibility dependency correction. The current upstream release, PyJWT 2.13.0 from May 21, contains the

crit

fix and bundles several later security fixes and RFC-compliance changes.

For a narrowly scoped emergency remediation, upgrading an affected application to 2.12.1 or later removes this CVE. For a normal maintenance cycle, PyJWT 2.13.0 is the better target because it addresses additional token-verification and JWKS-handling weaknesses disclosed after 2.12.0.

However, 2.13.0 is not a zero-behavior-change upgrade. Its release notes say it now rejects empty HMAC secrets, enforces consistency between a token’s

alg

header and a

PyJWK

algorithm, blocks non-HTTP(S) JWKS URLs, and tightens handling of detached

b64=false

JWS payloads. Those changes close real security gaps, but a test environment may expose applications that were relying on an empty environment variable, a

file://

JWKS source, or malformed detached tokens.

A practical remediation sequence is:

  • Identify every installed PyJWT version, including versions inside virtual environments, containers, application bundles, and vendor-supported products.
  • Treat all PyJWT releases through 2.11.0 as affected, regardless of any scanner result derived solely from GitHub’s inconsistent range.
  • Upgrade to 2.12.0 or later immediately, then schedule compatibility validation for 2.13.0 where it is not already deployed.
  • Test token issuance and validation flows with your actual identity provider, gateway, JWKS source, permitted signing algorithms, and any detached-payload JWS use.
  • Review whether your organization uses custom JWT headers to signal mandatory policy. If it does, verify every component rejects tokens whose critical extensions it cannot enforce.

Microsoft’s listing should trigger dependency triage, not Patch Tuesday workflow​

The submitted MSRC entry risks sending administrators toward the wrong operational queue. This is not a KB-numbered Windows update, a Microsoft service-side remediation, or a vulnerability that Endpoint Manager can close by applying a cumulative update. It is an application dependency issue whose owner may be a development team, platform engineering group, product vendor, or managed-service provider.

The immediate consequence is simple: any Windows-hosted service that verifies JWTs with PyJWT 2.11.0 or older should be treated as needing an application update. The tougher work is proving where PyJWT is embedded and ensuring that scanners do not clear version 2.11.0 based on the GitHub advisory’s faulty affected-version boundary.


References​

  1. Primary source: MSRC
    Published: August 8, 2026 at 8:40 AM UTC
  2. Related coverage: nvd.nist.gov
  3. Related coverage: notcve.org
  4. Related coverage: advisories.gitlab.com
  5. Related coverage: github.com
  6. Related coverage: github.com
  7. Related coverage: advisories.gitlab.com
  8. Related coverage: msrc.microsoft.com
  9. Related coverage: cvefeed.io
  10. Related coverage: security.glexia.com
  11. Related coverage: pyjwt.readthedocs.io
  12. Related coverage: vulert.com
  13. Related coverage: vulmon.com
  14. Related coverage: cvereports.hashnode.dev
  15. Related coverage: secure.software