{"description":"Trending threats, MITRE ATT\u0026CK coverage, and detection metadata. Fed continuously.","feed_url":"https://feed.craftedsignal.io/tags/centrifugo/feed.json","home_page_url":"https://feed.craftedsignal.io/","items":[{"_cs_actors":[],"_cs_cpes":[],"_cs_cves":[],"_cs_exploited":false,"_cs_has_poc":false,"_cs_poc_references":[],"_cs_products":["Centrifugo v6"],"_cs_severities":["critical"],"_cs_tags":["authentication-bypass","jwt","jwks","centrifugo","web-application"],"_cs_type":"advisory","_cs_vendors":["Centrifugal"],"content_html":"\u003cp\u003eA severe authentication bypass vulnerability affects Centrifugo v6, a real-time messaging server, specifically within its dynamic JSON Web Key Set (JWKS) endpoint feature. This flaw, not yet assigned a CVE, enables an attacker to gain unauthorized access to one tenant's resources by exploiting a valid token from a separate, distinct tenant. The vulnerability stems from Centrifugo's JWKS key cache and \u003ccode\u003esingleflight\u003c/code\u003e mechanism, which are keyed solely by the \u003ccode\u003ekid\u003c/code\u003e (key ID) value from a JWT header, rather than a combination of the \u003ccode\u003ekid\u003c/code\u003e and the resolved JWKS endpoint, issuer, or audience. This design oversight means that if an attacker can ensure their issuer's key, sharing a \u003ccode\u003ekid\u003c/code\u003e with another target tenant, is cached first, they can forge JWTs for users within the target tenant. This leads to unauthorized connection and subscription token acceptance, posing a significant risk to multi-tenant Centrifugo deployments using dynamic JWKS configurations.\u003c/p\u003e\n\u003ch2 id=\"attack-chain\"\u003eAttack Chain\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eInitial Token Acquisition\u003c/strong\u003e: An attacker obtains or mints a valid JWT for an authorized issuer/tenant (e.g., Tenant A) with a specific \u003ccode\u003ekid\u003c/code\u003e value in its header. This JWT is signed by Tenant A's private key.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCache Priming (Tenant A)\u003c/strong\u003e: The attacker presents Tenant A's valid JWT to the Centrifugo server, triggering the dynamic JWKS endpoint to fetch Tenant A's public key corresponding to the JWT's \u003ccode\u003ekid\u003c/code\u003e. This public key is then stored in Centrifugo's JWKS cache, indexed only by the \u003ccode\u003ekid\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eToken Forgery (Tenant B)\u003c/strong\u003e: The attacker crafts a new JWT, claiming to be a user in a different target issuer/tenant (e.g., Tenant B), but importantly, uses the \u003cem\u003esame \u003ccode\u003ekid\u003c/code\u003e\u003c/em\u003e value in the header and signs it with \u003cem\u003eTenant A's private key\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eForged Token Presentation\u003c/strong\u003e: The attacker presents this forged Tenant B JWT to the Centrifugo server for authentication (e.g., connection or subscription verification).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eVulnerable Cache Lookup\u003c/strong\u003e: Centrifugo attempts to verify the forged Tenant B JWT. When performing the JWKS key lookup, it queries its cache using only the \u003ccode\u003ekid\u003c/code\u003e from the forged token.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCross-Tenant Key Reuse\u003c/strong\u003e: Because the \u003ccode\u003ekid\u003c/code\u003e matches the key previously cached for Tenant A, Centrifugo retrieves and uses Tenant A's public key (instead of Tenant B's intended key) to verify the forged Tenant B token.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAuthentication Bypass\u003c/strong\u003e: Since the forged token was signed by Tenant A's private key and verified by Tenant A's public key (due to the cache hit), the verification succeeds, granting the attacker unauthorized access as the claimed user in Tenant B.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eImpact\u003c/strong\u003e: The attacker achieves unauthorized connection or subscription to Tenant B's services, leading to data exposure, unauthorized actions, and compromise of integrity or confidentiality within the target tenant.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"impact\"\u003eImpact\u003c/h2\u003e\n\u003cp\u003eThis vulnerability results in a cross-issuer/cross-tenant JWT authentication bypass in Centrifugo deployments configured to use dynamic JWKS endpoints. The primary impact is unauthorized access, allowing an attacker who can acquire or forge a token for one tenant to impersonate users in another tenant if both share a \u003ccode\u003ekid\u003c/code\u003e value and the attacker's key is cached first. This directly compromises the integrity of connection and subscription token verification. Consequences include unauthorized user authentication within a different namespace and potential cross-tenant confidentiality and integrity breaches, as the server incorrectly trusts tokens across isolated trust domains, particularly in multi-tenant environments where \u003ccode\u003eiss\u003c/code\u003e or \u003ccode\u003eaud\u003c/code\u003e claims are used to derive dynamic JWKS URLs.\u003c/p\u003e\n\u003ch2 id=\"recommendation\"\u003eRecommendation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePatch Centrifugo\u003c/strong\u003e: Immediately apply any available patches or updates from the vendor (Centrifugal) that address this JWKS caching vulnerability.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReview JWKS Configuration\u003c/strong\u003e: Reconfigure Centrifugo to avoid dynamic JWKS endpoint templates that rely solely on \u003ccode\u003ekid\u003c/code\u003e for key identification across different trust domains, if a patch is not immediately available.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAudit JWKS \u003ccode\u003ekid\u003c/code\u003e Usage\u003c/strong\u003e: Review all JWKS documents for Centrifugo deployments to ensure that \u003ccode\u003ekid\u003c/code\u003e values are unique across all potential issuer/audience configurations, if dynamic JWKS is used.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSegment Multi-Tenant Environments\u003c/strong\u003e: Implement network and logical segmentation between tenants to limit the blast radius in case of a successful authentication bypass.\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2026-07-03T12:28:16Z","date_published":"2026-07-03T12:28:16Z","id":"https://feed.craftedsignal.io/briefs/2026-07-centrifugo-jwks-auth-bypass/","summary":"A critical authentication bypass vulnerability exists in Centrifugo v6's dynamic JWKS endpoint feature, allowing an attacker to bypass JWT authentication for one tenant by leveraging a valid token from another tenant due to incorrect JWKS key caching indexed only by the `kid`.","title":"Centrifugo JWKS Cache Authentication Bypass","url":"https://feed.craftedsignal.io/briefs/2026-07-centrifugo-jwks-auth-bypass/"}],"language":"en","title":"CraftedSignal Threat Feed - Centrifugo","version":"https://jsonfeed.org/version/1.1"}