Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as customer with downgradable service
-
DeliveryFire concurrent downgrade requests
-
ExploitEach bypasses unlocked upgradable check
-
ExecutionMultiple credit increments applied
-
ImpactSpend inflated balance on invoices/services
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Concurrency control, locking
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated Paymenter customer account (PR:L) with an active service that is eligible for a downgrade whose proration yields a positive credit refund (the vulnerable branch runs when $price->price <= 0 and the 'credits_on_downgrade' setting is left at its default true). Exploitation is performed by sending concurrent/parallel downgrade requests so multiple threads pass the Service::upgradable read before any credit is committed. Limiting factors: attacker must own a downgradable service, the credits-on-downgrade feature must be enabled (default), and success depends on winning a timing window (multiple simultaneous requests), though this window is easily hit in practice; affects Paymenter <= 1.5.6 only. |
| Impact | This is a genuine but moderate-severity business-logic flaw, not a high-impact system compromise. The vendor CVSS of 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N) correctly captures a network-reachable, authenticated integrity-only issue with no confidentiality or availability impact - despite the 'Information Disclosure' tag, nothing is disclosed. The single most debatable metric is AC: CWE-362 TOCTOU races generally warrant AC:H because success is timing-dependent, yet this particular race is reliably winnable by simply firing several concurrent HTTP requests, which is why the vendor chose AC:L; I assess AC:H (~5.2) while acknowledging the vendor's AC:L (~6.4-6.5) is defensible. No EPSS score, no CISA KEV listing, and no public POC were provided, so exploitation is currently theoretical - there is no public exploit identified at time of analysis. Real-world priority is bounded: exploitation requires an authenticated customer account on a Paymenter instance AND an active downgradable service that yields a credit refund, and impact is financial fraud (inflated store credit) against the operator rather than takeover. Prioritize patching for any billing-facing Paymenter deployment because the fraud is direct and repeatable, but this is not a drop-everything emergency. |
| Exploit ScenarioDerived | An authenticated customer holding an active service that is eligible for a downgrade (producing a proration credit) submits many downgrade requests in parallel. Because Service::upgradable is checked with an unlocked read and no DB::transaction/lockForUpdate spans the check and the $credit->increment('amount', abs($price)) update, each request sees 'no pending upgrade,' creates its own upgrade record, and credits the refund again - multiplying one legitimate refund into N spendable credits usable to pay future invoices or provision services. No public POC is provided, but the race is straightforward to trigger with concurrent requests. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 18, 2026
Concurrent downgrade requests against Paymenter 1.5.6 and earlier can double-spend account credit: any authenticated customer with an active, downgradable service can fire parallel requests that each pass the unpinned Service::upgradable check and each credit the same balance, yielding N refunds for one downgrade. The inflated balance is real, spendable store credit, so an attacker can immediately settle invoices or provision services at the operator's expense; no public exploit code or confirmed active exploitation was identified at time of analysis, and the independent assessment rates this a moderate-severity business-logic flaw rather than a system-compromise vector, since it requires a qualifying service, the default credits-on-downgrade setting, and a race window that must be won. Vendor-released patch: 1.5.7.
RemediationAI
Upgrade to Paymenter 1.5.7, the vendor-released patch that adds the missing DB::beginTransaction() block, lockForUpdate() on the Service and User rows, and a re-validation of the pending-upgrade guard after locking; the fix is visible in commit a42e7f8bafce054ad70de3a2c2ac94d13579f41b and the release at https://github.com/Paymenter/Paymenter/releases/tag/v1.5.7, with advisory context at https://github.com/Paymenter/Paymenter/security/advisories/GHSA-5gmm-hjfj-8ff7. If upgrading cannot be performed immediately, disable the refund path by setting settings.credits_on_downgrade to false, which makes the code complete the downgrade without incrementing user credit, at the cost of removing legitimate pro-rated refunds for all customers; complement this by rate-limiting or serializing the Livewire downgrade endpoint (for example a per-service lock or queue worker concurrency of one) so that parallel requests cannot overlap, and by auditing the service_upgrades and credits tables for multiple pending upgrade rows for a single service or credit balances inconsistent with past downgrades so already-abused accounts can be clawed back. Adding a database-level unique constraint on pending upgrades per service is an effective backstop but will reject legitimate repeat attempts and must be coordinated with application error handling.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in composer, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Paymenter is a PHP/Laravel (Livewire) hosting webshop, distributed as composer/paymenter/paymenter and covered by the CPE cpe:2.3:a:paymenter:paymenter:*:*:*:*:*:*:*:* with no version qualifiers, i.e. every release up to and including 1.5.6. The flaw is a classic time-of-check-to-time-of-use race (CWE-362) in app/Livewire/Services/Upgrade.php::doUpgrade(): eligibility is determined by an unisolated read against the ServiceUpgrade model (an existing pending upgrade row for the service), and only afterwards is the downgrade refund applied via $credit->increment('amount', abs($price->price)) or a newly created user credit record. No DB::transaction, no SELECT ... FOR UPDATE, and no unique constraint serialize the check against the write, so requests hitting the same millisecond all observe "no pending upgrade" and all proceed. The vulnerable branch is the negative-proration path ($price->price <= 0) guarded by the credits_on_downgrade configuration flag (default true). The upstream fix commit a42e7f8bafce054ad70de3a2c2ac94d13579f41b wraps the whole flow in DB::beginTransaction()/DB::commit() with rollback exits, re-reads the Service row via lockForUpdate(), re-validates that no pending upgrade exists after acquiring the lock, and pessimistically locks the User row before touching credits, thereby turning the concurrent read-then-write into a serialized critical section.
Know when Paymenter gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N
Network-reachable authenticated customer (AV:N/PR:L); AC:H because the double-spend is a timing-dependent TOCTOU race; integrity-only (credit inflation), no confidentiality or availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Paymenter is a free and open-source webshop solution for management of hosting services. Prior to 1.5.7, app/Livewire/Services/Upgrade.php::doUpgrade() relies on Service::upgradable to check for a pending service upgrade and later executes $credit->increment('amount', abs($price)) without DB::transaction or lockForUpdate() spanning those operations. An authenticated customer with an active downgradable service can submit concurrent downgrade requests that each observe no pending upgrade, create separate upgrade records, and increment the same account credit balance, producing multiple spendable refunds for one downgrade. This issue is fixed in version 1.5.7.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Race conditions occur when multiple concurrent requests exploit the brief time gap between checking a condition and acting upon it (TOCTOU - Time of Check, Time of Use).
EUVD-2026-83247
GHSA-5gmm-hjfj-8ff7
NVD
CVE.org
EPSS
Exploit-DB