{"items":[{"id":"NVI-00013823","kind":"vulnerability","title":"Tina: [Broken Access Control] letting any TinaCloud user authorize against any self-hosted site","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-g74q-6g2f-874x","CVE-2026-63506"],"plain_summary":"GitHub lists this reviewed advisory for @tinacms/auth, next-tinacms-azure. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-0b29e6e9f0f856201a778eead29df7fc"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[{"kind":"CVSS","as_of":"2026-09-17T14:59:01.000Z","value":"8.8 high","meaning":"GitHub source severity; exploitability and local consequence require separate evidence.","source_id":"sr-0b29e6e9f0f856201a778eead29df7fc"}],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-0b29e6e9f0f856201a778eead29df7fc","url":"https://github.com/advisories/GHSA-g74q-6g2f-874x","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-g74q-6g2f-874x","publisher":"GitHub Advisory Database","observed_at":"2026-11-01T19:09:30.244Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-0b29e6e9f0f856201a778eead29df7fc"],"technology":"@tinacms/auth","known_exclusions":[],"conditions_summary":"## Summary\n \n`@tinacms/auth`'s `isAuthorized(req)` decides authorization by validating the caller's bearer token against `https://identity.tinajs.io/v2/apps/${req.query.clientID}/currentUser`, where the `clientID` comes from the request and is never compared to the site's own configured TinaCloud app id. The function answers \"is this token a verified user of whatever app the caller named?\" instead of \"is this token a verified user of THIS site?\"\n \nAny TinaCloud user can create their own free app, get a valid token for it, and send `?clientID=` plus `Authorization: ` to a victim self-hosted site. The victim's `authorized` callback runs `const user = await isAuthorized(req); return user && user.verified`, which returns `true`, and the victim authorizes the attacker.\n \nThe attacker holds no account on the victim and needs no victim interaction. With the media handlers this grants read, upload, and delete on the victim's media bucket. When the backend uses `TinaCloudBackendAuthProvider()` (the default the `tinacms init` wizard generates for TinaCloud auth), it grants full GraphQL read, write, and delete of the victim's content.\n\n## Affected code (confirm","public_affected_ranges":["<= 1.1.3"]},{"certainty":"source_listed","source_ids":["sr-0b29e6e9f0f856201a778eead29df7fc"],"technology":"next-tinacms-azure","known_exclusions":[],"conditions_summary":"## Summary\n \n`@tinacms/auth`'s `isAuthorized(req)` decides authorization by validating the caller's bearer token against `https://identity.tinajs.io/v2/apps/${req.query.clientID}/currentUser`, where the `clientID` comes from the request and is never compared to the site's own configured TinaCloud app id. The function answers \"is this token a verified user of whatever app the caller named?\" instead of \"is this token a verified user of THIS site?\"\n \nAny TinaCloud user can create their own free app, get a valid token for it, and send `?clientID=` plus `Authorization: ` to a victim self-hosted site. The victim's `authorized` callback runs `const user = await isAuthorized(req); return user && user.verified`, which returns `true`, and the victim authorizes the attacker.\n \nThe attacker holds no account on the victim and needs no victim interaction. With the media handlers this grants read, upload, and delete on the victim's media bucket. When the backend uses `TinaCloudBackendAuthProvider()` (the default the `tinacms init` wizard generates for TinaCloud auth), it grants full GraphQL read, write, and delete of the victim's content.\n\n## Affected code (confirm","public_affected_ranges":["<= 15.0.0"]}],"null_published_at":"2026-11-02T10:00:37.155Z","source_updated_at":"2026-09-17T14:59:01.000Z","source_disclosed_at":"2026-09-17T14:59:00.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-11-01T19:09:30.244Z"}],"next_cursor":null,"snapshot_revision":"42594"}