The wrong string if check is run for iss checking, resulting in "acb" being accepted for "_abc_".
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__":.
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"])
I would say the real world impact is not that high, seeing as the signature still has to match. We should still fix it.
{
"severity": "LOW",
"nvd_published_at": "2024-11-29T19:15:09Z",
"github_reviewed": true,
"cwe_ids": [
"CWE-697"
],
"github_reviewed_at": "2024-12-02T18:34:11Z"
}