Shopify App: Token exchange shop context confusion may allow cross-shop authorization bypass in affected apps
Impact
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.
Source excerpt · OSVAffected packages
Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.
| Affected range | Recorded fix |
|---|---|
| From 22.1.0 before 23.0.3Ecosystem versions | 23.0.3 |
Version evidence: OSV · GHSA-6j52-38f8-qhxr
View original version evidence (12 explicit versions)
Affected products
Vendor version evidence. Product records are separate from automatic dependency matching.
Shopify · GitHub_M
shopify_app
1 range
Shopify · GitHub_M
shopify_app
Compare with this publisher’s ranges. This does not inspect your installation.
affected
>= 22.1.0, < 23.0.3
Other versions: unknown
Original source description
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_domainresolves to the authenticated shop from the verified token or session.authenticated_shopify_domainexposes the trusted authenticated shop.requested_shopify_domainexposes the sanitized requestedshopparameter for bootstrap or routing use cases only.- Token-exchange requests are rejected with
401 Unauthorizedwhen 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:
- Use
shopify_apptoken-exchange authentication; - Accept authenticated controller requests where a
shopquery parameter may be present; and - Use
current_shopify_domainor the requestshopparameter 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_domainfor security-sensitive shop scoping if ashopquery parameter may be present. - Use the authenticated shop from the verified ID token or active Shopify session instead, such as
current_shopify_session.shopor the verified JWTdestvalue.- If a sanitized
params[:shop]value is present, reject the request with401 Unauthorizedwhen it does not match the authenticated shop.
- If a sanitized
Credit
This issue was responsibly reported by Hackerone researcher leqtuer.
Inside the record
Evidence available
Describes the evidence in this view, not whether the product is safe.
Original records
CVE-2026-63414View the latest unmodified CVE JSON from the official source. It may be newer than this imported page.
cve.new JSON →Underlying weaknesses
The source’s classification of what caused the vulnerability.
Contributing organizations · 1
Assigning organization
What changed
Follow changesLarge field values are marked as truncated previews. Original source snapshots remain retained.