Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privilege read_customers staff
-
ExploitRequest /cpanel/customers/{id}/show
-
ExecutionSubstitute admin/staff user ID bypassing customers scope
-
ImpactDisclose staff profile and enumerate accounts via 200/403/404
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Requires an authenticated admin-panel session holding both access_dashboard and read_customers; no view_users permission is needed, which is precisely the boundary being bypassed. No special product configuration is required - the flaw is present in Show.php's default code path because mount() calls findOrFail($user) without the customers() role scope that the listing page applies. Exploitation is limited by the need for valid low-privileged staff credentials (PR:L, so not remotely unauthenticated) and is confined to deployments of Shopper < 2.10.1 that have staff/customer accounts in the same user table. The destructive extension via anonymizeAction() is further gated: it additionally requires the attacker's role to hold delete_customers. |
| Impact | Signals point to a real but moderate, insider-driven risk rather than an internet-wide emergency. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/C:H/I:N/A:N, 6.5) shows the flaw is network-reachable and trivial to trigger (just change a numeric ID in the URL) but requires an authenticated admin-panel session holding access_dashboard and read_customers - so the threat model is a low-privileged staff member or a compromised staff account, not an anonymous remote attacker. The vuln.today Decision label is this_month (not act_now/emergency), consistent with a privilege-requiring authorization bug. No EPSS score and no CISA KEV entry are present in the input, so there is no evidence of mass or active exploitation; the exploitation signal that does exist is a detailed step-by-step reproduction PoC embedded in the GHSA advisory (login, blocked /cpanel/setting/team, then successful /cpanel/customers/1/show against the admin). The one divergence worth verifying: NVD rates confidentiality C:H, but the exposed asset is per-record account profile data (name, email, addresses) retrievable one ID at a time with enumeration - closer to C:L in my independent read - so the 6.5 figure likely slightly overstates the single-request confidentiality loss while the enumeration and the conditional destructive anonymize path (needs delete_customers) justify treating it as a genuine authorization-boundary break. Net: prioritize for the next patch cycle, especially where multiple distinct staff roles exist, but it is not a drop-everything remote-unauth issue. |
| Exploit ScenarioDerived | A staff user provisioned with only access_dashboard and read_customers (and correctly denied the /cpanel/setting/team interface because they lack view_users) logs into the admin panel and simply changes the {user} ID in /cpanel/customers/{user}/show to 1, retrieving the administrator's profile (e.g. admin@admin.com) and then enumerating every account by observing differing 200/403/404 responses. A full reproduction PoC exists in the GHSA advisory, though it is a manual walkthrough rather than a packaged standalone exploit. If that same role also holds delete_customers, the attacker can invoke anonymizeAction() against the loaded non-customer account for destructive follow-up. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 30, 2026
Shopper versions prior to 2.10.1 expose administrator and staff profile records to low-privileged admin-panel users through an insecure direct object reference in the customer detail route /cpanel/customers/{user}/show. Any account holding access_dashboard and read_customers can substitute an arbitrary user ID and receive profile data for accounts that the separate team-management interface protects behind the stronger view_users permission; differing 200/403/404 responses also permit user-ID enumeration, and if the same role holds delete_customers the anonymizeAction() may operate on the unrestricted loaded user model. Exploitation requires a valid authenticated staff session (PR:L) and same-table staff/customer accounts, and the vendor advisory ships a step-by-step proof-of-concept reproduction; the trigger is an ordinary authenticated request with a modified URL path segment rather than any special product configuration.
RemediationAI
Upgrade to Shopper 2.10.1, which applies the missing customers() scope to the detail query and adds a regression test covering staff-account access (see the advisory at https://github.com/shopperlabs/shopper/security/advisories/GHSA-w7mm-g5pr-gpff and release https://github.com/shopperlabs/shopper/releases/tag/v2.10.1). If upgrading immediately is not possible, backport the one-line change from https://github.com/shopperlabs/shopper/pull/594 so that Show::mount() chains ->customers() before findOrFail($user); this is low-risk because it only narrows the query to the role the listing already enforces, though it will cause non-customer IDs to return not-found instead of data. As a compensating control, audit roles holding read_customers and remove the permission from staff who do not need the customer area - the trade-off is that those users lose all customer detail access, and this does not remediate the destructive anonymizeAction() path, which additionally requires delete_customers; removing that permission from non-administrative roles eliminates the destructive follow-up but also disables legitimate customer anonymization for those staff.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Shopper is a Laravel-based headless e-commerce admin panel that uses Livewire components and the Spatie permission package for role-based access control. The affected code is packages/admin/src/Livewire/Pages/Customers/Show.php, whose mount(int $user) method calls $this->authorize('read_customers') and then performs $userModel::query()->with(['addresses','orders'])->findOrFail($user) - a lookup keyed entirely by the attacker-controllable {user} route segment. The customer listing in Customers/Index.php correctly constrains results with ->scopes('customers'), and the customers scope filters on the configured customer role via whereHas('roles', ...), but that scope was never applied on the detail page. The staff/team management page (Settings/Team/Index.php) enforces view_users, confirming the intended authorization boundary that the detail route silently bypasses. This is CWE-639 (authorization bypass through a user-controlled key): the missing role constraint, not a memory-safety or injection defect, is the root cause. The upstream fix in PR 594 adds ->customers() to the detail query and introduces a regression test asserting that a staff account accessed through the customer route throws ModelNotFoundException; anonymizeAction() inherits the same unrestricted model, which is why the advisory recommends explicit customer-role verification before destructive actions.
Know when Shopper 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
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Authenticated staff (PR:L) exploit over the network (AV:N) via a trivial ID change (AC:L, no UI); discloses partial per-record profile data so C:L, with no base-case integrity or availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Shopper is a Headless e-commerce Admin Panel. Prior to 2.10.1, the customer detail route /cpanel/customers/{user}/show in packages/admin/src/Livewire/Pages/Customers/Show.php checks read_customers but looks up an arbitrary user ID without applying the customers role scope used by the listing. Authenticated staff holding access_dashboard and read_customers can change the user ID to retrieve administrator or staff profiles despite lacking view_users, which protects the separate team-management interface. The flaw exposes account profile data and permits user-ID enumeration through differing success, denial, and not-found responses. If the same role also holds delete_customers, anonymizeAction() operates on the unrestricted loaded user model and can enable destructive follow-up against non-customer accounts. This issue is fixed in version 2.10.1.
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
Privilege escalation in Shopper headless e-commerce admin panel prior to version 2.8.0 allows any low-privilege authenti
Privilege escalation in Shopper 2.0.0 through 2.5.x allows an authenticated admin-panel user who holds only the access_d
Stored cross-site scripting in the Shopper headless e-commerce admin panel (2.0.0 up to but not including 2.10.1, plus 3
Authorization bypass in Shopperlabs Shopper headless e-commerce admin panel prior to 2.8.0 allows authenticated low-priv
Permanent deletion of product variants in Shopper's admin panel is possible for any authenticated staff member who holds
Privilege escalation in shopperlabs/shopper prior to 2.8.0 allows any authenticated admin panel user - regardless of ass
Missing authorization enforcement in the Shopper headless e-commerce admin panel (all versions prior to 2.8.0) allows an
Discount over-redemption via race condition in Shopper (shopperlabs/shopper prior to v2.8.0) allows concurrent unauthent
EUVD-2026-114512
NVD
CVE.org
EPSS
GitHub
Exploit-DB