CVE-2026-56829 Overview
CVE-2026-56829 is a missing authorization vulnerability [CWE-862] in Shopper, a headless e-commerce admin panel built on Laravel Livewire. The flaw resides in packages/admin/src/Livewire/Components/Products/VariantStock.php, where the stockAction() method executes without checking the edit_product_variants permission. The component also exposes public $variant without the Livewire Locked attribute, allowing client-side mutation. Any authenticated admin-panel user, including staff limited to browse_products, can adjust inventory for arbitrary product variants and locations. The issue is fixed in version 2.9.2.
Critical Impact
Low-privileged admin users can inflate, reduce, or zero out stock for any product variant, disrupting inventory integrity and enabling denial-of-sale conditions across the storefront.
Affected Products
- Shopper (shopperlabs/shopper) versions prior to 2.9.2
- Laravel Livewire admin panel component VariantStock
- Deployments exposing the Shopper admin panel to staff accounts with browse_products or higher
Discovery Timeline
- 2026-09-15 - CVE-2026-56829 published to NVD
- 2026-09-15 - Last updated in NVD database
Technical Details for CVE-2026-56829
Vulnerability Analysis
The vulnerability affects the Livewire component responsible for managing product variant stock in the Shopper admin panel. The stockAction() method performs inventory adjustments without validating whether the requesting user holds the edit_product_variants permission. Any authenticated session with access to the admin panel can invoke the endpoint, regardless of role.
Compounding the missing authorization, the public $variant property is not marked with Livewire's Locked attribute. Livewire hydrates and rehydrates component state from client-supplied payloads on each request. Without Locked, an attacker can substitute the variant identifier and inventory location during a request, targeting any product variant in the catalog rather than the one rendered on the page.
A malicious staff user can submit positive or negative quantity adjustments to inflate stock, deplete inventory, or force out-of-stock states. This breaks the assumed authorization boundary between browse-only staff and inventory managers.
Root Cause
The root cause is twofold. First, stockAction() lacks an authorization gate corresponding to the edit_product_variants policy that governs the intended workflow. Second, the $variant component property is client-mutable because the Livewire Locked attribute was not applied, allowing arbitrary variant targeting through component state manipulation.
Attack Vector
Exploitation requires an authenticated session on the Shopper admin panel with any role, including the least-privileged browse_products role. The attacker sends a crafted Livewire update request that sets $variant and $inventory to the target identifiers and calls stockAction() with the desired quantity delta. The server executes the stock adjustment without policy checks.
// Patch context from the shopperlabs/shopper repository (v2.9.2)
// fix(admin): enforce authorization on unguarded settings and bulk actions (#570)
// The v2.9.2 release adds authorization enforcement to VariantStock::stockAction()
// and applies the Livewire #[Locked] attribute to the $variant property so that
// browse-only staff can no longer mutate arbitrary inventory records.
Source: GitHub Commit bf72e27
Detection Methods for CVE-2026-56829
Indicators of Compromise
- Livewire POST requests to the admin panel invoking stockAction from user accounts that lack the edit_product_variants permission.
- Sudden stock quantity changes on variants that were not visible on the acting user's current admin page.
- Rapid negative or positive inventory adjustments across multiple unrelated product variants in a short window.
Detection Strategies
- Audit application logs for calls to the VariantStock Livewire component correlated with the acting user's assigned roles.
- Compare stock mutation events against the user's page context to flag adjustments to variants outside the rendered scope.
- Alert on any inventory adjustment performed by staff accounts holding only the browse_products permission.
Monitoring Recommendations
- Enable database-level auditing on the product variant and inventory tables to capture updated_by, updated_at, and delta values.
- Ship Laravel and web server logs to a centralized SIEM and retain Livewire request payloads for forensic review.
- Establish a baseline for expected daily inventory adjustment volume per user role and alert on deviations.
How to Mitigate CVE-2026-56829
Immediate Actions Required
- Upgrade the shopperlabs/shopper package to version 2.9.2 or later across all environments.
- Review recent inventory adjustments and reconcile stock levels against source-of-truth records or supplier data.
- Audit admin-panel user accounts and revoke access for stale or unnecessary staff sessions.
Patch Information
The fix is delivered in Shopper release v2.9.2. The patch enforces the edit_product_variants authorization check inside stockAction() and marks the $variant property with the Livewire Locked attribute so it cannot be mutated by client requests. See the GitHub Security Advisory GHSA-g3f9-g5vj-p62f, the GitHub Pull Request #570, and the GitHub Release v2.9.2 for the complete change set.
Workarounds
- Temporarily restrict admin-panel access to trusted inventory managers by removing the browse_products role from non-essential staff until the upgrade is applied.
- Place the admin panel behind an IP allowlist or VPN to limit request surface while the patch is deployed.
- Increase inventory reconciliation frequency and enable manual approval for large stock adjustments during the exposure window.
# Upgrade to the patched Shopper release
composer require shopperlabs/shopper:^2.9.2
php artisan config:clear
php artisan view:clear
php artisan migrate
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

