Capgo (capgo.app) contains an incomplete access-control/content-lock enforcement issue affecting all versions; no patch is available at the time of publication. The enforce_encrypted_bundle_trigger / check_encrypted_bundle_on_insert content lock in supabase/schemas/prod.sql exempts app_versions rows whose previous storage_provider is r2-direct, so delivery-critical columns (name, app_id, session_key, key_id, storage_provider, r2_path, external_url, checksum, manifest, native_packages) remain mutable while a row is in that state. Separately, the channel/version join used by the /updates endpoint (supabase/functions/_backend/utils/pg.ts) filters only deleted versions and does not exclude r2-direct versions, so such rows remain OTA-selectable. An attacker holding a Capgo API key with bundle write/upload permission can create or keep a bundle version in the r2-direct state, assign it to a channel, and then modify these fields via direct PostgREST requests, causing altered bundle metadata (for example checksum and session_key) to be served to devices through /updates. This bypasses the post-upload content immutability hardening added for a previous app_versions metadata-tampering issue.
The product does not restrict or incorrectly restricts access to a resource from an unauthorized actor.
Access control involves the use of several protection mechanisms such as:
When any mechanism is not applied or otherwise fails, attackers can compromise the security of the product by gaining privileges, reading sensitive information, executing commands, evading detection, etc. There are two distinct behaviors that can introduce access control weaknesses: