Executive brief
Paymenter is an open-source platform used to manage hosting services and digital storefronts. A flaw in how the system handles credit payments allows users to bypass their balance limits by submitting multiple payment requests at the exact same time. This could result in customers receiving services or digital goods without sufficient funds, leading to direct financial loss for the hosting provider.
Technical details
A race condition exists in the payWithCredit() function within app/Livewire/Invoices/Show.php. The application attempts to use a pessimistic row lock (lockForUpdate()) to protect the user's credit balance; however, this lock is executed outside of a formal database transaction. In MySQL and MariaDB environments, row-level locks are ignored unless they are enclosed within a transaction. An authenticated attacker can exploit this by sending concurrent payment requests, causing the application to read the same sufficient balance for multiple transactions before any single transaction has deducted the funds. This results in a 'double-spend' scenario where services are provisioned via ExtensionHelper::addPayment() despite insufficient total credit. The issue is resolved in version 1.5.5.
Affected products
- Paymenter Paymenter < 1.5.5
Timeline
- 2026-06-30: advisory: GitHub security advisory published by developer
- 2026-07-20: disclosed: CVE-2026-55219 published to NVD
- 2026-07-20: patched: Fix released in version 1.5.5