ETK-2026-3770Zero's internal tracking ID, independent of the CVE number.
waiting for further signalsZero needs more public information before it can validate it.description
Supabase Storage versions 1.89.8 and earlier can bypass row-level security when processing a valid signed JWT whose role claim is none. An attacker with such a token may read private objects, upload objects, or create buckets when the Storage connection user owns the relevant tables and row-level security is not forced; obtaining the token requires a trusted issuer to emit that role.
mitigation
Upgrade Supabase Storage to version 1.89.9 or later. Until upgraded, stop trusted token issuers from issuing the none role and reject that role at every Storage entry point, including any direct origin access.
fixed in 1.89.9
outcome
Contextual, not validated: no deterministic check could cover this one, and no technique passed our review.
source signals
Public signals that triggered or updated the pipeline. These are inputs for the deltas above.
- 2026-11-06 22:44Zghsa: trigger signal, started the run
this entry in the feed
GET /api/v1/feed/ETK-2026-3770
{ "etk_id": "ETK-2026-3770", "cve_id": null, "display_id": "ETK-2026-3770", "ghsa_id": "GHSA-fgvp-cqg6-q8h2", "euvd_id": null, "status": "published", "anchor_state": "awaiting_cve", "title": "JWT role row-level security bypass in Supabase Storage", "summary": "Supabase Storage versions 1.89.8 and earlier can bypass row-level security when processing a valid signed JWT whose role claim is `none`. An attacker with such a token may read private objects, upload objects, or create buckets when the Storage connection user owns the relevant tables and row-level security is not forced; obtaining the token requires a trusted issuer to emit that role.", "mitigation": "Upgrade Supabase Storage to version 1.89.9 or later. Until upgraded, stop trusted token issuers from issuing the `none` role and reject that role at every Storage entry point, including any direct origin access.", "vendor": null, "product": "Supabase Storage", "affected": [ { "affected_notes": [], "affected_ranges": [ "<= 1.89.8" ], "ecosystem": null, "fixed_versions": [ "1.89.9" ], "package_name": null, "purl": null } ], "cwes": [ 270 ], "cvss_score": 9.8, "cvss_src": "cna_vendor", "cvss_vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "epss_score": null, "epss_percentile": null, "epss_asof": null, "automation": "contextual", "check": false, "check_confidence_basis": null, "exploit": false, "pipeline_minutes": 9.90883165, "t0_at": null, "signals": { "trigger_signal": { "at": "2026-11-06T22:44:47+00:00", "days": -1.0908327304282408, "is_lower_bound": true, "measured_at": "2026-11-08T00:55:34.985612+00:00", "url": "https://github.com/supabase/storage/security/advisories/GHSA-fgvp-cqg6-q8h2" } } }
published 2026-11-06 23:05Z
last change 2026-11-08 00:54Z
Need the technical details behind an entry?
Every entry here shows what we attempted and when. The technical details, the generated exploit that fired it and the evidence behind the verdict are not public. Tell us about your use case and we’ll get back to you about extended API access.