Jun 6, 2026·5 min read·11 visits
Low-privileged Shopper admin panel users can manipulate Livewire payloads to edit any product's pricing, inventory, SEO, and assets because mutating endpoints lacked authorization checks and model IDs were not locked.
An authorization bypass and client-side property tampering vulnerability (CVE-2026-47742) in the Shopper headless admin panel (built on Laravel and Livewire) allows low-privileged users to modify arbitrary product records (Insecure Direct Object Reference). This occurs due to unlocked public model properties and a complete lack of access control checks on mutating sub-form store methods.
Shopper is an open-source headless e-commerce admin panel constructed on the Laravel framework and powered by Livewire components. The core management interface exposes various sub-forms within the product editor to permit administrative actions. These sub-forms cover key operational details, including pricing, SEO settings, shipping measurements, asset files, and inventory control.\n\nThe exposure is centered on the administrative backend panel, specifically targeting the asynchronous endpoints utilized by the Livewire state synchronization engine. An attacker possessing authenticated access to the panel, even with restricted read-only permissions, can target these components directly. This occurs because the sub-form components lack functional access control validation prior to processing state updates.\n\nThe vulnerability represents a combination of CWE-862 (Missing Authorization) and CWE-807 (Reliance on Untrusted Inputs in a Security Decision). This combination facilitates client-side tampering and direct object referencing, enabling low-privileged actors to bypass role-based access control (RBAC) boundaries. Successful exploitation leads to unauthorized modifications across the entire product catalog database.
The flaw lies within the state-management paradigm of Laravel Livewire v3. During the application's client-server communication lifecycle, component properties are serialized into a JSON state snapshot (dehydration) and passed to the frontend. Subsequent client interactions submit this snapshot back to the backend server to re-instantiate the stateful server-side component (hydration).\n\nIn vulnerable installations of Shopper, public database model properties, such as $product, were exposed directly to the client interface without locking constraints. Livewire serializes Eloquent models by encoding their database class name and primary key. Because these properties were not secured with the #[Locked] attribute, Livewire allowed the client payload to rewrite the model identifier (e.g., modifying the targeted ID from 42 to 999).\n\nDuring the hydration phase, the Livewire engine receives the tampered JSON, trusts the user-supplied primary key, and queries the database to bind the modified model instance. Crucially, the component's state-mutating store() method does not perform any server-side authorization checks. Consequently, the application executes the update operation against an arbitrary product record, bypassing both intended data boundaries (IDOR) and role-based access rules.
Examination of the vulnerable codebase reveals complete trust in the component's internal state during mutation requests. In packages/admin/src/Livewire/Components/Products/Form/Inventory.php, the original store() method updated the database without validation:\n\nphp\n// Vulnerable server-side component state\npublic Product $product;\n\npublic function store(): void\n{\n // No permission checks exist here\n $this->product->update($this->form->getState());\n $this->dispatch('product.updated');\n}\n\n\nThe patch applied in Commit fcd0c5920588702df5b874f432b1042abd77a50b introduces two defensive controls. First, the #[Locked] attribute is assigned to the public model property. This causes Livewire to sign the property on dehydration and verify the signature on hydration, preventing ID tampering. Second, explicit authorization is enforced inside the method body.\n\nphp\n// Patched state enforcement\nuse Livewire\\Attributes\\Locked;\n\n#[Locked]\npublic Product $product;\n\npublic function store(): void\n{\n // Enforce role-based access control explicitly\n $this->authorize('edit_products');\n\n $this->product->update($this->form->getState());\n $this->dispatch('product.updated');\n}\n\n\nThe remediation is robust and covers adjacent components, including Edit.php, Seo.php, Shipping.php, and Files.php. By combining cryptographic property signing via #[Locked] with explicit server-side RBAC validation, the application successfully prevents exploitation of this entire attack vector.
To execute the exploit, an attacker must first obtain a low-privileged authenticated session on the Shopper admin panel. This requirement is low complexity, as any standard staff account without write privileges is sufficient. No administrative permissions like edit_products are required.\n\nThe attacker locates a product modification sub-form to retrieve the initial Livewire component state structure. By capturing the underlying AJAX communication directed at the /livewire/message/{component-name} endpoint, the attacker extracts the dehydrated JSON state. This payload includes a memo block with the identifier of the product model being processed.\n\nThe attacker modifies the product.id field to reference a target record of their choosing. They append state updates containing arbitrary product information, such as adjusted unit pricing or manipulated stock volumes. Upon dispatching the mutated JSON snapshot via the intercepting proxy, the Livewire engine reconciles the state, binds the arbitrary model, and runs the store() method, committing the unauthorized changes.
The security impact is classified as High for integrity, with a CVSS v3.1 score of 6.5. Because the application processes transaction-critical records, unauthorized modifications can cause direct business disruption. An attacker can set pricing values to nominal amounts, deplete or artificially inflate inventory stock, or manipulate product SEO profiles to redirect web traffic.\n\nmermaid\ngraph LR\n Attacker["Low-Privilege Session"] -->|1. Manipulates JSON Payload| Livewire["Livewire Hydration Engine"]\n Livewire -->|2. Binds Arbitrary Model ID| DB[("Application Database")]\n Livewire -->|3. Invokes Unprotected store()| DB\n DB -->|4. Writes Tampered Price/Stock| DB\n\n\nFurthermore, because the Files sub-form is also vulnerable, an attacker could change media attachments and associated assets. This could lead to the distribution of malicious assets or defacement of the public storefront. The exploit's scope is restricted to the Shopper e-commerce application databases, leaving host operating systems and system availability unaffected.
Organizations must upgrade shopperlabs/shopper to version 2.8.0 or higher immediately to resolve the underlying vulnerability. This version incorporates the necessary Livewire attributes and authorization hooks to defend the product sub-forms. Update commands should be executed via Composer inside the application root directory.\n\nWhere an immediate upgrade to version 2.8.0 is prevented by operational dependencies, administrators should manually apply the security patch. This requires modifying the target sub-forms within packages/admin/src/Livewire/Components/Products/Form/ to introduce #[Locked] attributes and call $this->authorize('edit_products') inside the store routines.\n\nWeb Application Firewalls (WAFs) can be configured to detect or block manipulation patterns. WAF signatures should monitor asynchronous JSON payloads directed at Shopper's Livewire endpoints, searching for state updates containing mismatched product identifiers or anomalous transactional modifications triggered by unauthorized session tokens.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
shopper shopperlabs | < 2.8.0 | 2.8.0 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-862, CWE-807 |
| Attack Vector | Network (AV:N) |
| CVSS v3.1 Score | 6.5 (Medium) |
| EPSS Score | 0.00029 (Percentile: 8.91%) |
| Exploit Status | PoC / Conceptual |
| CISA KEV Status | Not Listed |
A stored Cross-Site Scripting (XSS) vulnerability exists within plone.restapi, the REST API package for Plone content management system. By supplying a spoofed input MIME type (text/x-html-safe), an attacker can mislead the rendering layer (plone.app.textfield) into assuming that the supplied content is already sanitized. This causes the system to skip the safe_html transform, allowing arbitrary JavaScript to execute in the victim's browser when they view the compromised page.
An untrusted search path vulnerability in the GlobalDatabasePlugin component of the AWS Advanced JDBC Wrapper for Amazon Aurora PostgreSQL allows authenticated, low-privilege database users to hijack administrative session queries. By defining a custom function in a writable schema such as the public schema, an attacker can hijack queries executed automatically during driver-level topology detection. When a highly privileged database user connects to the database utilizing an affected version of the wrapper, the custom function executes under their security context, enabling remote privilege escalation to rds_superuser.
CVE-2026-27771 represents a critical security flaw in Gitea and Forgejo (up to and including version 1.26.1) involving missing authorization checks (CWE-862). Unauthenticated remote attackers can query, enumerate, and download private container images from the OCI-compliant container registry. Additionally, unauthorized users can retrieve private or internal source repository URLs via the Composer package registry metadata API. A public proof-of-concept exists, and threat metrics indicate highly active scanning and exploitation risks.
A missing authorization vulnerability in the Formie plugin for Craft CMS prior to version 3.1.28 allows low-privileged Control Panel users to read and modify sensitive administrative settings, configuration options, and third-party integrations.
CVE-2026-53598 is a directory traversal and arbitrary file read vulnerability in Microsoft Prompty ecosystem loaders across multiple languages. Prior to version 2.0.0-beta.2, the loaders resolved `${file:...}` reference strings inside frontmatter configuration blocks without enforcing that the target file paths resided within authorized directories. This deficiency allows an attacker-controlled configuration file to read sensitive operating system and application files through absolute paths, directory traversal, or symbolic link escapes. The issue is addressed across the Python, C#, Node.js/TypeScript, and Rust ecosystems.
A directory traversal vulnerability exists in the copy subcommand of the proot-distro utility. Due to incomplete path sanitization, local attackers or malicious scripts can read from or write to arbitrary files outside the container rootfs, bypassing isolation barriers and potentially gaining unauthorized access or persistent execution on the host system.