Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as org admin (org.update_settings)
-
DeliverySend direct PostgREST UPDATE to public.orgs
-
ExploitRLS UPDATE policy permits full-row write
-
ExecutionNull or corrupt customer_id billing pointer
-
ImpactPlan/billing checks fail, org downgraded to unpaid/no-plan
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization logic validation
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated user who is an organization admin holding the org.update_settings permission but lacking org.update_billing, and requires the attacker to bypass the official organization/put.ts endpoint by issuing an UPDATE directly to the Supabase PostgREST API. The vulnerability exists because the row-level security UPDATE policy on public.orgs authorizes a full-row write instead of restricting to the allowlisted settings columns, so customer_id is writable. Limiting factors: exploitation is confined to the attacker's own organization, needs pre-existing admin-level credentials (PR:H), causes no data disclosure, and affects only billing/plan state (nulling/corrupting the Stripe pointer) rather than the broader system. |
| Impact | This is a genuine but modest-severity broken-authorization (CWE-863) flaw, not a high-urgency threat. The vendor CVSS 4.0 vector (CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:L/VA:H) scores 7.0, but that HIGH rating is driven almost entirely by VA:H, which I assess as generous: the actual effect is corruption of a single billing-pointer column (customer_id) within the attacker's OWN organization, degrading paid-plan state rather than causing broad availability loss. PR:H is correct and important - exploitation requires an authenticated organization admin already holding org.update_settings, so this is an insider privilege-separation / separation-of-duties bypass (an admin acting beyond org.update_billing), not remote-unauthenticated compromise. No confidentiality impact (VC:N/C:N). There is NO EPSS score, NO CISA KEV listing, and no public exploit identified at time of analysis; exploitation requires only a direct PostgREST call, so it is technically trivial for someone who already has admin access, but the trust/privilege prerequisite sharply limits real-world risk. Note the input Tag 'Authentication Bypass' conflicts with CWE-863 and the description - this is an authorization/access-control failure, not authentication bypass. Net: real defect worth patching for billing-integrity and separation-of-duties, but low operational priority given PR:H, single-org scope, and absence of exploitation signals. |
| Exploit ScenarioDerived | An authenticated organization admin in a Capgo tenant who holds org.update_settings but NOT org.update_billing sends an UPDATE request directly to the Supabase PostgREST API against public.orgs, bypassing the official put.ts endpoint's field allowlist, and nulls or corrupts the customer_id Stripe pointer. Because plan/billing checks trust orgs.customer_id, the organization silently drops from its valid paid-plan state to unpaid/no-plan behavior. No public exploit code is identified, but the attack is a single direct API call requiring no special tooling. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 26, 2026
Authenticated organization admins in capgo.app can corrupt the organization's Stripe billing pointer (customer_id) by sending a direct UPDATE to the Supabase PostgREST API, bypassing the official organization update endpoint that excludes this column. The flaw requires an org admin with org.update_settings but without org.update_billing, and only affects the attacker's own organization's plan/billing state, not broader system data. No vendor patch was available at the time of the advisory, and no public exploit code has been identified.
RemediationAI
No vendor-released patch was identified at time of analysis. Until a fix is available, self-hosted deployments should modify the row-level security (RLS) UPDATE policy on public.orgs to restrict which columns can be modified-for example, by replacing the permissive UPDATE policy with a column-level policy or a BEFORE UPDATE trigger that prevents changes to customer_id unless the requester holds org.update_billing permission. Alternatively, revoke direct UPDATE permission on the orgs table from the authenticated role and force all updates through the official endpoint. These controls may break legitimate billing updates if not scoped carefully; test in a staging environment first. Monitor Supabase audit logs for unexpected changes to customer_id. Administrators should follow the vendor advisory at https://github.com/Cap-go/capgo.app/security/advisories/GHSA-qp5h-v7x3-53cq for a patched version.
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.app is an over-the-air (OTA) update platform for Capacitor-based mobile apps. The underlying data layer is Supabase, which exposes PostgreSQL via PostgREST, a RESTful API that maps HTTP requests to database operations. The vulnerability is CWE-863 (Incorrect Authorization): the row-level security (RLS) UPDATE policy on the public.orgs table authorizes a full-row write for any org admin holding org.update_settings, rather than restricting the write to the allowlisted settings columns. Although the official endpoint (supabase/functions/_backend/public/organization/put.ts) explicitly excludes customer_id from its allowlist, and the private Stripe billing route requires org.update_billing, an attacker can still mutate customer_id by issuing an UPDATE directly to PostgREST. The affected CPE is cpe:2.3:a:cap-go:capgo.app:*:*:*:*:*:*:*:* (all versions prior to a fix).
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:H/UI:N/VC:N/VI:L/VA:H/SC:N/SI:N/SA:N
PR:H because an org admin role is required; C:N as no data is exposed; I:L for billing-pointer corruption and A:L for the resulting paid-plan degradation limited to one org.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
capgo.app is an over-the-air update platform for Capacitor apps. In all versions prior to a fix, the row-level security UPDATE policy on the public.orgs table permits an organization admin (a user holding org.update_settings) to update the entire row, including the internal billing pointer column customer_id. The official organization update endpoint (supabase/functions/_backend/public/organization/put.ts) allowlists only a small set of editable settings fields and excludes customer_id, and the private Stripe billing route separately requires the org.update_billing permission. By sending an update directly to Supabase PostgREST, an authenticated org admin without org.update_billing can null or corrupt the organization's Stripe customer pointer, causing plan and billing checks that trust orgs.customer_id to fail and moving the organization from a valid paid plan state to unpaid/no-plan behavior. At the time of the advisory no patched version was available.
Technical POC Analysis
Evidence base: GitHub advisory GHSA-qp5h-v7x3-53cq.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A privilege-boundary flaw in capgo.app, a live-update platform for Capacitor mobile apps, allows organization administrators to alter their organization's Stripe billing pointer through a direct database API call rather than the sanctioned update endpoint. The exposure is contained to the acting administrator's own organization - billing and plan state can be corrupted or misdirected, but no other tenants' data or platform-wide systems are reachable. Leadership should care because billing integrity and revenue reconciliation for affected accounts may be silently wrong, and because the flaw signals a gap in how column-level permissions are enforced across the platform's API surface.
No vendor-released patch identified at time of analysis. Interim mitigations: enforce row-level security and column-level grants on the organizations table so customer_id cannot be modified via direct PostgREST UPDATE; restrict changes to customer_id to the official organization update endpoint through a server-side trigger or validation rule; revoke org.update_settings from administrators who do not also hold org.update_billing; monitor and alert on direct UPDATE calls to the organizations table; and reconcile organizations.customer_id values against Stripe records on a recurring basis to detect tampering.
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
Account pre-registration hijack in Capgo before 12.128.2 lets a remote unauthenticated attacker claim an account under a
Improper access control in Capgo (capgo.app) lets any holder of an ordinary full API key forge a trusted SSO provider by
Authentication bypass in Capgo prior to version 12.128.2 lets attackers defeat email-based OTP verification by tampering
Authorization bypass in Capgo (capgo.app), a live-update/OTA platform for Capacitor mobile apps, allows a de-provisioned
Cross-tenant data poisoning in Supabase Capgo before 12.128.2 allows remote unauthenticated attackers to corrupt billing
Unauthenticated denial of service in Cap-go capgo (capgo-backend) before 12.128.12 allows remote attackers to exhaust Po
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
Authenticated principals who hold an app-scoped upload/write/all API key with upload+ rights - or any user granted write
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
EUVD-2026-87711
GHSA-455x-98vm-63r8
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB