CVE-2026-71537:
PHP 취약성 분석 및 완화
개요
CVE-2026-71537 is a credit-refund double-spend race condition in Paymenter, a free and open-source hosting service management webshop. The vulnerability exists in app/Livewire/Services/Upgrade.php::doUpgrade() and allows authenticated customers to trigger multiple credit refunds for a single service downgrade by submitting concurrent requests. It affects all Paymenter versions up to and including 1.5.6, and was fixed in version 1.5.7. The advisory was originally published on August 13, 2026, and added to the GitHub Advisory Database on September 18, 2026. It carries a CVSS v3.1 base score of 6.5 (Medium) (Github Advisory).
기술적 세부 사항
The root cause is a classic Time-of-Check to Time-of-Use (TOCTOU) race condition (CWE-362) in the doUpgrade() method. The application checks for a pending upgrade using an unlocked read (Service::upgradable) without wrapping the check and subsequent credit update in a DB::transaction or using lockForUpdate(). As a result, multiple concurrent HTTP requests can each observe no pending upgrade at the same millisecond, pass the eligibility check, independently insert their own ServiceUpgrade records, and each execute $credit->increment('amount', abs($price)), cumulatively inflating the user's credit balance by N times the legitimate refund amount. The fix (commit a42e7f8) wraps the entire operation in DB::beginTransaction() and applies lockForUpdate() on both the service and user rows before re-validating eligibility (Github Advisory, Patch Commit).
영향
Successful exploitation allows any authenticated customer with an active, downgradable service to arbitrarily inflate their spendable account credit balance. The inflated credits function as real store credit and can be immediately used to pay future platform invoices or provision additional services at no cost, resulting in direct financial and resource loss to the platform operator. There is no confidentiality or availability impact; the integrity impact is high due to unauthorized manipulation of financial account balances (Github Advisory).
악용 가능성
No public proof-of-concept exploit code has been identified, and there is no evidence of in-the-wild exploitation at this time. The vulnerability requires only a low-privilege authenticated account and low attack complexity, making it accessible to any registered customer on an affected platform. The EPSS score is 0.0, and the vulnerability is not listed in the CISA Known Exploited Vulnerabilities catalog (Github Advisory).
착취 단계
- Obtain an authenticated account: Register or log in as a customer on a Paymenter instance running version 1.5.6 or earlier.
- Identify a downgradable service: Locate an active service in the account that is eligible for downgrade (i.e., the target product has a lower price than the current plan, resulting in a negative price/credit refund).
- Prepare concurrent requests: Using a tool such as
curl, a custom script, or a race condition testing tool (e.g., Burp Suite's Turbo Intruder), prepare multiple identical HTTP POST requests targeting thedoUpgrade()Livewire endpoint with the downgrade parameters. - Send requests simultaneously: Fire all prepared requests in parallel within the same millisecond window so that each request reads the database before any pending upgrade record is inserted by another request.
- Observe credit inflation: Each concurrent request passes the eligibility check, inserts its own
ServiceUpgraderecord, and increments the credit balance. The account balance is inflated by N × refund amount, where N is the number of successful concurrent requests. - Spend inflated credits: Use the artificially inflated credit balance to pay for new services or invoices on the platform at no real cost (Github Advisory, Patch Commit).
타협의 징후
- Database: Multiple
ServiceUpgraderecords withstatus = PENDINGfor the sameservice_idcreated within milliseconds of each other. - Database: Abnormally large or rapidly increasing
amountvalues in the user credits table for a singlecurrency_codewithin a short time window. - Logs: Multiple simultaneous or near-simultaneous POST requests to the Paymenter Livewire
doUpgradeendpoint from the same authenticated session or user ID in application/web server access logs. - Application Behavior: A user's credit balance significantly exceeding the expected proration refund for a single downgrade event.
- Audit Trail: Multiple
ServiceUpgradeinsert events for the same service in the application's event/audit log within the same second (Github Advisory).
완화 및 해결 방법
Operators should upgrade Paymenter to version 1.5.7 immediately, which wraps the doUpgrade() logic in a DB::transaction with lockForUpdate() on both the service and user rows, preventing concurrent requests from bypassing the eligibility check. No configuration-based workaround is available for unpatched versions; upgrading is the only effective remediation. As an interim measure, operators may consider monitoring credit balance changes for anomalies and temporarily disabling the service downgrade feature if upgrading is not immediately possible (Github Advisory, v1.5.7 Release).
추가 자료
근원: 이 보고서는 AI를 사용하여 생성되었습니다.
관련 PHP 취약점:
무료 취약성 평가
클라우드 보안 태세를 벤치마킹합니다
9개의 보안 도메인에서 클라우드 보안 관행을 평가하여 위험 수준을 벤치마킹하고 방어의 허점을 식별합니다.
추가 Wiz 리소스
맞춤형 데모 받기
맞춤형 데모 신청하기
"내가 본 최고의 사용자 경험은 클라우드 워크로드에 대한 완전한 가시성을 제공합니다."
"Wiz는 클라우드 환경에서 무슨 일이 일어나고 있는지 볼 수 있는 단일 창을 제공합니다."
"우리는 Wiz가 무언가를 중요한 것으로 식별하면 실제로 중요하다는 것을 알고 있습니다."