Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain tenant-signed JWT with string exp claim
-
DeliveryPOST to REST /api/broadcast endpoint
-
ExploitExpired-token check bypassed via binary>integer ordering
-
ExecutionServer returns 202 and emits message
-
ImpactAttacker message delivered to subscribers
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V7 - Session Management Session expiration enforcement
|
| Exploitation Conditions | Exploitation requires a JWT validly signed with the tenant secret whose 'exp' (and the fix also addresses 'iat') claim is encoded as a JSON string instead of a JSON number; the string decodes to an Elixir binary that sorts greater than any integer time, so the expiry predicate wrongly passes. It affects ONLY the REST broadcast authorization path (RealtimeWeb.AuthTenant / secure_tenant_api on /api/broadcast); the realtime channel-join path (RealtimeChannel.confirm_token/1) is NOT affected because it has an additional is_integer(exp) guard. Limiting factors: signature verification and tenant-secret selection still apply, a configured role validator is not bypassed, only Supabase Realtime versions <= 2.102.2 are vulnerable, and the resulting impact of broadcasting messages is application specific. The exact means by which an attacker obtains a string-exp signed token is not described in the available sources. |
| Impact | All signals point to a genuinely low-priority issue rather than a high-CVSS/low-real-risk mismatch. The CVSS 3.1 base score is 3.1 (Low) with vector AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N: network-reachable but high attack complexity, requires some privilege, and yields only limited integrity impact (C:N, A:N). The vuln.today Decision label is 'monitor,' consistent with that low severity. No EPSS score, no CISA KEV listing, and no public exploit are present in the input, so there is no evidence of active or likely exploitation. Exploitation status: no public exploit identified at time of analysis (the only references are the GHSA advisory, PR #1934, the fix commit, and the v2.103.1 release - all remediation artifacts, not PoC/exploit code). One conflict must be flagged: the description calls this an 'unauthenticated attacker' issue, but the GHSA advisory explicitly states that signature verification and tenant-secret selection still apply and that a configured role validator is not bypassed - meaning the attacker needs a JWT validly signed with the tenant secret. Treat the 'unauthenticated' wording with caution; the PR:L metric and the advisory are the more reliable signal. The real-world impact is explicitly 'application specific,' further lowering generalized risk. |
| Exploit ScenarioDerived | An actor holding a tenant JWT whose 'exp' claim is encoded as a JSON string (rather than a number) sends it to the REST broadcast endpoint after that timestamp has passed; the inconsistent expiry check accepts it, returns HTTP 202, and relays the actor's message to all channel subscribers. Because the integrity impact is application specific, the consequence depends on how subscribers act on broadcast content. No public exploit was identified in the input, and the high attack complexity (AC:H) reflects the unusual string-encoded 'exp' token condition required. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 22, 2026
Supabase Realtime versions up to and including 2.102.2 accept an expired JWT on its REST broadcast endpoint when the token's exp claim is encoded as a JSON string rather than a JSON number, allowing a token holder to keep publishing broadcast messages to subscribers after the stated expiry. Only the REST /api/broadcast authorization path is affected - the WebSocket channel-join path already rejects the same token because it additionally type-checks exp as an integer - and signature verification against the tenant secret, tenant-secret selection and any configured role validator still apply, so the real impact is limited to message injection whose consequences are application specific. The issue is rated low severity (CVSS 3.1, PR:L/AC:H), no public exploit code was identified at the time of analysis, and the fix ships in version 2.103.1.
RemediationAI
Vendor-released patch: upgrade Supabase Realtime to 2.103.1 or later (release https://github.com/supabase/realtime/releases/tag/v2.103.1), which enforces numeric exp and iat claims before the token is treated as authenticated; the change is carried by PR https://github.com/supabase/realtime/pull/1934 and commit ac229d7eff2798b12b994e07bdd64f5e9b56374a, with the advisory at https://github.com/supabase/realtime/security/advisories/GHSA-hg9h-6mhq-6c2v. If an immediate upgrade is not possible, note that signature verification with the tenant secret is still enforced, so rotating that tenant JWT secret invalidates any previously issued string-exp tokens - at the cost of invalidating all legitimate sessions and requiring clients to obtain fresh tokens - and that any configured role validator continues to constrain which roles can reach the route. Because the flaw only affects the REST broadcast path and not channel joins, reviewing and restricting which clients are issued tenant tokens with broadcast privileges limits exposure while the upgrade is scheduled. No public exploit code was identified at the time of analysis and the issue is assessed as monitor-priority, so remediation can follow the normal patch cycle.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Supabase Realtime is an Elixir/Phoenix service that delivers Broadcast, Presence and Postgres Changes over WebSockets, and it also exposes REST broadcast endpoints secured by tenant-issued JWTs verified with the Joken library. In RealtimeWeb.JwtVerification.JwtAuthToken.token_config/0 the expiry claim was validated with a bare comparison, add_claim(claims, "exp", nil, &(&1 > current_time)), against integer system time. A JWT whose exp is a JSON string decodes to an Elixir binary, and in Erlang term ordering any binary sorts greater than any integer, so the predicate returns true even when the string encodes a timestamp long in the past; the subsequent claim-rounding code only normalises numeric values and leaves strings untouched. RealtimeWeb.AuthTenant, used by the /api/broadcast route through secure_tenant_api, accepts any successful ChannelsAuthorization.authorize_conn/3 result, so the expired string-exp token is authenticated and the request returns 202 while the broadcast is emitted to subscribers. RealtimeChannel.confirm_token/1 carries an extra is_integer(exp) guard, which is why the channel-join socket path was never affected. The root cause maps to CWE-613 (Insufficient Session Expiration): a session credential outlives its declared lifetime because the claim type is not enforced. The upstream fix adds is_number/1 checks to the exp comparison, rejects non-numeric iat claims, and tightens the error-clause match in channels_authorization.ex.
Know when Realtime gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
Signature verification still applies so a tenant-signed token is needed (PR:L); the atypical string-encoded exp condition raises AC:H; only limited message-injection integrity impact, so C:N/I:L/A:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Supabase Realtime provides Broadcast, Presence, and Postgres Changes via WebSockets. Prior to version 2.103.1, the REST broadcast endpoints accept an expired JWT when the exp claim is encoded as a JSON string instead of a JSON number. The same route rejects an expired integer exp token signed with the same tenant secret. The accepted request returns 202 and emits the broadcast to subscribers. This could allow an unauthenticated attacker can broadcast realtime messages to subscribers. The attack can be performed via the Internet/only from within the supabase project. The impact of broadcasting messages to subscribers is application specific. This issue has been patched in version 2.103.1.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
EUVD-2026-108263
NVD
CVE.org
EPSS
GitHub
Exploit-DB