Jun 5, 2026·6 min read·26 visits
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.
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.
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.
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;
}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.
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 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:clearIn 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.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H| Attribute | Detail |
|---|---|
| CWE ID | CWE-269 |
| Attack Vector | Network |
| CVSS Score | 9.9 (Critical) |
| Exploit Status | No public PoC |
| Affected Versions | < 2.8.0 |
| Patched Version | 2.8.0 |
An authentication bypass in the SiYuan personal knowledge management system before version 3.7.0 exposes a dynamic icon rendering endpoint. This endpoint processes client-supplied Go template directives. By submitting a crafted request, an unauthenticated remote attacker can leverage registered database template functions to execute arbitrary read-only SQL queries and exfiltrate workspace contents.
CVE-2026-54069 is a critical authentication bypass vulnerability in the SiYuan Note personal knowledge management system. The flaw is located in the HTTP server's middleware handling API authorization, which unconditionally trusts requests carrying a 'chrome-extension://' scheme in the Origin HTTP header, granting administrative access without validating API tokens.
CVE-2026-54089 is a critical authentication bypass vulnerability in File Browser affecting instances configured with proxy-based authentication. An unauthenticated remote attacker with direct network access can impersonate arbitrary users or register new accounts by spoofing configured HTTP headers.
The malicious Cargo package 'exploration' was uploaded to the crates.io registry. During compilation or package import, the crate executes code designed to establish an outbound TCP/HTTP connection, download an external second-stage binary, and execute the binary locally on the host machine. This creates an unauthenticated remote code execution vector impacting developer environments and continuous integration pipelines.
CVE-2026-54088 is a critical command injection vulnerability in File Browser prior to version 2.63.6. When Hook Authentication is enabled, the application interpolates unsanitized credentials into a shell command, allowing unauthenticated remote code execution.
An authenticated remote code execution vulnerability exists in NotrinosERP (versions up to and including 1.0.0) within the Human Resource Management (HRM) module. Users with employee management permissions can upload arbitrary file types, including PHP scripts, which are written directly to a web-accessible directory. This allows for arbitrary code execution in the context of the web-server user.