Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain app-scoped upload/write API key or write+ account
-
DeliveryUpdate app_versions.manifest on an r2-direct version
-
ExploitBypass bundle content-lock check
-
Executionon_version_update worker inserts attacker manifest via service-role
-
PersistChannel serves poisoned download_url via /updates
-
ImpactMalicious OTA bundle delivered to end-user devices
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V8 - Authorization Privilege assignment review
|
| Exploitation Conditions | Attacker must possess an app-scoped upload/write/all API key with upload+ rights, or be an authenticated user with write+ rights on the target app. The target version must have storage_provider set to 'r2-direct', which is the specific configuration excluded from the bundle content-lock check that otherwise protects manifest integrity. Exploitation also requires that a channel points to (or can be made to point to) the crafted version so the poisoned manifest is served via /updates. Limiting factors: the requirement for pre-existing write-capable credentials (no unauthenticated path) and the r2-direct storage precondition - versions using other storage providers are not exploitable through this bypass. |
| Impact | This is a genuine high-priority integrity flaw rather than a CVSS-inflated one, though the vendor score understates the true blast radius. The vendor CVSS 4.0 vector (8.7, AV:N/AC:L/PR:L/UI:N/VC:H/VI:H/VA:H) correctly captures network reach and low attacker complexity, but scores subsequent-system impact as none (SC:N/SI:N/SA:N) despite the description stating the poisoned manifest is served to end-user devices via the /updates endpoint - that is a scope change into a downstream system, so the real severity is arguably higher than 8.7, not lower. Exploitation is NOT unauthenticated: the CVSS PR:L and the description both require either an app-scoped upload/write/all API key or an authenticated user with write+ rights on the app, so this is an authenticated privilege-abuse/confused-deputy issue (CWE-266), not the 'Authentication Bypass' the tag implies. No EPSS score, no CISA KEV listing, and no public POC are present in the input, so there is no evidence of active exploitation - priority rests on the severity of the outcome (arbitrary OTA payload delivery to app end users through a trusted service-role worker) and the fact that all versions are affected with no patch available at publication. The one meaningful limiting factor the vendor vector omits is the storage_provider='r2-direct' precondition, which narrows exploitable versions. |
| Exploit ScenarioDerived | An attacker holding a legitimate app-scoped upload/write API key (or an authenticated collaborator with write+ rights) updates the app_versions.manifest field on a version configured with storage_provider 'r2-direct', which escapes the bundle content-lock check. The on_version_update async worker trusts the attacker-supplied manifest and, using the privileged service-role Supabase client, writes attacker-controlled file_name, file_hash, and s3_path into the RLS-protected public.manifest table; once a channel points at that version, every device polling /updates receives the poisoned download_url. No public exploit code was identified at the time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 26, 2026
Authenticated principals who hold an app-scoped upload/write/all API key with upload+ rights - or any user granted write+ rights on a target app - can poison Capgo's OTA update manifest so that client devices receive attacker-controlled download URLs. The bypass works because the on_version_update async worker runs with the Supabase service-role client and implicitly trusts the manifest field of an app_versions row whose storage_provider is 'r2-direct', a configuration excluded from the bundle content-lock check; the worker then writes attacker-supplied file_name, file_hash and s3_path values into public.manifest, and once a channel points at the crafted version the /updates endpoint serves the injected record as a client-facing download_url. All versions are affected, no vendor patch was available at time of publication, and no public exploit code has been identified at time of analysis.
RemediationAI
No vendor-released patch was identified at time of analysis, so compensating controls are required: first, remove 'r2-direct' from the set of usable storage_provider values for app versions, or migrate existing r2-direct versions to a provider covered by the bundle content-lock check - the trade-off is potentially higher storage/egress cost or altered CDN behavior for those apps. Second, treat every app-scoped upload/write/all API key and every write+ app membership as a privileged credential: rotate all keys with upload+ rights and audit which users hold write+ on each app, accepting the operational disruption of key rotation. Third, restrict the ability to create or repoint channels at versions, since exploitation requires a channel to serve the crafted version via /updates. Fourth, audit public.manifest and app_versions for unexpected or recently inserted file_name, file_hash and s3_path values, particularly rows with service-role provenance that lack a corresponding content-lock verification, and monitor on_version_update worker logs for manifest inserts originating from r2-direct versions. Until an upstream fix is released, deployments that cannot drop r2-direct should treat OTA manifest integrity as externally trustable only for non-r2-direct providers; consult advisories GHSA-443r-w5p8-rhr2 and the VulnCheck advisory for updated patch status.
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Capgo is an over-the-air (OTA) update service for mobile applications built on Supabase. It defends the public.manifest table with a RESTRICTIVE row-level security policy that blocks direct user inserts; RESTRICTIVE policies are ANDed with permissive policies and therefore cannot be widened by any other policy, so direct writes are correctly denied. That control only binds roles subject to RLS - the service_role key used by the on_version_update async worker bypasses RLS entirely. The worker reads record.manifest from an app_versions row and, without re-validating it against the content-lock check, inserts the attacker-controlled file_name, file_hash and s3_path into public.manifest using the service-role client, then clears app_versions.manifest. Because versions whose storage_provider is 'r2-direct' are excluded from the bundle content-lock verification path, the integrity check that would otherwise detect manifest tampering never runs for those rows. The root cause class, CWE-266 (Incorrect Privilege Assignment), describes this privilege boundary error precisely: a low-privileged principal (an app-scoped upload+ API key holder or a write+ app user) induces a component running with service-role authority - the worker - to perform a write on their behalf, a confused-deputy pattern in which the trust boundary between the user-writable app_versions.manifest column and the trusted public.manifest table is not enforced. The vendor's CVSS 4.0 vector scores subsequent-system impact as none (SC:N/SI:N/SA:N), whereas our independent assessment rates the change of scope as changed (S:C) with high confidentiality, integrity and availability impact, reflecting the downstream reach of a poisoned OTA update channel; the storage_provider='r2-direct' precondition and the requirement for pre-existing write-capable credentials are the primary limiting factors.
Know when Cap Go 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
PR:L for the required upload/write credential; S:C because the poisoned manifest crosses into end-user devices; C/I/A:H as arbitrary OTA payload can fully compromise the delivered app content.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
Capgo (capgo.app) blocks direct user inserts into the public.manifest table with a RESTRICTIVE row-level security policy, but that restriction can be bypassed indirectly. A principal holding an app-scoped upload/write/all API key (upload+ rights) or an authenticated user with write+ rights on an app can update public.app_versions.manifest on a version whose storage_provider is 'r2-direct', which is not covered by the bundle content-lock check. The on_version_update async worker trusts record.manifest and, using the service-role Supabase client, inserts the attacker-controlled file_name, file_hash, and s3_path into public.manifest before clearing app_versions.manifest. When a channel points to the crafted version, the /updates endpoint returns the service-role-created manifest entry as a client-facing download_url, enabling OTA manifest poisoning through a trusted async worker path. All versions are affected; no patch was available at the time of publication.
Technical POC Analysis
CWE-266 (Incorrect Privilege Assignment), not a memory-safety bug.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Capgo's over-the-air update delivery pipeline can be manipulated so that customer mobile devices are pointed at attacker-controlled download locations, and the flaw applies to all released versions of the product. Because OTA updates push executable code directly to end-user devices, this exposes the software supply chain for every application distributed through Capgo and could result in malicious code reaching customers' users without their knowledge. Leadership should care because there is currently no vendor patch, meaning exposure can only be reduced by tightening internal credential and release-management practices rather than by upgrading.
No vendor-released patch identified at time of analysis. Interim mitigations: restrict and rotate all Capgo API keys holding upload/write/all scopes to least privilege; audit and revert app_versions rows using storage_provider 'r2-direct' and their corresponding public.manifest entries against known-good hashes; disable the r2-direct storage provider if not required; pin channels to previously validated versions and block new promotions until review; alert on on_version_update worker and /updates endpoint activity; enforce client-side bundle content-lock or signature verification before installation.
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
Affected Products (CPE)CVE.org
Improper access control in Capgo (capgo.app) lets any holder of an ordinary full API key forge a trusted SSO provider by
Authorization bypass in Capgo (capgo.app), a live-update/OTA platform for Capacitor mobile apps, allows a de-provisioned
Account pre-registration hijack in Capgo before 12.128.2 lets a remote unauthenticated attacker claim an account under a
Authentication bypass in Capgo prior to version 12.128.2 lets attackers defeat email-based OTP verification by tampering
Cross-tenant data poisoning in Supabase Capgo before 12.128.2 allows remote unauthenticated attackers to corrupt billing
Unauthenticated retrieval of deleted over-the-air update bundles from capgo.app through version 12.129.0 is possible via
Capgo's direct exposure of the public.org_users table through Supabase PostgREST lets an authenticated user who already
Cross-tenant metadata modification in Capgo before 12.244.1 allows an authenticated attacker to alter image object metad
Privilege escalation in the Capgo (capgo.app) backend through version 12.242.4 allows an authenticated API key holder to
Privilege escalation in Capgo (capgo.app) before 12.267.1 allows a principal holding the apikey_manager role to rotate a
Authenticated administrators on Capgo (capgo.app) can grant channel-scoped permissions to non-member users because the p
Capgo's MFA enforcement is defeated by an authentication assurance level (AAL) mismatch across two distinct code paths:
EUVD-2026-87714
GHSA-xj78-q428-xww2
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB