CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-47744

CVE-2026-47744: Improper Privilege Management and State Tampering in Shopper E-commerce Administration Panel

Alon Barad
Alon Barad
Software Engineer

Jun 5, 2026·6 min read·4 visits

Executive Summary (TL;DR)

A critical privilege escalation flaw in Shopper allows low-privilege panel users to bypass access controls, gain administrative privileges, and tamper with arbitrary orders and customer records due to missing authorization gates and unlocked Livewire properties.

Shopper, an open-source headless e-commerce administration panel, is vulnerable to a critical privilege escalation and state tampering vulnerability. By exploiting missing page authorization and improper permission checks in the team settings component, combined with unlocked Livewire model properties, any authenticated low-privilege user can escalate their role to administrator. This allows full control over the e-commerce configuration, customer data, and order states.

Vulnerability Overview

Shopper is an open-source headless e-commerce administration panel designed for the Laravel ecosystem, relying heavily on Filament and Laravel Livewire for its administrative user interface. The team settings component in Shopper manages administrator user roles, system permissions, and staff registration. Because these components are exposed over the network, they represent a high-exposure attack surface that requires stringent access control logic at multiple layers of execution.

CVE-2026-47744 identifies a critical vulnerability within this settings module, combining missing lifecycle authorization checks with improper privilege mapping. A secondary, systemic flaw in the application's implementation of Livewire allows state tampering and model hijacking on sensitive model properties. When these issues are chained, any authenticated panel user with minimal privileges can completely bypass administrative boundaries.

The vulnerability enables full horizontal and vertical privilege escalation, allowing an attacker to modify their own permissions and assume administrative control over the entire e-commerce infrastructure. Once escalated, the attacker gains the ability to manipulate orders, access customer personally identifiable information (PII), disrupt transactions, and compromise backend databases. The vulnerability was successfully resolved in version 2.8.0.

Root Cause Analysis

The primary defect arises from a complete absence of page-level component mount validation within the Team Settings index view. In Laravel Livewire, the mount() lifecycle hook serves as the gatekeeper for incoming requests, executing initialization logic and security verifications before hydrating the component. In affected versions of Shopper, the Shopper\Livewire\Pages\Settings\Team\Index component lacked a defined mount() method entirely, allowing any authenticated user to instantiate the component.

The secondary bug resides in the permission assignment component, located in Shopper\Livewire\Pages\Settings\Team\RolePermission. This component is responsible for saving and updating specific role permissions in the database. The component's write-oriented methods, including save(), were gated behind the 'view_users' permission check, which is a low-privilege permission intended for viewing directory information rather than managing roles.

Furthermore, the vulnerability is compounded by Livewire state tampering, where public Eloquent model properties are exposed without cryptographic signatures. Livewire dehydrates component states to the client-side browser and re-hydrates them upon consecutive requests. Because sensitive models like ShopperUser, Order, and Product were not locked on the server, attackers could intercept the HTTP traffic and alter the model's primary key (ID) in transit. During the hydration phase, the server binds the component to the attacker-supplied ID, leading to Indirect Object Reference (IDOR) execution across several data-modifying actions.

Code Analysis

To understand the mechanics of the vulnerability, we examine the differences between the vulnerable code and the official security patch applied in pull request #511. The developer introduced crucial validation steps in both the index page and the permission management classes.

In the index file packages/admin/src/Livewire/Pages/Settings/Team/Index.php, a mount() method was introduced to enforce administrative permission requirements on instantiation.

// BEFORE (Vulnerable - no mount method existed)
class Index extends Component implements HasActions, HasSchemas, HasTable
{
    use InteractsWithActions;
    use InteractsWithSchemas;
    use InteractsWithTable;
    // Missing mount() method allows unauthorized hydration
}
 
// AFTER (Patched - enforces authorization)
class Index extends Component implements HasActions, HasSchemas, HasTable
{
    use InteractsWithActions;
    use InteractsWithSchemas;
    use InteractsWithTable;
 
    public function mount(): void
    {
        // Require the view_users permission to render the component
        $this->authorize('view_users');
    }
}

The patch also corrected the authorization logic in packages/admin/src/Livewire/Pages/Settings/Team/RolePermission.php by changing the authorization gate from 'view_users' to 'access_setting'. Additionally, the developer systematically locked public model properties using the Livewire #[Locked] attribute to prevent model hijacking.

// AFTER (Patched - using #[Locked] attribute to prevent ID tampering)
use Livewire\Attributes\Locked;
use Livewire\Component;
 
class Addresses extends Component
{
    /** @var Model&ShopperUser */
    #[Locked] // Cryptographically signs property to prevent client-side ID mutation
    public ShopperUser $customer;
}

Exploitation Mechanics

An attacker can exploit this vulnerability using basic, low-privilege credentials. The attack operates entirely over HTTP, utilizing a series of standard HTTP POST requests to the Livewire endpoint /livewire/message/{component-name}.

The exploit begins with the attacker navigating to the team settings route /admin/settings/team. Because the parent component lacks a mount() method, the application returns the fully hydrated component structure, exposing public actions. The attacker then targets the permission adjustment handler.

By capturing the outgoing Livewire payload, the attacker replaces the parameters targeting their own role with permissions of higher value, such as manage_users and access_setting. Since the save() method on the server side only verifies the 'view_users' permission, which the low-privilege attacker already possesses, the transaction completes successfully. The application then writes the escalated role configurations directly to the database, granting the attacker complete administrative control over the backend.

Impact Assessment

The impact of CVE-2026-47744 is classified as critical, receiving a CVSS v3.1 base score of 9.9. This rating reflects the low attack complexity and the minimal privileges required to trigger the exploit, coupled with complete system compromise. The vulnerability changes the authorization scope, allowing an attacker to manipulate core framework states.

Upon successful privilege escalation, the attacker operates as a complete panel administrator. They can access, modify, or delete sensitive user databases, customer PII, transaction histories, and e-commerce inventory details. Furthermore, the attacker can lock out legitimate administrators by deleting their user profiles or modifying administrative credentials.

The state-tampering vector presents an immediate threat to business operations. By mutating model IDs on components that lack property locks, attackers can cancel active orders, adjust inventory levels, intercept shipping labels, and alter refund policies. This compromise results in complete loss of confidentiality, integrity, and availability for the affected e-commerce application.

Remediation & Hardening Guide

Remediation of CVE-2026-47744 requires an immediate update of the shopperlabs/shopper dependency to version 2.8.0 or higher. The patch incorporates explicit mount controls, proper permission mapping for all write actions, and systematic attribute locking on vulnerable models.

# Update Shopper package via Composer
composer update shopperlabs/shopper:^2.8.0
 
# Clear application and framework caches
php artisan cache:clear
php artisan view:clear
php artisan route:clear

In environments where an immediate package upgrade is not feasible, security engineers should implement temporary Web Application Firewall (WAF) rules. These rules must intercept all traffic destined for /livewire/message/shopper-livewire-pages-settings-team-* and block requests initiated by sessions lacking verified super-administrator roles.

Additionally, developers of custom Livewire applications must adopt defensive programming patterns. Every state-altering action must validate security policies manually, and all exposed model properties should be decorated with the #[Locked] attribute to prevent model hijacking.

Technical Appendix

CVSS Score
9.9/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H

Affected Systems

Shopper (shopperlabs/shopper)
AttributeDetail
CWE IDCWE-269
Attack VectorNetwork
CVSS Score9.9 (Critical)
Exploit StatusNo public PoC
Affected Versions< 2.8.0
Patched Version2.8.0
CWE-269
Improper Privilege Management

Vulnerability Timeline

Fix commit submitted by lead developer
2026-05-11
Official GitHub Security Advisory GHSA-c3qp-2ggw-xjg7 published
2026-05-29
CVE-2026-47744 assigned
2026-05-29

More Reports

•23 minutes ago•CVE-2026-47762
8.7

CVE-2026-47762: Stored Cross-Site Scripting (XSS) in TinyMCE Protect Pattern Restoration

A high-severity stored Cross-Site Scripting (XSS) vulnerability was identified in the TinyMCE rich text editor. The flaw exists in the handling of the 'protect' configuration option, where forged placeholder comments containing malicious payloads bypass the editor's sanitization routines and execute arbitrary JavaScript during serialization and content restoration.

Amit Schendel
Amit Schendel
2 views•8 min read
•about 1 hour ago•CVE-2026-47742
6.5

CVE-2026-47742: Missing Authorization and Client-Side Property Tampering in Shopper E-commerce Panel

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.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 1 hour ago•CVE-2026-47745
6.5

CVE-2026-47745: Missing Authorization in Shopper Admin Panel Settings

Shopper is an open-source headless e-commerce administration panel built on Laravel, Livewire, and Filament. Prior to version 2.8.0, the admin tables for PaymentMethods, Currencies, and Carriers exposed inline toggles and per-record actions that could be modified by any authenticated user without verifying the corresponding administrative permissions on the backend.

Alon Barad
Alon Barad
4 views•6 min read
•about 2 hours ago•CVE-2026-47715
3.1

CVE-2026-47715: Insecure Direct Object Reference (IDOR) / Cross-Project Authorization Bypass in Bugsink

An Insecure Direct Object Reference (IDOR) vulnerability in Bugsink (versions < 2.2.0) allows authenticated users with access to at least one project to view sensitive event details (including stack traces, local/environment variables, and execution breadcrumbs) belonging to other projects, by supplying a known event UUID directly to the issue event URL paths.

Alon Barad
Alon Barad
4 views•7 min read
•about 2 hours ago•CVE-2026-47716
3.1

CVE-2026-47716: Broken Object Level Authorization in Bugsink Bulk Issue Actions

Bugsink prior to version 2.2.0 is vulnerable to Broken Object Level Authorization (BOLA). The issue list view authorizes access based on the project in the URL path but applies requested bulk actions to submitted issue UUIDs globally, without verifying project ownership.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 3 hours ago•CVE-2026-47728
4.3

CVE-2026-47728: Multi-Tenant Isolation Bypass via Unscoped Debug ID Resolution in Bugsink

A critical authorization bypass vulnerability in Bugsink prior to version 2.2.0 allows authenticated users to access and resolve sourcemaps and debug files belonging to other projects on the same instance.

Amit Schendel
Amit Schendel
4 views•6 min read