Vulnerability PYSEC-2026-1814

Low Risk
LOW RISK
CVSS Score: 2.2
Score Range: < 4.0
Low severity vulnerabilities (CVSS < 4.0). Hygiene issues that can accumulate but pose lower immediate risk.
2 months ago
July 07, 2026 at 02:34 PM UTC
PyJWT Issuer field partial matches allowed
2.10.0
2.10.0

Summary

PyJWT Issuer field partial matches allowed

Details

Summary

The wrong string if check is run for iss checking, resulting in "acb" being accepted for "_abc_".

Details

This is a bug introduced in version 2.10.0: checking the "iss" claim changed from isinstance(issuer, list) to isinstance(issuer, Sequence).

-        if isinstance(issuer, list):
+        if isinstance(issuer, Sequence):
            if payload["iss"] not in issuer:
                raise InvalidIssuerError("Invalid issuer")
        else:

Since str is a Sequnce, but not a list, in is also used for string comparison. This results in if "abc" not in "__abcd__": being checked instead of if "abc" != "__abc__":.

PoC

Check out the unit tests added here: https://github.com/jpadilla/pyjwt-ghsa-75c5-xw7c-p5pm

        issuer = "urn:expected"

        payload = {"iss": "urn:"}

        token = jwt.encode(payload, "secret")

        # decode() succeeds, even though `"urn:" != "urn:expected". No exception is raised.
        with pytest.raises(InvalidIssuerError):
            jwt.decode(token, "secret", issuer=issuer, algorithms=["HS256"])

Impact

I would say the real world impact is not that high, seeing as the signature still has to match. We should still fix it.

Impacted packages

Timeline

Published
2 months ago
July 07, 2026 at 02:34 PM UTC
Fixed (2.10.1)
1 year ago
November 28, 2024 at 03:43 AM UTC
Last Modified
2 months ago
July 07, 2026 at 05:48 PM UTC