← Back to CVE Explorer

CVE-2026-47743

Full vulnerability record from the local CVENow database.

Description

Shopper is a Headless e-commerce Admin Panel. Prior to 2.8.0, three related defects on admin Livewire components allowed data tampering, sensitive data disclosure, and stored XSS. First, several Livewire components in the admin panel exposed Eloquent model identifiers as public properties without the `#[Locked]` attribute. An authenticated user could rewrite the wire payload from the browser to target any record id, bypassing the implicit scoping enforced by the page routing. Second, `Customers/Create::store()` re-passed a `Hidden` `_password` form field straight into the create payload. The plaintext password was rendered into the HTML and transported through the Livewire snapshot in clear text, exposing credentials in the page DOM and in any logging that captures Livewire payloads. Finally, the product barcode field was rendered through `DNS1DFacade::getBarcodeHTML()` with `{!! !!}`. An attacker with `edit_products` permission could persist malicious payload in the barcode field that would execute in the browser of any admin user viewing that product, enabling session theft and privileged-action chaining. Starting in v2.8.0, all vulnerable Livewire model identifiers are now marked `#[Locked]`; `Customers/Create` no longer round-trips the password through a Hidden form field; the plaintext password is hashed at action boundary and never returned to the client; and the product barcode rendering now escapes the value before passing it to the barcode generator and the output is wrapped in an `<svg>` context that does not interpret event handlers. No known workarounds are available.

Severity
HIGH
CVSS score
8.7 (v3.1)
Vulnerability status
Deferred
Source identifier
Published
2026-07-23 18:16:53.490000
Last modified
2026-10-24 13:10:00.147000
View original CVE JSON
{
  "id": "CVE-2026-47743",
  "sourceIdentifier": "[email protected]",
  "published": "2026-07-23T18:16:53.490",
  "lastModified": "2026-10-24T13:10:00.147",
  "vulnStatus": "Deferred",
  "cveTags": [],
  "descriptions": [
    {
      "lang": "en",
      "value": "Shopper is a Headless e-commerce Admin Panel. Prior to 2.8.0, three related defects on admin Livewire components allowed data tampering, sensitive data disclosure, and stored XSS. First, several Livewire components in the admin panel exposed Eloquent model identifiers as public properties without the `#[Locked]` attribute. An authenticated user could rewrite the wire payload from the browser to target any record id, bypassing the implicit scoping enforced by the page routing. Second, `Customers/Create::store()` re-passed a `Hidden` `_password` form field straight into the create payload. The plaintext password was rendered into the HTML and transported through the Livewire snapshot in clear text, exposing credentials in the page DOM and in any logging that captures Livewire payloads. Finally, the product barcode field was rendered through `DNS1DFacade::getBarcodeHTML()` with `{!! !!}`. An attacker with `edit_products` permission could persist malicious payload in the barcode field that would execute in the browser of any admin user viewing that product, enabling session theft and privileged-action chaining. Starting in v2.8.0, all vulnerable Livewire model identifiers are now marked `#[Locked]`; `Customers/Create` no longer round-trips the password through a Hidden form field; the plaintext password is hashed at action boundary and never returned to the client; and the product barcode rendering now escapes the value before passing it to the barcode generator and the output is wrapped in an `<svg>` context that does not interpret event handlers. No known workarounds are available."
    },
    {
      "lang": "es",
      "value": "Shopper es un Panel de administración de e-commerce sin cabeza. Antes de la versión 2.8.0, tres defectos relacionados en los componentes Livewire de administración permitieron la manipulación de datos, la divulgación de datos sensibles y XSS almacenado. Primero, varios componentes Livewire en el panel de administración expusieron identificadores de modelos Eloquent como propiedades públicas sin el atributo “#[Locked]”. Un usuario autenticado podría reescribir la carga útil de wire desde el navegador para apuntar a cualquier ID de registro, eludiendo el alcance implícito impuesto por el enrutamiento de la página. Segundo, “Customers/Create::store()” volvió a pasar un campo de formulario “Hidden” “_password” directamente a la carga útil de creación. La contraseña en texto plano se renderizó en el HTML y se transportó a través de la instantánea de Livewire en texto claro, exponiendo credenciales en el DOM de la página y en cualquier registro que capture cargas útiles de Livewire. Finalmente, el campo de código de barras del producto se renderizó a través de “DNS1DFacade::getBarcodeHTML()” con “{!! !!}”. Un atacante con permiso de “edit_products” podría persistir una carga útil maliciosa en el campo del código de barras que se ejecutaría en el navegador de cualquier usuario administrador que viera ese producto, permitiendo el robo de sesión y el encadenamiento de acciones privilegiadas. A partir de la v2.8.0, todos los identificadores de modelos Livewire vulnerables ahora están marcados como “#[Locked]”; “Customers/Create” ya no envía la contraseña de ida y vuelta a través de un campo de formulario Hidden; la contraseña en texto plano se hashea en el límite de la acción y nunca se devuelve al cliente; y la renderización del código de barras del producto ahora escapa el valor antes de pasarlo al generador de códigos de barras y la salida se envuelve en un contexto “[svg_tag]” que no interpreta los manejadores de eventos. No se conocen soluciones alternativas disponibles."
    }
  ],
  "affected": [
    {
      "source": "[email protected]",
      "affectedData": [
        {
          "vendor": "shopperlabs",
          "product": "shopper",
          "versions": [
            {
              "version": "< 2.8.0",
              "status": "affected"
            }
          ]
        }
      ]
    }
  ],
  "metrics": {
    "cvssMetricV31": [
      {
        "source": "[email protected]",
        "type": "Secondary",
        "cvssData": {
          "version": "3.1",
          "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N",
          "baseScore": 8.7,
          "baseSeverity": "HIGH",
          "attackVector": "NETWORK",
          "attackComplexity": "LOW",
          "privilegesRequired": "LOW",
          "userInteraction": "REQUIRED",
          "scope": "CHANGED",
          "confidentialityImpact": "HIGH",
          "integrityImpact": "HIGH",
          "availabilityImpact": "NONE"
        },
        "exploitabilityScore": 2.3,
        "impactScore": 5.8
      }
    ],
    "ssvcV203": [
      {
        "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
        "ssvcData": {
          "timestamp": "2026-07-23T18:18:55.397643Z",
          "id": "CVE-2026-47743",
          "options": [
            {
              "exploitation": "none"
            },
            {
              "automatable": "no"
            },
            {
              "technicalImpact": "total"
            }
          ],
          "role": "CISA Coordinator",
          "version": "2.0.3"
        }
      }
    ]
  },
  "weaknesses": [
    {
      "source": "[email protected]",
      "type": "Secondary",
      "description": [
        {
          "lang": "en",
          "value": "CWE-79"
        },
        {
          "lang": "en",
          "value": "CWE-200"
        },
        {
          "lang": "en",
          "value": "CWE-639"
        }
      ]
    }
  ],
  "references": [
    {
      "url": "https://github.com/shopperlabs/shopper/pull/511",
      "source": "[email protected]"
    },
    {
      "url": "https://github.com/shopperlabs/shopper/security/advisories/GHSA-hr9v-r8r2-hg7j",
      "source": "[email protected]"
    }
  ]
}