Jun 5, 2026·6 min read·78 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 authorization bypass vulnerability in the Spotify Backstage TechDocs backend plugin allows authenticated attackers with access to at least one valid TechDocs site to read arbitrary static documentation from other entities. This occurs due to un-sanitized relative subpaths passing directly to external storage drivers.
The @backstage/plugin-scaffolder-backend package prior to version 4.1.0 is vulnerable to sensitive information exposure in Scaffolder task failure events. Under specific template and failure conditions, an authenticated user can retrieve backend-managed credentials, such as VCS access tokens and API keys, from affected task execution events and stored database logs. This vulnerability has been remediated in version 4.1.0 of the package and is bundled with the Backstage platform release v1.54.6.
A critical security flaw exists in PraisonAI before version 4.6.78 when operating in AgentMail webhook mode. The application processes incoming POST requests without checking for cryptographic signatures, allowing unauthenticated attackers to forge emails, spoof identities, and force AI agents to execute unauthorized operations.
A missing authorization vulnerability (CWE-862) exists in praisonai-platform versions prior to 0.1.9, allowing low-privileged workspace members to delete planning dependencies on issues owned by administrators by routing the deletion request through an attacker-owned issue.
CVE-2026-46438 is a critical Broken Object Level Authorization (BOLA) / Insecure Direct Object Reference (IDOR) vulnerability identified in the wger fitness manager prior to version 2.6. An authenticated attacker can exploit a missing authorization check on the slot_entry API parameter to inject unauthorized workout logs into another user's training schedule. This results in the corruption of the target user's automated progressive-overload calculations.
CVE-2026-105795 (GHSA-6gw6-rv2g-25mg) is a critical path traversal vulnerability in Microsoft Kiota, an OpenAPI-based HTTP client and plugin manifest generator. In affected versions (1.25.1 to < 1.35.0), Kiota propagates the unvalidated `x-ai-capabilities.response_semantics.oauth_card_path` vendor extension directly into generated API plugin manifests, leading to potential path traversal exploitation by downstream consumers.