Skip to main content

My Calendar EUVDEUVD-2026-23306

| CVE-2026-40308 HIGH
Authorization Bypass Through User-Controlled Key (CWE-639)
2026-04-16 GitHub_M GHSA-2mvx-f5qm-v2ch
8.8
CVSS 4.0 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Identify site running My Calendar ≤3.7.6
  2. Delivery
    Send unauthenticated POST to admin-ajax.php (mcjs_action, loadupcoming, args with site=N)
  3. Exploit
    parse_str injects arbitrary site into $args
  4. Execution
    switch_to_blog() runs without capability check
  5. Impact
    Extract private events from targeted sub-site (or crash worker on Single Site)

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
Exploitation Conditions

Exploitation requires the My Calendar plugin ≤ 3.7.6 active and reachable at wp-admin/admin-ajax.php, with the request using action=mcjs_action and behavior=loadupcoming plus an args string containing an injected 'site' key (the '|' character is converted to '&' before parse_str, so parameters can be packed into args). No authentication, user interaction, or non-default plugin configuration is needed-the wp_ajax_nopriv_mcjs_action hook exposes it to anonymous users by default. The decisive limiting factor is deployment topology: the cross-tenant information disclosure (reading events from arbitrary sub-sites) only works on WordPress Multisite networks where switch_to_blog() exists; on Single Site installations that function is undefined, so the exact same request yields only an unauthenticated denial of service (500 fatal error) rather than data disclosure.

Impact

The signals conflict and should be weighed rather than taken at face value. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N, VC:H/VA:H) and SSVC (Exploitation: poc, Automatable: yes, Technical Impact: total) both point to an easy, scriptable, unauthenticated attack with serious impact-consistent with the 8.8 score. Publicly available exploit code raises practical concern. However, EPSS is only 0.01% (3rd percentile) and the vulnerability is NOT in CISA KEV, indicating no observed mass exploitation to date. The confidentiality impact (cross-tenant event disclosure) applies ONLY to WordPress Multisite deployments, which are a minority of installs; on far more common Single Site installs the impact is limited to DoS, not data theft. So the 'total' technical impact and VC:H are conditional on a Multisite topology. Net: a genuine, low-effort issue worth prompt patching-especially for Multisite hosts and multi-tenant platforms-but the low EPSS and absence from KEV suggest opportunistic rather than widespread active exploitation at this time.

Exploit ScenarioDerived

An unauthenticated attacker sends a crafted POST to admin-ajax.php with action=mcjs_action, behavior=loadupcoming, and an args string carrying an injected site parameter (e.g., site=2). On a Multisite network, the plugin switches DB context to sub-site 2 and returns its calendar events-including private ones-in the JSON response, letting the attacker enumerate site IDs and harvest events across tenants. Public exploit code exists and the attack is scriptable/automatable; against a Single Site target the same request instead crashes the PHP worker for an unauthenticated DoS.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.0% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Jul 24, 2026

Unauthenticated information disclosure (IDOR) in the My Calendar WordPress plugin (versions ≤ 3.7.6) lets remote attackers read calendar events-including private and hidden ones-from any sub-site on a WordPress Multisite network by injecting an arbitrary site ID into the unauthenticated mcjs_action AJAX endpoint. On Single Site installations the same request triggers an uncaught fatal error, giving an unauthenticated denial-of-service vector. Publicly available exploit code exists, though EPSS remains very low (0.01%) and the flaw is not in CISA KEV. Fixed in version 3.7.7.

RemediationAI

Vendor-released patch: 3.7.7-upgrade the My Calendar plugin to version 3.7.7 or later, which fixes the unvalidated switch_to_blog() call (release: https://github.com/joedolson/my-calendar/releases/tag/v3.7.7; advisory: https://github.com/joedolson/my-calendar/security/advisories/GHSA-2mvx-f5qm-v2ch). If immediate patching is not possible, compensating controls include blocking or restricting unauthenticated access to the wp-admin/admin-ajax.php endpoint for action=mcjs_action at a WAF or reverse proxy-note this may break legitimate front-end 'upcoming events' AJAX loading for anonymous visitors; adding a WAF rule to reject requests whose args parameter contains a 'site' key mitigates the IDOR/switch_to_blog path with less functional impact; and on Single Site installs, rate-limiting admin-ajax.php requests reduces the DoS exposure but does not eliminate the fatal-error trigger. Disabling the plugin entirely is the only complete workaround until 3.7.7 is applied, at the cost of losing calendar functionality.

Affected VersionsENISA

my-calendar < 3.7.7

Affected Packages

composer joedolson/my-calendar fix: 3.7.7
euvd my_calendar fix: 3.7.7

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in composer, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The plugin registers mc_ajax_mcjs_action to the wp_ajax_nopriv_mcjs_action hook, making it reachable by unauthenticated users. When behavior=loadupcoming, the handler takes the attacker-controlled args string and (after sanitize_text_field and a '|'→'&' substitution) passes it directly to PHP's parse_str(), which populates a $args array with arbitrary attacker-supplied key-value pairs. That array flows into my_calendar_upcoming_events() in my-calendar-widgets.php, where a supplied 'site' value is passed straight to WordPress core's switch_to_blog($args['site']) with no capability check (e.g., no Super Admin / manage_network verification). This is a textbook CWE-639 (Authorization Bypass Through User-Controlled Key / IDOR): the sub-site identifier is a direct object reference the application trusts without authorization. The affected component is joedolson/my-calendar (CPE cpe:2.3:a:joedolson:my-calendar:*), and the behavior diverges by deployment: on Multisite, switch_to_blog() exists and changes DB context to the targeted tenant; on Single Site it is undefined, so the call fatals with 'Call to undefined function switch_to_blog()'.

Know when My Calendar gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

GitHub Advisory PRIMARY 8.8 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 9.1 CRITICAL

Unauthenticated network endpoint with no UI (AV:N/AC:L/PR:N/UI:N); cross-tenant event disclosure gives C:H and worker crash gives A:H; no integrity impact and shared WordPress app keeps S:U.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

4
Patch released
Apr 28, 2026 - 21:15 nvd
Patch available
Patch available
Apr 16, 2026 - 22:46 EUVD
CVSS changed
Apr 16, 2026 - 22:22 NVD
8.8 (HIGH)
CVE Published
Apr 16, 2026 - 21:30 nvd
HIGH 8.8

DescriptionGitHub Advisory

My Calendar is a WordPress plugin for managing calendar events. In versions 3.7.6 and below, the mc_ajax_mcjs_action AJAX endpoint, registered for unauthenticated users, passes user-supplied arguments through parse_str() without validation, allowing injection of arbitrary parameters including a site value. On WordPress Multisite installations, this enables an unauthenticated attacker to call switch_to_blog() with an arbitrary site ID and extract calendar events from any sub-site on the network, including private or hidden events. On standard Single Site installations, switch_to_blog() does not exist, causing an uncaught PHP fatal error and crashing the worker thread, creating an unauthenticated denial of service vector. This issue has been fixed in version 3.7.7.

Executive ViewAI

Why It Matters

The My Calendar WordPress plugin (versions 3.7.6 and earlier) contains an unauthenticated vulnerability with publicly available exploit code that allows attackers to access private calendar events across WordPress Multisite networks or trigger denial-of-service attacks on single-site installations. Organizations using this plugin face immediate risk of sensitive calendar information disclosure and service disruption without urgent patching.

Business Impact: High
Compensating Controls

Vendor-released patch: version 3.7.7. Until patches are applied, disable the My Calendar plugin or restrict network access to the mcjs_action AJAX endpoint to authenticated users only.

Threat Intelligence Overview

EPSS Score
0.0%
Top 97% exploitable
Prevalence
Medium
widely used WordPress calendar plugin, but Multisite-only for disclosure
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC Yes
EPSS 0.0%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Out-of-Cycle
Exploitation
Poc
System Exposure· derived
Open
Automatable
Yes
Human Impact
High
Technical Impact
Total

Priority Score

64
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy