CVE-2026-68501
Sylius Mollie Plugin: Unauthenticated IDOR leaks order token and customer PII
Sylius Mollie Plugin provides Mollie payment integration for Sylius applications. Prior to 2.2.8, 3.2.4, and 3.3.1, Sylius Mollie Plugin's GET /{_locale}/thank-you PageRedirectController::thankYouAction and GET /{_locale}/get-code QrCodeAction::fetchQrCodeFromOrder endpoints look up sequential orderId values without ownership or session checks, exposing order tokenValue values that can be used with GET /{_locale}/register-after-checkout/{tokenValue} to view customer first name, last name, and email. This issue is fixed in 2.2.8, 3.2.4, and 3.3.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
6.5
Sylius Mollie Plugin: Unauthenticated IDOR leaks order token and customer PII
Sylius Mollie Plugin provides Mollie payment integration for Sylius applications. Prior to 2.2.8, 3.2.4, and 3.3.1, Sylius Mollie Plugin's GET /{_locale}/thank-you PageRedirectController::thankYouAction and GET /{_locale}/get-code QrCodeAction::fetchQrCodeFromOrder endpoints look up sequential orderId values without ownership or session checks, exposing order tokenValue values that can be used with GET /{_locale}/register-after-checkout/{tokenValue} to view customer first name, last name, and email. This issue is fixed in 2.2.8, 3.2.4, and 3.3.1.
- Record
CVE-2026-68501- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
EUVDEUVD-2026-51301
6.5
Sylius Mollie Plugin provides Mollie payment integration for Sylius applications. Prior to 2.2.8, 3.2.4, and 3.3.1, Sylius Mollie Plugin's GET /{_locale}/thank-you PageRedirectController::thankYouAction and GET /{_locale}/get-code QrCodeAction::fetchQrCodeFromOrder endpoints look up sequential orderId values without ownership or session checks, exposing order tokenValue values that can be used with GET /{_locale}/register-after-checkout/{tokenValue} to view customer first name, last name, and email. This issue is fixed in 2.2.8, 3.2.4, and 3.3.1.
- Record
EUVD-2026-51301- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-x83g-979r-f5fh
6.5
Sylius Mollie Plugin has unauthenticated IDOR that leaks order token and customer PII
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
500s 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
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
declare(strict_types=1);
namespace App\Controller\Mollie;
use…
- Record
GHSA-x83g-979r-f5fh- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
NVD
6.5
Sylius Mollie Plugin provides Mollie payment integration for Sylius applications. Prior to 2.2.8, 3.2.4, and 3.3.1, Sylius Mollie Plugin's GET /{_locale}/thank-you PageRedirectController::thankYouAction and GET /{_locale}/get-code QrCodeAction::fetchQrCodeFromOrder endpoints look up sequential orderId values without ownership or session checks, exposing order tokenValue values that can be used with GET /{_locale}/register-after-checkout/{tokenValue} to view customer first name, last name, and email. This issue is fixed in 2.2.8, 3.2.4, and 3.3.1.
- Record
CVE-2026-68501- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
OSV
6.5
Sylius Mollie Plugin: Unauthenticated IDOR leaks order token and customer PII
Sylius Mollie Plugin provides Mollie payment integration for Sylius applications. Prior to 2.2.8, 3.2.4, and 3.3.1, Sylius Mollie Plugin's GET /{_locale}/thank-you PageRedirectController::thankYouAction and GET /{_locale}/get-code QrCodeAction::fetchQrCodeFromOrder endpoints look up sequential orderId values without ownership or session checks, exposing order tokenValue values that can be used with GET /{_locale}/register-after-checkout/{tokenValue} to view customer first name, last name, and email. This issue is fixed in 2.2.8, 3.2.4, and 3.3.1.
- Record
CVE-2026-68501- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
OSVGHSA-x83g-979r-f5fh
6.5
Sylius Mollie Plugin has unauthenticated IDOR that leaks order token and customer PII
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
500s 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
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
declare(strict_types=1);
namespace App\Controller\Mollie;
use…
- Record
GHSA-x83g-979r-f5fh- CVSS 3.1
- 6.5 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:L - Weakness
- CWE-639
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
sylius/mollie-pluginPackagist |
before 2.2.8 | 2.2.8 |
sylius/mollie-pluginPackagist |
3.0.0 up to 3.2.4 | 3.2.4 |
sylius/mollie-pluginPackagist |
3.3.0 up to 3.3.1 | 3.3.1 |
sylius/mollie-pluginPackagist |
before 2.2.8, plus listed versions v0.1.0v1.0.0v1.0.1v1.0.2v2.0.0 Show 12 moreShow lessv2.0.1v2.0.2v2.1.0v2.1.1v2.2.0v2.2.1v2.2.2v2.2.3v2.2.4v2.2.5v2.2.6v2.2.7 |
2.2.8 |
sylius/mollie-pluginPackagist |
3.0.0 up to 3.2.4, plus listed versions v3.0.0v3.0.1v3.0.2v3.0.3v3.1.0 Show 6 moreShow lessv3.1.1v3.1.2v3.2.0v3.2.1v3.2.2v3.2.3 |
3.2.4 |
sylius/mollie-pluginPackagist |
3.3.0 up to 3.3.1, plus listed versions v3.3.0 |
3.3.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-68501 is a medium vulnerability (CVSS 6.5) in Sylius Mollieplugin, published July 30, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.87%, the 59th percentile. Fixed in sylius/mollie-plugin 2.2.8.
References
github.com/Sylius/MolliePlugin/security/advisories/GHSA-x83g-979r-f5fh
github.com/Sylius/MolliePlugin/pull/351
github.com/Sylius/MolliePlugin/pull/352
github.com/Sylius/MolliePlugin/pull/354
github.com/Sylius/MolliePlugin/commit/01316b3ad3cf82e3c5ad160115d0a2cf89174e49
github.com/Sylius/MolliePlugin/commit/153c754486b1bc597b67a90ac07ef71cd7958267
Show 8 moreShow less
github.com/Sylius/MolliePlugin/commit/d1f7753e92106e8bf3bedcfc61b02ea7b8e1c38a
github.com/Sylius/MolliePlugin/releases/tag/v2.2.8
github.com/Sylius/MolliePlugin/releases/tag/v3.2.4
github.com/Sylius/MolliePlugin/releases/tag/v3.3.1
nvd.nist.gov/vuln/detail/CVE-2026-68501
github.com/advisories/GHSA-x83g-979r-f5fh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/68xxx/CVE-2026-68501.json
github.com/Sylius/MolliePlugin
Left out here: the rest of 2 source descriptions. The JSON record has them.