CVE-2026-68501: Sylius/mollie plugin Sylius Mollie Plugin Has Unauthenticated Vulnerability

MODERATE
Advisory Identifier: GHSA-x83g-979r-f5fh
CVSS 6.5
CWE-639
Published
Advisory Summary

CVE-2026-68501 is a MODERATE (CVSS 6.5) sylius mollie plugin has unauthenticated vulnerability (CWE-639: Authorization Bypass Through User-Controlled Key) affecting Sylius/mollie plugin libraries in the Packagist ecosystem. The issue involves sylius mollie plugin has unauthenticated idor that leaks order token and customer pii. Remediation is available by upgrading affected packages to version 2.2.8, 3.2.4, 3.3.1.

CVE-2026-68501 at a Glance

CVE Identifier CVE-2026-68501
GHSA Identifier GHSA-x83g-979r-f5fh
Severity MODERATE
CVSS v3.1 Base Score 6.5
CWE Classification CWE-639: Authorization Bypass Through User-Controlled Key
Affected Product Sylius/mollie plugin
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 6.5

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality Low (C:L)
Integrity None (I:N)
Availability Low (A:L)

How to Fix CVE-2026-68501

To remediate this vulnerability, upgrade all affected Sylius/mollie plugin dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

sylius/mollie-plugin fixed: 2.2.8
Upgrade sylius/mollie-plugin to 2.2.8
sylius/mollie-plugin fixed: 3.2.4
Upgrade sylius/mollie-plugin to 3.2.4
sylius/mollie-plugin fixed: 3.3.1
Upgrade sylius/mollie-plugin to 3.3.1
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for sylius/mollie-plugin

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-68501, inspect your project dependencies for Sylius/mollie plugin:

inspect dependencies for sylius/mollie-plugin

Analyze the terminal output to locate any version of Sylius/mollie plugin in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.2.8), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-639: Authorization Bypass Through User-Controlled Key, where the system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data. In Sylius/mollie plugin, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Impact Two unauthenticated Mollie shop endpoints look up orders by a sequential integer `orderId` with no ownership or session check. Chained, they expose customer PII. `GET /{_locale}/thank-you` (`PageRedirectController::thankYouAction`, route `sylius_mollie_shop_thank_you_page_redirect`) loads the order with `findOneBy(['id' => $orderId])` and returns a `302` whose `Location` header carries that order's `tokenValue`. Any `orderId` thus yields that order's token. A non-existent id dereferences null and returns a `500`. The handler also writes the raw `orderId` into the session. `GET /{_locale}/get-code` (`QrCodeAction::fetchQrCodeFromOrder`, route `sylius_mollie_shop_get_qr_code`) runs the same lookup and returns the order's QR code and id as JSON, ignoring the session cart; this is where the front-end got the integer id. A bad id `500`s here too. That `tokenValue` is the order's only access control. Passed to the Sylius core page `GET /{_locale}/register-after-checkout/{tokenValue}` it returns a form pre-filled with the customer's first name, last name and email. The full attack: enumerate `orderId`, read the token from the redirect, read the PII, at roughly a 1-in-71 hit rate for guest orders. `register-after-checkout` is Sylius core, not the plugin, and trusts the token by design, so the leak is what must be fixed. None of the plugin endpoints require a login, session or CSRF token. ### Patches Fixed in **2.2.8**, **3.2.4** and **3.3.1**. ### Workarounds If you cannot upgrade immediately, patch both endpoints at the project level by decorating the plugin controllers. The decorators enforce ownership before delegating to the original controller, so no plugin behaviour is lost. They keep the original `orderId` request contract, so no front-end or asset changes are required. Works on both 2.2 and 3.x. #### Step 1. Decorate the QR code controller Create `src/Controller/Mollie/SecureQrCodeAction.php` in your Sylius project: ```php <?php declare(strict_types=1); namespace App\Controller\Mollie; use Sylius\Component\Order\Context\CartContextInterface; use Sylius\Component\Order\Context\CartNotFoundException; use Sylius\MolliePlugin\Controller\Shop\QrCodeAction; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; final class SecureQrCodeAction { private const OWNED_ORDER_IDS_SESSION_KEY = 'sylius_mollie.owned_order_ids'; public function __construct( private readonly QrCodeAction $inner, private readonly CartContextInterface $cartContext, ) { } public function fetchQrCodeFromOrder(Request $request): JsonResponse { $orderId = $request->get('orderId'); try { $cart = $this->cartContext->getCart(); } catch (CartNotFoundException) { $cart = null; } if (null !== $orderId && (null === $cart || (string) $cart->getId() !== (string) $orderId)) { return new JsonResponse([], Response::HTTP_FORBIDDEN); } if (null !== $cart && null !== $cart->getId() && $request->hasSession()) { $session = $request->getSession(); $ownedIds = $session->get(self::OWNED_ORDER_IDS_SESSION_KEY, []); $ownedIds[(string) $cart->getId()] = true; $session->set(self::OWNED_ORDER_IDS_SESSION_KEY, $ownedIds); } return $this->inner->fetchQrCodeFromOrder($request); } public function createPayment(Request $request): Response { return $this->inner->createPayment($request); } public function removeQrCodeFromOrder(Request $request): JsonResponse { return $this->inner->removeQrCodeFromOrder($request); } } ``` #### Step 2. Decorate the thank-you controller Create `src/Controller/Mollie/SecurePageRedirectController.php`: ```php <?php declare(strict_types=1); namespace App\Controller\Mollie; use Sylius\MolliePlugin\Controller\Shop\PageRedirectController; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\RouterInterface; final class SecurePageRedirectController { private const OWNED_ORDER_IDS_SESSION_KEY = 'sylius_mollie.owned_order_ids'; public function __construct( private readonly PageRedirectController $inner, private readonly RouterInterface $router, ) { } public function thankYouAction(Request $request, SessionInterface $session): RedirectResponse { $orderId = $request->get('orderId'); if (null !== $orderId) { $ownedIds = $session->get(self::OWNED_ORDER_IDS_SESSION_KEY, []); if (!isset($ownedIds[(string) $orderId])) { return new RedirectResponse($this->router->generate('sylius_shop_cart_summary')); } } return $this->inner->thankYouAction($request, $session); } } ``` #### Step 3. Register the decorators Append to your project's `config/services.yaml`: ```yaml services: App\Controller\Mollie\SecureQrCodeAction: decorates: sylius_mollie.controller.shop.qr_code public: true arguments: $inner: '@.inner' $cartContext: '@sylius.context.cart' App\Controller\Mollie\SecurePageRedirectController: decorates: sylius_mollie.controller.shop.page_redirect public: true arguments: $inner: '@.inner' $router: '@router' ``` > Both decorators keep `@.inner` and only add an ownership check on `orderId` before handing > the request to the original action, so `createPayment`, `removeQrCodeFromOrder` and the > thank-you redirect all keep their original behaviour and the front-end contract is unchanged. #### Step 4. Clear the cache ```bash bin/console cache:clear ```

CVE-2026-68501 Affected Sylius/mollie plugin Versions

3 component(s)
Fixed Versions:
2.2.83.2.43.3.1
Product / Package Ecosystem Affected Versions Fixed Version
sylius/mollie-plugin
Packagist
< 2.2.8
2.2.8
sylius/mollie-plugin
Packagist
≥ 3.0.0
< 3.2.4
3.2.4
sylius/mollie-plugin
Packagist
≥ 3.3.0
< 3.3.1
3.3.1

References

Frequently Asked Questions

What is CVE-2026-68501?
CVE-2026-68501 is a security vulnerability in Sylius/mollie plugin involving Sylius Mollie Plugin has unauthenticated IDOR that leaks order token and customer PII under CWE-639: Authorization Bypass Through User-Controlled Key.
Which Sylius/mollie plugin versions are affected?
Affected versions include releases prior to 2.2.8, 3.2.4, 3.3.1 across affected packages: sylius/mollie-plugin.
What version fixes CVE-2026-68501?
Upgrading to 2.2.8, 3.2.4, 3.3.1 (or the latest patched release for your respective branch) resolves the vulnerability.
Is sylius/mollie-plugin affected?
Yes, sylius/mollie-plugin is affected in releases prior to 2.2.8, 3.2.4, 3.3.1. Upgrade your dependency to 2.2.8, 3.2.4, 3.3.1 or later.
What is the CVSS score of CVE-2026-68501?
CVE-2026-68501 has a CVSS v3.1 base score of 6.5 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L.
What CWE is associated with CVE-2026-68501?
CVE-2026-68501 is classified under CWE-639: Authorization Bypass Through User-Controlled Key (The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.).
How can I check Packagist dependencies for CVE-2026-68501?
Run the dependency tree command: 'inspect dependencies for sylius/mollie-plugin'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-x83g-979r-f5fh",
  "modified" : "2026-07-31T16:52:59Z",
  "published" : "2026-07-31T16:52:59Z",
  "aliases" : [ "CVE-2026-68501" ],
  "summary" : "Sylius Mollie Plugin has unauthenticated IDOR that leaks order token and customer PII",
  "details" : "### Impact\nTwo unauthenticated Mollie shop endpoints look up orders by a sequential integer `orderId`\nwith no ownership or session check. Chained, they expose customer PII.\n\n`GET /{_locale}/thank-you` (`PageRedirectController::thankYouAction`, route\n`sylius_mollie_shop_thank_you_page_redirect`) loads the order with `findOneBy(['id' => $orderId])`\nand returns a `302` whose `Location` header carries that order's `tokenValue`. Any `orderId`\nthus yields that order's token. A non-existent id dereferences null and returns a `500`. The\nhandler also writes the raw `orderId` into the session.\n\n`GET /{_locale}/get-code` (`QrCodeAction::fetchQrCodeFromOrder`, route\n`sylius_mollie_shop_get_qr_code`) runs the same lookup and returns the order's QR code and id\nas JSON, ignoring the session cart; this is where the front-end got the integer id. A bad id\n`500`s here too.\n\nThat `tokenValue` is the order's only access control. Passed to the Sylius core page\n`GET /{_locale}/register-after-checkout/{tokenValue}` it returns a form pre-filled with the\ncustomer's first name, last name and email. The full attack: enumerate `orderId`, read the\ntoken from the redirect, read the PII, at roughly a 1-in-71 hit rate for guest orders.\n`register-after-checkout` is Sylius core, not the plugin, and trusts the token by design, so\nthe leak is what must be fixed.\n\nNone of the plugin endpoints require a login, session or CSRF token.\n\n### Patches\nFixed in **2.2.8**, **3.2.4** and **3.3.1**. \n\n### Workarounds\nIf you cannot upgrade immediately, patch both endpoints at the project level by decorating\nthe plugin controllers. The decorators enforce ownership before delegating to the original\ncontroller, so no plugin behaviour is lost. They keep the original `orderId` request contract,\nso no front-end or asset changes are required. Works on both 2.2 and 3.x.\n\n#### Step 1. Decorate the QR code controller\nCreate `src/Controller/Mollie/SecureQrCodeAction.php` in your Sylius project:\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controller\\Mollie;\n\nuse Sylius\\Component\\Order\\Context\\CartContextInterface;\nuse Sylius\\Component\\Order\\Context\\CartNotFoundException;\nuse Sylius\\MolliePlugin\\Controller\\Shop\\QrCodeAction;\nuse Symfony\\Component\\HttpFoundation\\JsonResponse;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Response;\n\nfinal class SecureQrCodeAction\n{\n    private const OWNED_ORDER_IDS_SESSION_KEY = 'sylius_mollie.owned_order_ids';\n\n    public function __construct(\n        private readonly QrCodeAction $inner,\n        private readonly CartContextInterface $cartContext,\n    ) {\n    }\n\n    public function fetchQrCodeFromOrder(Request $request): JsonResponse\n    {\n        $orderId = $request->get('orderId');\n\n        try {\n            $cart = $this->cartContext->getCart();\n        } catch (CartNotFoundException) {\n            $cart = null;\n        }\n\n        if (null !== $orderId && (null === $cart || (string) $cart->getId() !== (string) $orderId)) {\n            return new JsonResponse([], Response::HTTP_FORBIDDEN);\n        }\n\n        if (null !== $cart && null !== $cart->getId() && $request->hasSession()) {\n            $session = $request->getSession();\n            $ownedIds = $session->get(self::OWNED_ORDER_IDS_SESSION_KEY, []);\n            $ownedIds[(string) $cart->getId()] = true;\n            $session->set(self::OWNED_ORDER_IDS_SESSION_KEY, $ownedIds);\n        }\n\n        return $this->inner->fetchQrCodeFromOrder($request);\n    }\n\n    public function createPayment(Request $request): Response\n    {\n        return $this->inner->createPayment($request);\n    }\n\n    public function removeQrCodeFromOrder(Request $request): JsonResponse\n    {\n        return $this->inner->removeQrCodeFromOrder($request);\n    }\n}\n```\n\n#### Step 2. Decorate the thank-you controller\nCreate `src/Controller/Mollie/SecurePageRedirectController.php`:\n\n```php\n<?php\n\ndeclare(strict_types=1);\n\nnamespace App\\Controller\\Mollie;\n\nuse Sylius\\MolliePlugin\\Controller\\Shop\\PageRedirectController;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\Request;\nuse Symfony\\Component\\HttpFoundation\\Session\\SessionInterface;\nuse Symfony\\Component\\Routing\\RouterInterface;\n\nfinal class SecurePageRedirectController\n{\n    private const OWNED_ORDER_IDS_SESSION_KEY = 'sylius_mollie.owned_order_ids';\n\n    public function __construct(\n        private readonly PageRedirectController $inner,\n        private readonly RouterInterface $router,\n    ) {\n    }\n\n    public function thankYouAction(Request $request, SessionInterface $session): RedirectResponse\n    {\n        $orderId = $request->get('orderId');\n\n        if (null !== $orderId) {\n            $ownedIds = $session->get(self::OWNED_ORDER_IDS_SESSION_KEY, []);\n\n            if (!isset($ownedIds[(string) $orderId])) {\n                return new RedirectResponse($this->router->generate('sylius_shop_cart_summary'));\n            }\n        }\n\n        return $this->inner->thankYouAction($request, $session);\n    }\n}\n```\n\n#### Step 3. Register the decorators\nAppend to your project's `config/services.yaml`:\n\n```yaml\nservices:\n    App\\Controller\\Mollie\\SecureQrCodeAction:\n        decorates: sylius_mollie.controller.shop.qr_code\n        public: true\n        arguments:\n            $inner: '@.inner'\n            $cartContext: '@sylius.context.cart'\n\n    App\\Controller\\Mollie\\SecurePageRedirectController:\n        decorates: sylius_mollie.controller.shop.page_redirect\n        public: true\n        arguments:\n            $inner: '@.inner'\n            $router: '@router'\n```\n\n> Both decorators keep `@.inner` and only add an ownership check on `orderId` before handing\n> the request to the original action, so `createPayment`, `removeQrCodeFromOrder` and the\n> thank-you redirect all keep their original behaviour and the front-end contract is unchanged.\n\n#### Step 4. Clear the cache\n```bash\nbin/console cache:clear\n```",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "sylius/mollie-plugin"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "2.2.8"
      } ]
    } ]
  }, {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "sylius/mollie-plugin"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "3.0.0"
      }, {
        "fixed" : "3.2.4"
      } ]
    } ]
  }, {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "sylius/mollie-plugin"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "3.3.0"
      }, {
        "fixed" : "3.3.1"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/security/advisories/GHSA-x83g-979r-f5fh"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-68501"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/pull/351"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/pull/352"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/pull/354"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/commit/01316b3ad3cf82e3c5ad160115d0a2cf89174e49"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/commit/153c754486b1bc597b67a90ac07ef71cd7958267"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/commit/d1f7753e92106e8bf3bedcfc61b02ea7b8e1c38a"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/Sylius/MolliePlugin"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/releases/tag/v2.2.8"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/releases/tag/v3.2.4"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/Sylius/MolliePlugin/releases/tag/v3.3.1"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-639" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-07-31T16:52:59Z",
    "nvd_published_at" : "2026-07-30T21:18:13Z"
  }
}