Skip to main content

Supabase Realtime EUVDEUVD-2026-108263

| CVE-2026-54238 LOW
Insufficient Session Expiration (CWE-613)
2026-10-22 GitHub_M
3.1
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain tenant-signed JWT with string exp claim
  2. Delivery
    POST to REST /api/broadcast endpoint
  3. Exploit
    Expired-token check bypassed via binary>integer ordering
  4. Execution
    Server returns 202 and emits message
  5. Impact
    Attacker 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.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

realtime < 2.103.1

Affected Packages

euvd realtime fix: 2.103.1

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

Vendor (GitHub_M) PRIMARY 3.1 LOW
AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
vuln.today AI 3.1 LOW

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.

3.1 AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
4.0 AV:N/AC:H/AT:N/PR:L/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
High
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
None

Lifecycle Timeline

1
Patch available
Oct 22, 2026 - 18:18 EUVD

DescriptionCVE.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

EPSS Score
0.2%
Top 90% exploitable
Prevalence
Medium
popular backend-as-a-service realtime component, significant but not universal deployment
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity LOW
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Defer
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact· derived
Low

Priority Score

16
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +16
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy