Every CVESearch/Get API key

GHSA-78vr-q6cf-c7p6

Craft Commerce: Partial Payment Amount Without Lower Bound Validation

6.9 MediumFix available

Summary

The Order::setPaymentAmount() method accepts any float value without enforcing a minimum positive amount. The PaymentsController casts the user-supplied 'paymentAmount' parameter directly to float with no lower-bound check.

Details

When the store has 'Allow Partial Payment on Checkout' enabled, a user can submit a payment amount of $0.00 or even a negative value, potentially marking orders as paid without a valid transaction.

<img width="690" height="80" alt="image" src="https://github.com/user-attachments/assets/78b653a6-ccae-4ce4-b71b-fc38a7757d73" />

<img width="761" height="200" alt="image" src="https://github.com/user-attachments/assets/665a235f-62c2-45fe-aa41-c3f266881c77" />

PoC

Complete instructions, including specific configuration details, to reproduce the vulnerability. <img width="606" height="144" alt="image" src="https://github.com/user-attachments/assets/a04a6de2-7c5f-4837-aed6-58756e246b80" />

Impact

On stores with partial payment enabled, a customer may be able to set an arbitrarily small payment amount. Gateway behavior varies — some will process $0.00 transactions, effectively giving free order fulfillment.

Remediation

<img width="718" height="98" alt="image" src="https://github.com/user-attachments/assets/aa64b696-9749-45e4-97f6-8d7299cdf1d6" />

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
None
Integrity
Low
Availability
None

What each source reports

GitHub Advisories Score used6.9

Craft Commerce: Partial Payment Amount Without Lower Bound Validation

Summary

The Order::setPaymentAmount() method accepts any float value without enforcing a minimum positive amount. The PaymentsController casts the user-supplied 'paymentAmount' parameter directly to float with no lower-bound check.

Details

When the store has 'Allow Partial Payment on Checkout' enabled, a user can submit a payment amount of $0.00 or even a negative value, potentially marking orders as paid without a valid transaction.

<img width="690" height="80" alt="image" src="https://github.com/user-attachments/assets/78b653a6-ccae-4ce4-b71b-fc38a7757d73" />

<img width="761" height="200" alt="image" src="https://github.com/user-attachments/assets/665a235f-62c2-45fe-aa41-c3f266881c77" />

PoC

Complete instructions, including specific configuration details, to reproduce the vulnerability. <img width="606" height="144" alt="image" src="https://github.com/user-attachments/assets/a04a6de2-7c5f-4837-aed6-58756e246b80" />

Impact

On stores with partial payment enabled, a customer may be able to set an arbitrarily small payment amount. Gateway behavior varies — some will process $0.00 transactions, effectively giving free order fulfillment.

Remediation

<img width="718" height="98" alt="image" src="https://github.com/user-attachments/assets/aa64b696-9749-45e4-97f6-8d7299cdf1d6" />

Record
GHSA-78vr-q6cf-c7p6
CVSS 4.0
6.9 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-20, CWE-1284
Updated
2026-11-02
OSV6.9

Craft Commerce: Partial Payment Amount Without Lower Bound Validation

Summary

The Order::setPaymentAmount() method accepts any float value without enforcing a minimum positive amount. The PaymentsController casts the user-supplied 'paymentAmount' parameter directly to float with no lower-bound check.

Details

When the store has 'Allow Partial Payment on Checkout' enabled, a user can submit a payment amount of $0.00 or even a negative value, potentially marking orders as paid without a valid transaction.

<img width="690" height="80" alt="image" src="https://github.com/user-attachments/assets/78b653a6-ccae-4ce4-b71b-fc38a7757d73" />

<img width="761" height="200" alt="image" src="https://github.com/user-attachments/assets/665a235f-62c2-45fe-aa41-c3f266881c77" />

PoC

Complete instructions, including specific configuration details, to reproduce the vulnerability. <img width="606" height="144" alt="image" src="https://github.com/user-attachments/assets/a04a6de2-7c5f-4837-aed6-58756e246b80" />

Impact

On stores with partial payment enabled, a customer may be able to set an arbitrarily small payment amount. Gateway behavior varies — some will process $0.00 transactions, effectively giving free order fulfillment.

Remediation

<img width="718" height="98" alt="image" src="https://github.com/user-attachments/assets/aa64b696-9749-45e4-97f6-8d7299cdf1d6" />

Record
GHSA-78vr-q6cf-c7p6
CVSS 4.0
6.9 MediumCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
Weakness
CWE-1284, CWE-20
Updated
2026-11-02

Affected packages

Affected packages
PackageAffectedFixed
craftcms/commerce
Packagist
5.0.0 to 5.6.4
5.6.5
craftcms/commerce
Packagist
4.0.0 to 4.11.1
4.11.2
craftcms/commerce
Packagist
5.0.0 up to 5.6.5, plus listed versions
5.0.15.0.105.0.10.15.0.115.0.11.1
Show 45 moreShow less
5.0.125.0.12.15.0.12.25.0.135.0.145.0.155.0.165.0.16.15.0.16.25.0.175.0.185.0.195.0.25.0.35.0.45.0.55.0.65.0.75.0.85.0.95.1.05.1.0-beta.15.1.0-beta.25.1.0-beta.35.1.0.15.1.15.1.25.1.35.1.45.2.05.2.15.2.105.2.115.2.125.2.12.15.2.25.2.2.15.2.35.2.45.2.55.2.65.2.75.2.85.2.95.2.9.1
5.6.5
craftcms/commerce
Packagist
4.0.0 up to 4.11.2, plus listed versions
4.0.14.0.24.0.34.0.44.1.0
Show 45 moreShow less
4.1.14.1.24.1.34.10.04.10.14.10.24.11.04.11.0.14.11.14.2.04.2.14.2.104.2.114.2.24.2.34.2.44.2.54.2.5.14.2.64.2.74.2.84.2.94.3.04.3.14.3.24.3.34.4.04.4.14.4.1.14.5.04.5.14.5.1.14.5.24.5.34.5.44.6.04.6.14.6.104.6.114.6.124.6.134.6.144.6.24.6.3.14.6.4
4.11.2

History

History
RecordedChangedSources
first indexedGitHub Advisories, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

GHSA-78vr-q6cf-c7p6 is a medium vulnerability (CVSS 6.9) in craftcms/commerce, published June 19, 2026. No source lists public exploit code. Fixed in craftcms/commerce 5.6.5.

References

This page doesn't list everything

Left out here: 66 versions. The JSON record has them.

MoveEnter Open