CVE-2026-56828: Shopper: broken RBAC lets viewer role become admin

GHSA-j328-xmgp-j4q3 HIGH
Published September 11, 2026
CISO Take

Three Livewire admin components in the shopper/framework e-commerce package check the read-only 'view_users' permission instead of the write-gating 'access_setting' permission before allowing state-changing actions, letting any staff account with only a support/viewer role grant itself arbitrary permissions, create a brand-new admin user with a password of its choosing, or delete permission and role records. There is no EPSS score, no CISA KEV listing, and no public exploit or Nuclei template yet, but the bug requires only a low-privilege authenticated session and no user interaction (CVSS 8.8, AV:N/AC:L/PR:L/UI:N), and Shopper's own regression test suite already demonstrates the exploit path working end to end. This is a general e-commerce backend authorization flaw, not an AI/ML-specific vulnerability — shopper/framework does not appear in our tracked AI/ML package catalog, and no AI pipeline, model, or agent component is implicated. Any organization running Shopper (versions >= 2.8.0, < 2.9.2) should upgrade to 2.9.2 immediately and audit which staff accounts hold 'view_users' to check for unauthorized permission grants, new admin users, or deleted roles created since the prior GHSA-f946-9qp6-vgch fix (which this issue slipped through).

Sources: NVD GitHub Advisory

What is the risk?

High severity (CVSS 8.8) with a low bar to exploit: any authenticated staff user holding the common, low-privilege 'view_users' permission (support/viewer role) can self-escalate to full admin without any additional access, social engineering, or technical sophistication — the vulnerable page even enumerates the permission IDs needed via visible wire:click handlers. There is no evidence of active exploitation (not in CISA KEV, no EPSS/SSVC data, no public PoC or scanner template), which lowers immediate urgency, but the triviality of exploitation and the fact that Shopper's own tests already confirm the attack path make this a high-priority patch item rather than a theoretical risk. This is a general web application RBAC/authorization defect in an e-commerce admin panel, not an AI/ML-specific threat — it does not touch model inference, training pipelines, agents, or any component in our tracked AI package catalog.

How does the attack unfold?

Initial Access
Attacker holds or obtains a low-privilege Shopper admin account with only the 'view_users' and 'access_dashboard' permissions (e.g., a support/viewer role).
Exploitation
Attacker invokes Livewire component actions (togglePermission, removePermission, CreateTeamMember store) that are incorrectly gated on 'view_users' instead of 'access_setting'.
Privilege Escalation
Attacker grants their own role elevated permissions or creates a new user account with the 'admin' role and a password of their choosing.
Impact
Attacker gains full administrative control of the e-commerce backend and can additionally delete permission or role records to disrupt access control (RBAC DoS).

What systems are affected?

Package Ecosystem Vulnerable Range Patched
shopper/framework composer >= 2.8.0, < 2.9.2 2.9.2

Do you use shopper/framework? You're affected.

How severe is it?

CVSS 3.1
8.8 / 10
EPSS
N/A
Exploitation Status
No known exploitation
Sophistication
Trivial

What is the attack surface?

AV AC PR UI S C I A
AV Network
AC Low
PR Low
UI None
S Unchanged
C High
I High
A High

What should I do?

1 step
  1. Upgrade shopper/framework to version 2.9.2 or later immediately. As an interim workaround if upgrading is delayed, restrict or revoke the 'view_users' permission from any role that should not have write access to team/permission/role management, and manually audit the permissions, roles, and users tables for unexpected admin grants, unrecognized team members, or deleted roles/permissions created since the prior GHSA-f946-9qp6-vgch fix. Review authentication logs for logins by newly created admin accounts. After patching, confirm the two affected regression tests (PermissionsTest.php, CreateTeamMemberTest.php) were updated to assert against 'access_setting' rather than 'view_users' to prevent regression.

How is it classified?

Auth Bypass Framework

Which compliance frameworks are affected?

Compliance analysis pending. Sign in for full compliance mapping when available.

Frequently Asked Questions

What is CVE-2026-56828?

Three Livewire admin components in the shopper/framework e-commerce package check the read-only 'view_users' permission instead of the write-gating 'access_setting' permission before allowing state-changing actions, letting any staff account with only a support/viewer role grant itself arbitrary permissions, create a brand-new admin user with a password of its choosing, or delete permission and role records. There is no EPSS score, no CISA KEV listing, and no public exploit or Nuclei template yet, but the bug requires only a low-privilege authenticated session and no user interaction (CVSS 8.8, AV:N/AC:L/PR:L/UI:N), and Shopper's own regression test suite already demonstrates the exploit path working end to end. This is a general e-commerce backend authorization flaw, not an AI/ML-specific vulnerability — shopper/framework does not appear in our tracked AI/ML package catalog, and no AI pipeline, model, or agent component is implicated. Any organization running Shopper (versions >= 2.8.0, < 2.9.2) should upgrade to 2.9.2 immediately and audit which staff accounts hold 'view_users' to check for unauthorized permission grants, new admin users, or deleted roles created since the prior GHSA-f946-9qp6-vgch fix (which this issue slipped through).

Is CVE-2026-56828 actively exploited?

No confirmed active exploitation of CVE-2026-56828 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-56828?

Upgrade shopper/framework to version 2.9.2 or later immediately. As an interim workaround if upgrading is delayed, restrict or revoke the 'view_users' permission from any role that should not have write access to team/permission/role management, and manually audit the `permissions`, `roles`, and `users` tables for unexpected admin grants, unrecognized team members, or deleted roles/permissions created since the prior GHSA-f946-9qp6-vgch fix. Review authentication logs for logins by newly created admin accounts. After patching, confirm the two affected regression tests (`PermissionsTest.php`, `CreateTeamMemberTest.php`) were updated to assert against 'access_setting' rather than 'view_users' to prevent regression.

What is the CVSS score for CVE-2026-56828?

CVE-2026-56828 has a CVSS v3.1 base score of 8.8 (HIGH).

What are the technical details?

Original Advisory

## Summary Three Livewire admin components in `shopper/framework` (latest master at commit `fcd0c59`, released as v2.8.0) gate state-mutating actions on the read-only `view_users` permission. This is the same class as the issue Shopper fixed in v2.8.0 / PR #511 / [GHSA-f946-9qp6-vgch](https://github.com/shopperlabs/shopper/security/advisories/GHSA-f946-9qp6-vgch) — the PR moved most write actions from `view_users` to `access_setting`, but three were missed (one of them is a brand-new file added by the security commit itself). A staff user holding only `view_users` + `access_dashboard` (a realistic "support" or "viewer" role per Shopper's own `PermissionsTableSeeder`) can: (1) self-escalate by granting any permission to their own role; (2) create a brand-new admin team member with a chosen password and the `admin` role and then log in as that user; (3) delete arbitrary `permissions` rows (RBAC DoS) or — when `can_be_removed=true` — delete entire roles. CVSS 3.1: `AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H` = 8.8 (High). CWE-285 (Improper Authorization) + CWE-862 (Missing Authorization). ## Vulnerable components (paths relative to repo root) ### 1) `packages/admin/src/Livewire/Components/Settings/Team/Permissions.php` - `togglePermission(int $id)` at line 28 calls `$this->authorize('view_users');` - `removePermission(int $id)` at line 55 calls `$this->authorize('view_users');` The Permissions blade at `packages/admin/resources/views/livewire/components/settings/team/permissions.blade.php` line 34 emits every permission's `id` directly in `wire:click` handlers, so the attacker does not even need to guess IDs — the page itself enumerates them. Net effect: any user who can mount the Permissions component (gated on `view_users`) can grant any permission row to the bound `$role`. Granting `access_setting` to the attacker's own role unlocks every action that PR #511 supposedly hardened with `->authorize('access_setting')`. Granting `delete_customers`, `edit_orders`, `edit_products`, `add_brands`, etc. is direct data-modification escalation. ### 2) `packages/admin/src/Livewire/SlideOvers/CreateTeamMember.php` - `mount()` at line 53 calls `$this->authorize('view_users');` - `store()` at line 122 calls `$this->authorize('view_users');` This file is `new file mode 100755` in commit `fcd0c59` — it was created as part of the security fix and inherited the same misclassified gate. `store()` creates a `User` with `email_verified_at = now()`, the attacker's chosen password, and any selected `role_id`. The `Radio::make('role_id')` options filter only excludes `config('shopper.admin.roles.user')`, so the `admin` role is selectable. Log out, log in as the new account → full admin. ### 3) `packages/admin/src/Livewire/Pages/Settings/Team/RolePermission.php` - `deleteAction` at lines 81-90: only gated by `->visible($this->role->can_be_removed)`, with no `->authorize()` chain. Page-level `mount` (line 52) requires only `view_users`. For any role with `can_be_removed = true`, a `view_users`-only user can call the action and delete the role (cascading the loss of permissions for every assigned user). ## Self-confirmation in the project's own test suite The following tests are green on master @ `fcd0c59` — they ARE the PoC: ``` tests/Admin/Livewire/Components/Settings/Team/PermissionsTest.php line 14-16: `givePermissionTo('view_users')` only line 36-45: "can toggle permission to role" — passes line 74-85: "can remove permission" — passes tests/Admin/Livewire/SlideOvers/CreateTeamMemberTest.php line 16-18: `givePermissionTo('view_users')` only line 29-56: "can create new team member" — passes, asserts the new user `hasRole('manager')` ``` A `view_users`-only Livewire user actor successfully toggles permissions, removes permissions, and creates a new privileged user — verified by Shopper's own regression tests. ## Suggested fix Change `$this->authorize('view_users')` to `$this->authorize('access_setting')` in: - `Permissions::togglePermission` - `Permissions::removePermission` - `Permissions::mount` (defence in depth, matches `Team\Index`) - `CreateTeamMember::mount` - `CreateTeamMember::store` Add `->authorize('access_setting')` to `RolePermission::deleteAction` (matches the pattern already applied to `generatePermissionsAction`, `createPermissionAction`, and `Team\Index::DeleteAction`). Update the two regression tests to use `access_setting` instead of `view_users` so they accurately reflect the privilege boundary. ## Resources - Prior advisory of the same class: https://github.com/shopperlabs/shopper/security/advisories/GHSA-f946-9qp6-vgch - Fix commit that introduced these residual gaps: https://github.com/shopperlabs/shopper/commit/fcd0c5920588702df5b874f432b1042abd77a50b - CWE-285 Improper Authorization - CWE-862 Missing Authorization ### Credits Reported by Vishal Shukla(@shukla304) using sechub.dev AI Agent ### Support If this disclosure was useful and if users would like to support continued open-source security research and responsible-disclosure work, they can sponsor at https://github.com/sponsors/therawdev — Shoppers thanks those who keeping open source safe.

Exploitation Scenario

An attacker who has obtained (or been legitimately granted, e.g. as a support agent) a low-privilege Shopper admin account with only 'view_users' and 'access_dashboard' permissions loads the Permissions Livewire component, which lists every permission ID directly in the page's wire:click handlers. The attacker clicks to grant their own role the 'access_setting' permission (unlocking every action nominally protected by the prior security fix), or alternatively opens the CreateTeamMember slide-over — also gated only on 'view_users' — to create a brand-new user with a self-chosen password and the 'admin' role. Logging out and back in as this new account, or simply operating under the newly escalated role, gives the attacker full administrative control over the e-commerce backend, including the ability to delete permissions or roles as a denial-of-service against the RBAC system.

Weaknesses (CWE)

CWE-285 — Improper Authorization: The product does not perform or incorrectly performs an authorization check when an actor attempts to access a resource or perform an action.

  • [Architecture and Design] Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) to enforce the roles at the appropriate boundaries. Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
  • [Architecture and Design] Ensure that you perform access control checks related to your business logic. These checks may be different than the access control checks that you apply to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor.

Source: MITRE CWE corpus.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Timeline

Published
September 11, 2026
Last Modified
September 11, 2026
First Seen
September 12, 2026

Related Vulnerabilities