← Back to Feed CACHED · 2026-09-13 03:14:36 · CACHE_KEY CVE-2026-78006
CVE-2026-78006 · CWE-502 · Disclosed 2026-09-12

The The Events Calendar plugin for WordPress is vulnerable to Remote Code Execution in all versions up to

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Leaving the back door unlocked because you thought the welcome mat was just decorative

CVE-2026-78006 is an unauthenticated PHP object injection → deserialization → RCE chain in The Events Calendar plugin for WordPress, affecting all versions through 6.17.4. The vulnerability lives in Service_Provider.php (line 255) within the V2 Widgets subsystem. An attacker posts a crafted comment containing malicious block markup on any event page. WordPress's moderation-hash mechanism lets the commenter immediately view their own pending comment — this triggers the plugin's V2 single-event template to run do_blocks() over the buffered comment HTML, reaching is_safe_widget_instance(). The safety check is bypassable because PHP fires magic methods during pre-parse, and enable_rendering_widget_copied() forges a valid wp_hash integrity attribute, allowing the payload to reach unserialize() and execute arbitrary code. The fixed version is 6.17.4.1, released 2026-09-10.

The vendor's CRITICAL / 9.8 rating is justified and, if anything, slightly generous in the CVSS vector by marking AC:L. The one real prerequisite — comments must be enabled on event post types — is the WordPress default. The V2 template is also the default. With ~800,000 active installs and a public PoC already circulating (DeadExpl0it), this is a textbook mass-exploitation candidate. The only reason it hasn't hit KEV yet is that it was disclosed *yesterday*. noisgate agrees with CRITICAL.

"Unauthenticated RCE via comment injection on 800K WordPress sites; public PoC, patch now."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Identify target running The Events Calendar

Attacker fingerprints WordPress sites with the plugin active via /wp-content/plugins/the-events-calendar/ path probing or the tribe_events REST endpoint. Shodan/FOFA dorks for The Events Calendar are trivial. Automated scanners (the DeadExpl0it PoC supports multi-target concurrency) can sweep thousands of sites in minutes.
Conditions required:
  • Target runs WordPress with The Events Calendar ≤6.17.4
Where this breaks in practice:
  • Plugin must be installed and active — but 800K installs means a large target surface
Detection/coverage: WAF rules detecting tribe_events enumeration; WordPress plugin fingerprinting in attack surface management tools
STEP 02

Post crafted comment with malicious block markup

Attacker submits a comment on any event post containing a serialized PHP object payload embedded inside WordPress block comment syntax (<!-- wp:... -->). No authentication is required — WordPress allows anonymous commenting by default. The comment enters the moderation queue but the attacker receives a moderation-hash URL in the response.
Conditions required:
  • Comments are enabled on the event post type (WordPress default)
  • Event posts are publicly visible
Where this breaks in practice:
  • Sites that have globally disabled comments or use a third-party comment system (Disqus, etc.) are not reachable via this path
  • Some WAFs may block serialized PHP objects in POST bodies
Detection/coverage: Web application firewalls with PHP serialization payload signatures; ModSecurity CRS rule 942100+ may flag serialized objects
STEP 03

Trigger do_blocks() via moderation-hash URL

The attacker visits the moderation-hash URL returned by WordPress after comment submission. This renders the single-event page with the pending comment included in the output buffer. The V2 single-event template calls do_blocks() over the buffered HTML, which processes the attacker's injected block markup and routes it into the widget rendering pipeline.
Conditions required:
  • V2 single-event template is active (default since Events Calendar 5.x)
Where this breaks in practice:
  • Sites running legacy V1 templates are not vulnerable via this path — but V1 is deprecated and rare
Detection/coverage: Server-side request logging showing moderation-hash URL access from non-subscriber IPs
STEP 04

Bypass is_safe_widget_instance and forge wp_hash

The malicious block markup triggers enable_rendering_widget_copied(), which forges a valid wp_hash integrity attribute for the widget instance. This satisfies the is_safe_widget_instance() check. PHP's magic methods (__wakeup, __destruct) fire during the pre-parse phase of unserialize(), before the safety validation can reject the object.
Conditions required:
  • PHP magic methods available in loaded classes (standard WordPress + plugin autoloader)
Where this breaks in practice:
  • Requires a valid gadget chain — but the PoC already ships one
Detection/coverage: PHP runtime monitoring (e.g., Snuffleupagus unserialize protection) can block dangerous magic method invocations
STEP 05

Achieve Remote Code Execution

The deserialized object's magic methods execute attacker-controlled PHP code on the web server with the privileges of the PHP process (typically www-data or apache). The public PoC deploys a webshell via plugin installation and creates a WordPress administrator account. From here the attacker has persistent access to the host, can read wp-config.php (database credentials), pivot to the database, or use the compromised server for lateral movement.
Conditions required:
  • PHP process has write access to the WordPress directory (standard)
Where this breaks in practice:
  • Read-only filesystem deployments (containers, some managed hosting) limit persistence but not initial code execution
  • Hardened PHP configurations (disable_functions, open_basedir) may limit post-exploitation
Detection/coverage: EDR/HIDS detecting webshell writes; file integrity monitoring on wp-content/plugins/; anomalous WordPress admin account creation in audit logs
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNo confirmed campaigns yet. Disclosed 2026-09-12 (yesterday). KEV listing is likely imminent given the PoC availability and zero-auth requirement.
Proof-of-ConceptPublic. DeadExpl0it/CVE-2026-78006-POC — weaponized exploit with multi-target scanning, webshell deployment, and admin account creation. Telegram contact: @soldout0O.
EPSS Score0.00778 (0.778%), ~46th percentile. Expected to rise sharply as scanner activity increases post-PoC release.
KEV StatusNot listed as of 2026-09-13. Given the zero-day window and public PoC, expect addition within days if scanning activity materializes.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — 9.8. Network-accessible, no privileges, no user interaction. The only debatable metric is AC:L vs AC:H for the comment prerequisite, but since comments are default-on, AC:L is defensible.
Affected VersionsThe Events Calendar all versions ≤ 6.17.4. The vulnerable code is in src/Tribe/Views/V2/Widgets/Service_Provider.php (line 255).
Fixed Version6.17.4.1 (released 2026-09-10, two days before public disclosure). Available via WordPress plugin updates.
Installed Base / Exposure~800,000 active installs per wordpress.org. The Events Calendar is the dominant WordPress event plugin (~9× the next competitor). Enterprise WordPress deployments with event functionality are highly likely to have this plugin.
Disclosure TimelinePatch released 2026-09-10, CVE published 2026-09-12, PoC appeared same day. This is a narrow patch-first window — most auto-update-disabled sites are still vulnerable.
Researcher / ReporterNot publicly credited in the advisory. PoC author DeadExpl0it is distinct from the original reporter.
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.4/10)

The single most decisive factor is unauthenticated, zero-interaction RCE with a public weaponized exploit against 800,000 installs. The only prerequisite — comments enabled on events — is the WordPress default configuration, providing negligible friction against mass exploitation.

HIGH Vulnerability existence and exploitability confirmed via public PoC and vendor patch
MEDIUM In-the-wild exploitation status (none confirmed yet, but PoC is weaponized and 1 day old)
HIGH Affected version range and fix version confirmed via wordpress.org trac

Why this verdict

  • Unauthenticated network access: AV:N/PR:N/UI:N — no credentials, no phishing, no user click required. This is the lowest-friction initial access vector possible.
  • Weaponized public PoC: The DeadExpl0it exploit is not a proof-of-concept — it is a turnkey exploitation tool with multi-target scanning, webshell deployment, and admin account creation. Script kiddies can run this today.
  • Massive attack surface: 800,000 active installs. The Events Calendar is the dominant plugin in its category. Enterprise WordPress fleets frequently include this plugin for conference sites, HR portals, and marketing pages.
  • Default-vulnerable configuration: Comments are enabled by default in WordPress. The V2 template is the default since Events Calendar 5.x. The vast majority of installs meet all prerequisites without any administrator misconfiguration.
  • Role multiplier: WordPress servers occupy the web/application tier (role b — typical). However, wp-config.php contains database credentials, and enterprise WordPress instances often connect to shared MySQL/MariaDB backends hosting multiple sites. Compromise of one instance can pivot to the database tier, reaching tenant-to-multi-tenant blast radius. For organizations using WordPress as their public web presence (marketing, investor relations, e-commerce), the reputational and data-exposure blast radius is significant. While this is not a domain controller or hypervisor, the installed base is large enough and the chain is frictionless enough that CRITICAL is warranted on volume and ease alone.

Why not higher?

A 9.8 would require literally zero prerequisites. The comment-enabled requirement, while default-on, does technically narrow the population slightly. Some managed WordPress hosts (WP Engine, Pantheon) deploy with read-only filesystems that limit persistence. The scope is Unchanged (S:U), meaning no cross-component impact within the CVSS model. noisgate settles at 9.4.

Why not lower?

Downgrading below CRITICAL would require meaningful friction in the attack chain — there is almost none. The exploit is unauthenticated, the PoC is weaponized and public, the install base is massive, and the default configuration is vulnerable. Even the comment prerequisite fails as a friction point because WordPress ships with comments on. The 1-day-old disclosure means the patch adoption rate is near zero, maximizing the window of exposure.

05 · Compensating Control

What to do — in priority order.

  1. Disable comments on all event post types immediately — This eliminates the attack vector entirely by preventing the initial payload delivery. In WordPress admin: Settings → Discussion → uncheck 'Allow people to submit comments on new posts', or use WP-CLI: wp option update default_comment_status closed. For existing events: wp post list --post_type=tribe_events --format=ids | xargs -I{} wp post update {} --comment_status=closed. Deploy within the noisgate CRITICAL mitigation SLA of 3 days.
  2. Deploy WAF rule blocking serialized PHP objects in comment bodies — Add a ModSecurity/Cloudflare/AWS WAF rule matching PHP serialization patterns (O:[0-9]+:", a:[0-9]+:{) in POST request bodies to /wp-comments-post.php. This catches the payload before it reaches WordPress. Deploy within 3 days.
  3. Enable PHP unserialize protection via Snuffleupagus or disable_functions — If running PHP with Snuffleupagus, enable the sloppy_comparison and unserialize_hmac features to prevent arbitrary deserialization. Alternatively, if feasible, restrict dangerous PHP functions. Deploy within 3 days.
  4. Apply the vendor patch (6.17.4.1) — Update The Events Calendar to 6.17.4.1 via WordPress admin or WP-CLI: wp plugin update the-events-calendar. This is the definitive fix. If auto-updates are disabled, push this manually. Target completion within the noisgate CRITICAL remediation SLA of 90 days, but realistically push for this week given the weaponized PoC.
  5. Audit for indicators of compromise — Check for unexpected WordPress admin accounts, new plugin installations (especially unknown ones), webshells in wp-content/, and anomalous entries in wp-comments-post.php access logs. Review wp_users table for accounts created after 2026-09-10.
What doesn't work
  • Cloudflare Bot Management / rate limiting — the exploit requires only a single comment submission and one GET request. Rate limiting won't trigger on two requests.
  • WordPress comment moderation / manual approval — the attack works specifically because WordPress returns a moderation-hash URL that lets the commenter view their own pending comment, bypassing the moderation gate entirely.
  • Disabling REST API — the attack vector is the classic comment form (wp-comments-post.php), not the REST API. Disabling REST API does not help.
  • Akismet or spam filters — these analyze comment content for spam patterns, not PHP serialization payloads. The payload does not look like typical spam.
06 · Verification

Crowdsourced verification payload.

Run this script on each WordPress host or from a management server with WP-CLI access. Invoke as: bash check_cve_2026_78006.sh /var/www/html (pass the WordPress root directory as the first argument). Requires read access to the plugin directory and the WordPress database (for comment status check). No root required.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# CVE-2026-78006 Checker — The Events Calendar Deserialization RCE
# Usage: bash check_cve_2026_78006.sh /path/to/wordpress
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -euo pipefail

WP_ROOT="${1:?Usage: $0 /path/to/wordpress}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/the-events-calendar"
VULN_FILE="$PLUGIN_DIR/src/Tribe/Views/V2/Widgets/Service_Provider.php"

# Check if plugin exists
if [ ! -d "$PLUGIN_DIR" ]; then
  echo "NOT_APPLICABLE — The Events Calendar plugin is not installed at $PLUGIN_DIR"
  exit 0
fi

# Get plugin version from readme.txt or the-events-calendar.php
VERSION=""
if [ -f "$PLUGIN_DIR/the-events-calendar.php" ]; then
  VERSION=$(grep -i 'Version:' "$PLUGIN_DIR/the-events-calendar.php" | head -1 | sed 's/.*Version:[[:space:]]*//' | tr -d '[:space:]')
fi

if [ -z "$VERSION" ] && [ -f "$PLUGIN_DIR/readme.txt" ]; then
  VERSION=$(grep -i 'Stable tag:' "$PLUGIN_DIR/readme.txt" | head -1 | sed 's/.*Stable tag:[[:space:]]*//' | tr -d '[:space:]')
fi

if [ -z "$VERSION" ]; then
  echo "UNKNOWN — Could not determine The Events Calendar version"
  exit 2
fi

echo "Detected The Events Calendar version: $VERSION"

# Version comparison function
version_lte() {
  [ "$1" = "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" ]
}

version_lt() {
  [ "$1" != "$2" ] && version_lte "$1" "$2"
}

# Fixed version is 6.17.4.1
FIXED="6.17.4.1"

if version_lt "$VERSION" "$FIXED"; then
  echo "VULNERABLE — The Events Calendar $VERSION is affected by CVE-2026-78006 (fixed in $FIXED)"
  # Additional check: are comments enabled on tribe_events?
  if command -v wp &>/dev/null && [ -f "$WP_ROOT/wp-config.php" ]; then
    COMMENT_STATUS=$(cd "$WP_ROOT" && wp option get default_comment_status --allow-root 2>/dev/null || echo "unknown")
    OPEN_EVENTS=$(cd "$WP_ROOT" && wp post list --post_type=tribe_events --comment_status=open --format=count --allow-root 2>/dev/null || echo "unknown")
    echo "  Default comment status: $COMMENT_STATUS"
    echo "  Events with comments open: $OPEN_EVENTS"
    if [ "$COMMENT_STATUS" = "closed" ] && [ "$OPEN_EVENTS" = "0" ]; then
      echo "  NOTE: Comments appear disabled — attack vector may be mitigated, but update is still required"
    else
      echo "  WARNING: Comments are enabled — site is actively exploitable"
    fi
  fi
  exit 1
else
  echo "PATCHED — The Events Calendar $VERSION is >= $FIXED"
  exit 0
fi
07 · Bottom Line

If you remember one thing.

TL;DR
Patch immediately. Update The Events Calendar to 6.17.4.1 on every WordPress instance in your fleet — today, not Monday. A weaponized PoC with multi-target scanning capability is public, the attack is unauthenticated, and the default WordPress configuration is vulnerable. If you cannot patch within hours, disable comments on all tribe_events post types as an interim mitigation (WP-CLI one-liner: wp post list --post_type=tribe_events --format=ids | xargs -I{} wp post update {} --comment_status=closed). Per the noisgate mitigation SLA for CRITICAL findings, compensating controls must be in place within 3 days. Per the noisgate remediation SLA, the vendor patch must be deployed within 90 days, but given the weaponized exploit and near-certain mass scanning, treat this as an emergency patch cycle — aim for completion by end of week. Audit access logs for POST requests to wp-comments-post.php containing serialized PHP objects and check for unexpected admin accounts created after September 10, 2026.

Sources

  1. OffSeq Threat Radar — CVE-2026-78006 Advisory
  2. Shenlong — Service_Provider.php Unserialize RCE PoC Analysis
  3. Shenlong — The Events Calendar 6.17.4.1 Security Patch Advisory
  4. Sploitus — DeadExpl0it/CVE-2026-78006-POC
  5. VulDB — CVE-2026-78006 Entry
  6. THREATINT — CVE-2026-78006
  7. Shenlong — Arbitrary Class Instantiation via Unvalidated Template
  8. WordPress.org — The Events Calendar Plugin Page
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.