{"id":"CVE-2026-114618","kind":"vulnerability","aliases":["CVE-2026-114618"],"related":[],"title":"Authlib: JWT bearer grant accepts assertions meant for other services","description":"Authlib is a Python library which builds OAuth and OpenID Connect servers. Prior to 1.9.0, the default RFC 7523 JWTBearerGrant.get_audiences() returns an empty list, causing JWTBearerGrant.verify_claims() to require only that an aud claim exists without matching the current authorization server. An attacker holding a legitimate assertion for another service can present it to a server that shares the signing key and uses the default grant, obtaining an access token across a trust boundary. Implementations that override get_audiences() with the server's valid audience identifiers are not affected. This issue is fixed in version 1.9.0.","summary":"Before version 1.9.0, Authlib's default RFC 7523 JWT bearer grant only checks that an assertion has an aud claim, without matching it to the current server. An attacker holding a valid assertion issued for another service that shares the signing key can use it to obtain an access token here.","severity":"medium","cvss":6.8,"epss":0.00225,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["authlib","oauth","openid-connect","package","python"],"not_affected_if":["no-jwt-bearer-grant","overrides-get-audiences"],"how_to_check":"- Find the Authlib version with `pip show authlib` or `pip freeze | grep -i authlib`\n- Check whether the server uses `JWTBearerGrant` without overriding `get_audiences()`\n- Check whether the other services sharing the signing key are trusted with the same keys","fix":"- Upgrade Authlib to `1.9.0` or later\n- Until upgraded, override `get_audiences()` to return the server's valid audience identifiers","status":"open","published_at":"2026-10-22T22:18:04+00:00","first_seen_at":"2026-10-23T21:57:32+00:00","triaged_at":"2026-10-25T03:42:40+00:00","updated_at":"2026-10-25T03:42:40+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-10-25T03:42:40Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Authlib to `1.9.0` or later\n- Until upgraded, override `get_audiences()` to return the server's valid audience identifiers","reach":"network","title":"Authlib: JWT bearer grant accepts assertions meant for other services","impact":"high","summary":"Before version 1.9.0, Authlib's default RFC 7523 JWT bearer grant only checks that an assertion has an aud claim, without matching it to the current server. An attacker holding a valid assertion issued for another service that shares the signing key can use it to obtain an access token here.","category":"package","nicknames":[],"who_cares":["python","authlib","oauth","openid-connect"],"confidence":0.7,"needs_auth":"yes","worst_case":"Attacker obtains access token using another service's assertion","analyst_note":"","how_to_check":"- Find the Authlib version with `pip show authlib` or `pip freeze | grep -i authlib`\n- Check whether the server uses `JWTBearerGrant` without overriding `get_audiences()`\n- Check whether the other services sharing the signing key are trusted with the same keys","needs_analyst":false,"not_affected_if":["overrides-get-audiences","no-jwt-bearer-grant"],"who_is_affected":"Servers built on Authlib that accept RFC 7523 JWT bearer grants with the default grant class and share a signing key with another service. Servers that override get_audiences() with their own audience identifiers are not affected. Teams not using JWTBearerGrant can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000625,"input_tokens":3453,"output_tokens":560,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-114618':13A,16A '-2026':12A,15A '1.9.0':26B,88C,170C '7523':31B,92C 'accept':5A 'access':72B,143C 'across':145C 'affect':163C 'anoth':59B,123C 'assert':6A,39B,56B,121C 'attack':52B,117C 'aud':42B,107C 'audienc':94C,153C,159C 'authlib':1A,17B,27B,74C 'author':114C 'bearer':3A,33B 'boundari':148C 'build':80C 'caus':99C 'check':36B 'claim':43B,101C,108C 'connect':21B,84C 'current':49B,113C 'cve':11A,14A 'default':29B,90C,139C 'empti':97C 'exist':109C 'fix':167C 'get':152C 'grant':4A,34B,140C 'hold':53B,118C 'identifi':160C 'implement':149C 'issu':57B,165C 'jwt':2A,32B 'jwtbearergrant.get':93C 'jwtbearergrant.verify':100C 'key':65B,135C 'legitim':120C 'librari':78C 'list':98C 'match':45B,111C 'meant':7A 'oauth':18B,81C 'obtain':70B,141C 'openid':20B,83C 'openid-connect':19B 'overrid':151C 'packag':22B 'present':126C 'prior':86C 'python':23B,77C 'requir':103C 'return':95C 'rfc':30B,91C 'server':50B,85C,115C,130C,156C 'servic':10A,60B,124C 'share':62B,132C 'sign':64B,134C 'token':73B,144C 'trust':147C 'use':67B,137C 'valid':55B,158C 'version':25B,169C 'without':44B,110C","nicknames":[],"mitigations":[],"who_affected":"Servers built on Authlib that accept RFC 7523 JWT bearer grants with the default grant class and share a signing key with another service. Servers that override get_audiences() with their own audience identifiers are not affected. Teams not using JWTBearerGrant can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-22T22:18:04+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-114618","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-114618","severity":null,"published_at":"2026-10-22T22:18:04+00:00","modified_at":"2026-10-23T19:34:14+00:00","first_seen_at":"2026-10-23T21:57:32+00:00","fetched_at":"2026-10-23T22:29:03+00:00","note":null},{"source":"epss","external_id":"CVE-2026-114618","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-114618","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-24T07:15:51+00:00","fetched_at":"2026-10-24T07:15:51+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}