Summary
Sylius Mollie Plugin's payment update webhook fails to verify that a Mollie payment actually belongs to the Sylius order it updates.
As a result, an unauthenticated attacker with any valid paid Mollie payment ID can fraudulently mark another customer's order as paid, without real funds transfer for that order.
Sylius Mollie Plugin's payment update webhook fails to verify that a Mollie payment actually belongs to the Sylius order it updates.
As a result, an unauthenticated attacker with any valid paid Mollie payment ID can fraudulently mark another customer's order as paid, without real funds transfer for that order.
Affected context
This vulnerability appears in Sylius-based e-commerce deployments that integrate the Sylius Mollie Plugin for payment processing.
It specifically affects the POST /{_locale}/update-payment webhook endpoint when it:
- Accepts attacker-controlled
id(Mollie payment identifier) andorderIdparameters - Updates the payment status for the specified Sylius order
- Does not enforce a strict association check between the Mollie payment and the referenced Sylius order
The risk is higher in environments where webhook endpoints are reachable without strong authentication or origin validation.
This vulnerability appears in Sylius-based e-commerce deployments that integrate the Sylius Mollie Plugin for payment processing.
It specifically affects the POST /{_locale}/update-payment webhook endpoint when it:
- Accepts attacker-controlled
id(Mollie payment identifier) andorderIdparameters - Updates the payment status for the specified Sylius order
- Does not enforce a strict association check between the Mollie payment and the referenced Sylius order
The risk is higher in environments where webhook endpoints are reachable without strong authentication or origin validation.
Exploit preconditions
- Attack surface: Publicly exposed
POST /{_locale}/update-paymentwebhook in Sylius Mollie Plugin–backed applications. - Required access: Ability to send HTTP POST requests to the payment update endpoint; possession of any valid paid Mollie payment ID from the same Mollie account or environment.
- Trigger point: Submission of a crafted request where the
idparameter references a paid Mollie transaction and theorderIdparameter references a victim's Sylius order. - Why exploitation is possible: The application trusts the supplied
idandorderIdpair without verifying that the Mollie payment is actually linked to the specified Sylius order, resulting in broken authorization (CWE-639) on the payment resource.
- Attack surface: Publicly exposed
POST /{_locale}/update-paymentwebhook in Sylius Mollie Plugin–backed applications. - Required access: Ability to send HTTP POST requests to the payment update endpoint; possession of any valid paid Mollie payment ID from the same Mollie account or environment.
- Trigger point: Submission of a crafted request where the
idparameter references a paid Mollie transaction and theorderIdparameter references a victim's Sylius order. - Why exploitation is possible: The application trusts the supplied
idandorderIdpair without verifying that the Mollie payment is actually linked to the specified Sylius order, resulting in broken authorization (CWE-639) on the payment resource.
Why this happens
The underlying bug class is broken access control over domain objects, specifically an insecure direct object reference to payment resources.
The plugin treats user-supplied identifiers (id and orderId) as authoritative, updating internal order payment status based solely on the existence and success of the Mollie payment ID.
It does not enforce a binding between the payment record and the Sylius order, so any valid paid payment ID can be misapplied to any order.
This maps to CWE-639, where authorization checks are missing or insufficient for actions on objects referenced by user-controlled identifiers.
The underlying bug class is broken access control over domain objects, specifically an insecure direct object reference to payment resources.
The plugin treats user-supplied identifiers (id and orderId) as authoritative, updating internal order payment status based solely on the existence and success of the Mollie payment ID.
It does not enforce a binding between the payment record and the Sylius order, so any valid paid payment ID can be misapplied to any order.
This maps to CWE-639, where authorization checks are missing or insufficient for actions on objects referenced by user-controlled identifiers.
Potential impact
- Attackers may fraudulently mark pending or unpaid orders as paid without actually paying for those specific orders.
- Merchants could experience direct financial loss due to goods or services being delivered without proper payment.
- Order reconciliation and accounting records may become inaccurate or misleading.
- Trust in the payment process and auditability of transactions can be undermined.
- Subsequent business logic relying on the "paid" status (e.g., order fulfillment, shipping, digital delivery) may be triggered incorrectly.
- Attackers may fraudulently mark pending or unpaid orders as paid without actually paying for those specific orders.
- Merchants could experience direct financial loss due to goods or services being delivered without proper payment.
- Order reconciliation and accounting records may become inaccurate or misleading.
- Trust in the payment process and auditability of transactions can be undermined.
- Subsequent business logic relying on the "paid" status (e.g., order fulfillment, shipping, digital delivery) may be triggered incorrectly.
General mitigation guidance
Effective mitigation focuses on enforcing strong authorization and consistent object relationships in payment flows.
Common secure patterns include:
- Validating that the payment ID received in the webhook is explicitly associated with the Sylius order referenced by
orderId(e.g., by looking up and matching stored payment metadata). - Treating payment and order identifiers as separate domain objects with access checks on both, not just the payment's success state.
- Designing webhook handlers to operate on server-side state, using internally stored mappings between orders and payments rather than accepting arbitrary identifiers from requests.
- Applying defense-in-depth by restricting webhook endpoints to trusted origins or signed payloads, and avoiding unauthenticated state changes where possible.
- Ensuring business logic cannot mark an order as paid unless all required consistency checks between order, customer, and payment are satisfied.
Effective mitigation focuses on enforcing strong authorization and consistent object relationships in payment flows.
Common secure patterns include:
- Validating that the payment ID received in the webhook is explicitly associated with the Sylius order referenced by
orderId(e.g., by looking up and matching stored payment metadata). - Treating payment and order identifiers as separate domain objects with access checks on both, not just the payment's success state.
- Designing webhook handlers to operate on server-side state, using internally stored mappings between orders and payments rather than accepting arbitrary identifiers from requests.
- Applying defense-in-depth by restricting webhook endpoints to trusted origins or signed payloads, and avoiding unauthenticated state changes where possible.
- Ensuring business logic cannot mark an order as paid unless all required consistency checks between order, customer, and payment are satisfied.
How teams detect issues like this
Detection often involves reviewing code and configurations for insecure object references and missing authorization checks around payment updates.
Potential strategies include:
- Static analysis rules that flag handlers using user-supplied IDs (
orderId,paymentId, etc.) to directly load or update domain entities without verifying associations. - Targeted code review of payment integration modules and webhook controllers to confirm that each payment update operation validates order–payment linkage and ownership.
- Logging and monitoring of payment status changes, looking for patterns where multiple distinct orders are marked as paid using the same external payment ID.
- Policy-based checks in CI/CD pipelines to ensure all sensitive endpoints performing state changes require both authentication and proper authorization logic.
- Optional use of automated security testing tools that simulate tampering with object identifiers in payment-related requests.
Detection often involves reviewing code and configurations for insecure object references and missing authorization checks around payment updates.
Potential strategies include:
- Static analysis rules that flag handlers using user-supplied IDs (
orderId,paymentId, etc.) to directly load or update domain entities without verifying associations. - Targeted code review of payment integration modules and webhook controllers to confirm that each payment update operation validates order–payment linkage and ownership.
- Logging and monitoring of payment status changes, looking for patterns where multiple distinct orders are marked as paid using the same external payment ID.
- Policy-based checks in CI/CD pipelines to ensure all sensitive endpoints performing state changes require both authentication and proper authorization logic.
- Optional use of automated security testing tools that simulate tampering with object identifiers in payment-related requests.

