GitHub Advisoryadvisory · PyPI

GHSA-75c5-xw7c-p5pm PyJWT Issuer field partial matches allowed

LOW Published 2024-12-02 Modified 2024-12-02 Official page ↗
Aliases
CVE-2024-53861
Ecosystem
PyPI
Packages
PyJWT
Severity
Low
CVSS vector
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:N/I:L/A:N
Weaknesses
CWE-697
Reviewed
2024-12-02

Affected packages

• PyPI PyJWT: >= 2.10.0, < 2.10.1 → fixed in 2.10.1

Description

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)`. ```diff • 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 ```python 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.

Related

Alias · CVE (1)

  • CVE-2024-53861 pyjwt is a JSON Web Token implementation in Python. vulnerability

Weakness · CWE (1)

  • CWE-697 Incorrect Comparison weakness

References