If your website accepts online payments and uses a popular open-source Laravel plugin called goodoneuz/pay-uz, a stranger on the internet — with no account, no password, and no special skills — could right now be rewriting the code that handles your customers' money.
Who's at Risk — and How Big Is This?
The goodoneuz/pay-uz package is a payment integration library for Laravel, one of the most widely-used web application frameworks in the world. The package connects e-commerce sites and web apps — particularly those serving markets in Central Asia and Uzbekistan — to payment processing systems like Payme, Click, and Uzum. Any website running version 2.2.24 or earlier of this package is fully exposed to remote takeover.
While precise install counts are difficult to pin down, the package is publicly distributed via Packagist, PHP's central package repository, and is integrated into live commerce platforms handling real customer transactions and financial data. That means real businesses, real customers, and real money are on the line. The vulnerability carries a CVSS score of 9.8 out of 10 — as close to "worst possible" as it gets on the industry-standard severity scale.
What an Attacker Can Actually Do to Your Site
Imagine you run an online shop. Behind the scenes, when a customer clicks "pay," your website runs a small piece of software — a payment hook — that coordinates everything: confirming the transaction, updating your inventory, sending the receipt. These hooks are trusted, automatic, and almost always invisible to you. Now imagine a stranger can walk in through an unlocked back door and swap out that trusted piece of software for their own malicious version. The next time any customer makes a purchase, your site executes the attacker's code instead of yours. That's exactly what this vulnerability enables.
The unlocked back door in this case is an administrative web endpoint — a URL baked into the package that's supposed to let authorized administrators update payment configuration files. The problem is that the developers forgot to put a lock on it. There is no login required, no token, no verification of any kind. Anyone who knows the URL — and after this disclosure, everyone does — can send a request to it and write whatever code they want directly into those payment hook files on your server.
Once that malicious code is planted, it sits quietly until the next legitimate payment triggers it. At that point, your own server executes the attacker's instructions with the same level of trust and access your application normally has. Attackers could steal customer data, siphon payment credentials, install persistent backdoors, pivot deeper into your network, or simply destroy everything. This class of attack is called Remote Code Execution, and in the security world, it's the scenario that keeps defenders up at night — because once it happens, you can assume the attacker owns everything the compromised application can touch.
The Technical Detail That Makes This So Severe
For security researchers and engineers auditing their own codebases: the root cause is a combination of two failures colliding at the same endpoint. The route /payment/api/editable/update is registered using Laravel's Route::any() method — meaning it accepts all HTTP verbs — and is bound with zero authentication middleware. User-supplied input from that request is passed directly into PHP's file_put_contents() function, writing attacker-controlled content into existing PHP hook files on disk. Those files are later loaded into execution via PHP's require() statement during normal payment processing. This is a textbook unauthenticated arbitrary file write leading to remote code execution vulnerability chain — no memory corruption, no exotic technique required, just an open door and a write call. The vulnerability is tracked as CVE-2026-31843 with a CVSS 3.1 base score of 9.8 (Critical).
Has This Been Exploited? What Do We Know?
As of publication, there is no confirmed evidence of active exploitation in the wild — no known victims, no observed attack campaigns, and no proof-of-concept exploit code has been publicly released. However, the security community's standard warning applies with particular urgency here: vulnerabilities of this type, affecting payment infrastructure, with no authentication barrier whatsoever, attract opportunistic attackers quickly once they become public knowledge. The window between disclosure and active exploitation for critical, easy-to-exploit bugs like this one is historically measured in hours to days, not weeks.
The vulnerability was identified through security research into the package's source code. The nature of the flaw — an unauthenticated endpoint with direct file-write capability — is the kind of issue that automated vulnerability scanners and manual code auditors can both find with relative ease, which further elevates the urgency of patching.
What You Need to Do Right Now
If you maintain, develop, or are responsible for any Laravel application that processes payments, take these three steps immediately:
-
Update the package today. Open your project's
composer.jsonfile and updategoodoneuz/pay-uzto a version above 2.2.24. Runcomposer update goodoneuz/pay-uzin your terminal. If a patched release is not yet available from the vendor, treat the absence of an update as an emergency escalation — contact the maintainers directly and consider temporarily disabling the package entirely until a fix is issued. -
Audit your payment hook files immediately. Navigate to the directory where your pay-uz hook files are stored and review their contents. Look for anything unfamiliar — unexpected PHP code, encoded strings (especially anything that looks like scrambled text using
base64_decodeoreval()), or function calls you didn't write. If you find anything suspicious, treat your server as compromised, rotate all credentials, and engage an incident response process. Compare file modification timestamps against your deployment history as a quick triage step. -
Implement a Web Application Firewall (WAF) rule as a temporary barrier. Even before patching, you can reduce exposure by blocking external access to the path
/payment/api/editable/updateat your web server or WAF layer. In Nginx, this can be done with alocationblock returning a 403. In Apache, use a<Location>directive. Cloud WAF users on platforms like Cloudflare or AWS WAF can create a custom rule blocking requests to that specific URI path. This is a bandage, not a cure — it does not replace patching — but it buys you critical time.
CVE: CVE-2026-31843 | CVSS: 9.8 Critical | Affected versions: goodoneuz/pay-uz <= 2.2.24 | Category: Unauthenticated Remote Code Execution | Exploitation status: No active exploitation confirmed at time of publication