Shopify App: Token exchange shop context confusion may allow cross-shop authorization bypass in affected apps
CVE-2026-63414 · GHSA-6j52-38f8-qhxr · published 29 Oct 2026
How serious is it
- Severity: high, CVSS score 7.6 out of 10.
- No exploit prediction (EPSS) score yet.
- Not on the CISA list of exploited vulnerabilities.
- No public exploit in Exploit-DB.
Is your app affected by CVE-2026-63414?
Paste this prompt into Claude Code, Cursor or any AI coding tool: it runs a free Shippable scan of your project and fixes what it finds. Built with Lovable, Bolt or v0? Scan your live app. Or upload your package file.
Who is affected
shopify_app(RubyGems) >= 22.1.0, < 23.0.3
How to check
- Run
bundle info shopify_appin your project to see the installed version, including copies pulled in by other packages. - Or paste your lockfile into the checker: it lists every package with a known vulnerability, this one included.
How to fix
Copies a prompt for Claude Code, Cursor or Codex: it checks your lockfiles for this and upgrades it.
- Upgrade
shopify_appto 23.0.3 or later, commit the lockfile and redeploy. - If a vulnerable version was live, check your logs and rotate the secrets that server could read.
The advisory
In token-exchange authenticated controllers, `shopify_app` exposes shop context through helpers such as `current_shopify_domain`. Prior to the fix, `current_shopify_domain` could resolve to the sanitized `shop` query parameter instead of the shop identity derived from the verified Shopify ID token or active Shopify session.
As a result, a request authenticated for one shop could include a different `shop` query parameter, causing application code to treat the requested shop as the current shop.
Applications that used `current_shopify_domain`, or the request `shop` parameter, for authorization decisions, tenant lookup, stored access-token selection, or shop-scoped data access may have been vulnerable to cross-shop context confusion.
The patched version hardens token-exchange handling so that:
- `current_shopify_domain` resolves to the authenticated shop from the verified token or session.
- `authenticated_shopify_domain` exposes the trusted authenticated shop.
- `requested_shopify_domain` exposes the sanitized requested `shop` parameter for bootstrap or routing use cases only.
- Token-exchange requests are rejected with `401 Unauthorized` when the requested shop does not match the authenticated shop.
## Impact
In affected applications, an attacker with a valid Shopify session token for one shop could send an authenticated request that also supplied a different `shop` query parameter. If the application relied on `current_shopify_domain` or `params[:shop]` for security-sensitive shop scoping, application code could operate in the context of the requested shop rather than the authenticated shop.
Affected applications are those that:
1. Use `shopify_app` token-exchange authentication;
2. Accept authenticated controller requests where a `shop` query parameter may be present; and
3. Use `current_shopify_domain` or the request `shop` parameter for authorization, tenant lookup, stored access-token selection, or shop-scoped resource access.
Depending on the application’s authorization model, this could result in unauthorized access to another shop’s application data or unauthorized shop-scoped actions.
## Remediation
Upgrade to `shopify_app` version `23.0.3`
## Workarounds
Applications that cannot upgrade immediately should apply equivalent validation in token-exchange authenticated controllers:
- Do not use `params[:shop]` for authorization, tenant lookup, access-token selection, or data scoping.
- On vulnerable versions, avoid relying on `current_shopify_domain` for security-sensitive shop scoping if a `shop` query parameter may be present.
- Use the authenticated shop from the verified ID token or active Shopify session instead, such as `current_shopify_session.shop` or the verified JWT `dest` value.
- If a sanitized `params[:shop]` value is present, reject the request with `401 Unauthorized` when it does not match the authenticated shop.
## Credit
This issue was responsibly reported by Hackerone researcher [leqtuer](https://hackerone.com/leqtuer?type=user).
Check your whole app
Dependencies are only half of it. Free and read-only: before you push, run npx shippable-dev scan localhost:3000 in your project folder, no account needed. For your live app, you prove it's yours with a one-line tag first.
References
- github.com/Shopify/shopify_app/security/advisories/GHSA-6j52-38f8-qhxr
- github.com/Shopify/shopify_app/releases/tag/v23.0.3
- github.com/advisories/GHSA-6j52-38f8-qhxr
Merged from GitHub Advisory Database. Last updated 30 Oct 2026. All vulnerabilities · RSS · JSON