Someone figured out that WordPress event-listing comments can smuggle executable code through the block parser like a Trojan horse hidden in an RSVP card
CVE-2026-78159 is a code-injection flaw in The Events Calendar plugin for WordPress, affecting all versions through 6.17.3. The vulnerable path runs through Element_Classes::parse_array(): insufficient validation of the widget classes map allows a plain-array payload to bypass the is_safe_widget_instance() object check and reach a callable-invocation sink. An unauthenticated attacker submits a comment on a tribe_events post containing a crafted wp:legacy-widget block. When WordPress calls do_blocks() to render the single-event page (including the comment area), the malicious block triggers arbitrary code execution on the server. The fix ships in 6.17.4 (released ~September 11, 2026). Affected version range: ≤ 6.17.3.
The vendor rates this CRITICAL / 9.8 with a vector of AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, which overstates the real-world risk. The CVSS vector claims *no privileges required* and *no user interaction*, but the actual chain demands two non-trivial conditions: (1) comments must be enabled on tribe_events posts — a configurable option many operators disable, and (2) WordPress's default comment-moderation policy holds first-time commenter posts for admin approval, meaning a moderator must unwittingly publish a comment carrying hostile block markup. When moderation is off or auto-approve is configured, the chain does become truly unauthenticated — but that is a subset of the installed base, not the universal case. A HIGH / 7.5 better reflects the real friction.
4 steps from start to impact.
Identify a vulnerable target
readme.txt, REST API, or generator meta tags makes this trivial. The attacker also confirms that comments are open on at least one tribe_events post.- Target runs The Events Calendar ≤ 6.17.3
- Comments are enabled on tribe_events post type
- Many event sites disable comments on events — they are not enabled by default in all configurations
- Plugin version disclosure can be suppressed by hardening plugins
Submit malicious comment with wp:legacy-widget block
<!-- wp:legacy-widget --> block with a plain-array payload in the widget classes attribute. The payload is designed to bypass is_safe_widget_instance() by using an array type that the check does not expect. The comment is submitted via the standard WordPress comment form — no authentication needed.- Comment form accessible to unauthenticated users
- WordPress comment sanitization does not strip HTML comment delimiters (block markers)
- WordPress default: first-time commenter comments are held for moderation — an admin must approve the comment before it renders on the front end
- If CAPTCHA or anti-spam plugins (Akismet, reCAPTCHA) are active, automated submission is harder
wp:legacy-widget block patterns. Wordfence firewall rules (expected imminently).Comment is published (moderation bypass or approval)
- Comment moderation is disabled OR admin approves the comment
- WordPress ships with
comment_moderationenabled for first-time commenters by default - A security-aware admin reviewing comments would likely flag suspicious block markup
wp:legacy-widget in pending comments.do_blocks() processes the malicious block → RCE
do_blocks() on the full page HTML including the comment area. The crafted wp:legacy-widget block reaches Element_Classes::parse_array(), which invokes the attacker-controlled callable. The attacker achieves code execution as the web server user (typically www-data or apache).- The single-event page with the malicious comment is rendered
- Execution context is limited to the web server user — not root unless the server is misconfigured
The supporting signals.
| In-the-Wild Exploitation | Not confirmed. No reports from Wordfence, GreyNoise, or other threat-intel feeds as of 2026-09-13. Disclosed only yesterday. |
|---|---|
| KEV Status | Not listed on CISA KEV as of 2026-09-13. |
| Proof-of-Concept | Not publicly available yet. No GitHub PoC repos found. Given the 24-hour disclosure window, expect weaponization within days to weeks. |
| EPSS Score | 0.00762 — low probability of exploitation in the next 30 days per the FIRST EPSS model, roughly top 15th percentile. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H — vendor asserts fully unauthenticated, no interaction, full CIA impact. noisgate disputes AC:L and UI:N; real-world chain requires comment approval. |
| Affected Versions | The Events Calendar ≤ 6.17.3 (all versions). |
| Fixed Version | 6.17.4 (released ~2026-09-11). Also note 6.17.4.1 minor update released 2026-09-11. |
| Installed Base | 600,000+ active installations per WordPress.org. Some sources cite 800,000+. This is the most popular WordPress event plugin. |
| Disclosure Date | 2026-09-12 — disclosed one day ago. |
| Related CVEs | CVE-2026-78265 (PHP object injection, fixed in 6.17.3) and CVE-2026-78006 (RCE in 6.17.4, separate chain). Sites on < 6.17.4 may be exposed to multiple critical flaws. |
noisgate verdict.
Downgraded from CRITICAL to HIGH because the decisive factor is the WordPress default comment-moderation gate: the chain requires a moderator to approve a hostile comment before code execution fires, converting the vendor's claimed UI:N into an implicit user-interaction dependency for the majority of installations. The 600K+ install base and full RCE outcome keep this firmly at HIGH rather than MEDIUM.
Why this verdict
- Comment-moderation gate narrows the unauthenticated claim. WordPress default holds first-time commenter posts for admin approval. The CVSS vector's
UI:Ndoes not reflect this real-world friction. On default-configured sites, the chain stalls until an admin publishes the comment — this is effectively a social-engineering prerequisite, not a pure zero-click. - Comments on
tribe_eventsare not universally enabled. The Events Calendar's comment setting is configurable, and many operators disable event comments because they use separate RSVP or ticketing workflows. This shrinks the reachable population below the full 600K install base. - Blast radius is a single WordPress site, not fleet-scale infrastructure. Successful exploitation yields web-server-user code execution on one host. The Events Calendar is a line-of-business web plugin — it is not a domain controller, hypervisor, identity provider, or backup system.
- Role multiplier: The Events Calendar is deployed almost exclusively as a website content plugin on web-tier servers. (a) *Low-value role:* dev/staging WordPress instances — chain succeeds, blast radius = one sandbox. (b) *Typical role:* production marketing or community site — chain succeeds, blast radius = one web server, potential data breach of site content and DB credentials. (c) *High-value role:* WordPress multisite hosting dozens of tenants — chain succeeds, blast radius scales to all sites on that multisite (still web-tier, not identity/fleet). Less than 5% of installs serve as multisite network hubs. No canonical high-value infrastructure role (not a DC, hypervisor, IdP, CI/CD, or backup server). Floor does not apply.
- No PoC or in-the-wild exploitation confirmed within 24 hours of disclosure. EPSS at 0.00762 is modest. Weaponization is expected but not yet observed.
Why not higher?
The chain is not CRITICAL because the default WordPress comment-moderation policy interposes a human gate between the attacker and code execution. The affected component does not occupy a high-value infrastructure role (no identity, hypervisor, CI/CD, or backup function). Even on sites with moderation disabled, the blast radius is bounded to a single web server — not fleet or domain compromise.
Why not lower?
The chain is not MEDIUM because when moderation *is* disabled (a common convenience configuration), the attack is genuinely unauthenticated, zero-click RCE. The installed base of 600,000+ means even a 20% subset with comments open and moderation off represents ~120,000 targets. Full code execution — not just information disclosure — keeps severity anchored at HIGH.
What to do — in priority order.
- Disable comments on all tribe_events posts immediately — This eliminates the attack vector entirely by removing the comment-rendering path that triggers
do_blocks()on attacker-controlled content. Deploy within the noisgate mitigation SLA of 30 days — but given the simplicity of this control, aim for same-day. Can be done via The Events Calendar settings oradd_filter('comments_open', '__return_false')scoped totribe_eventspost type. - Enable strict comment moderation — Ensure
Settings → Discussion → Comment must be manually approvedis checked. This gates any surviving attack path behind admin review. Train moderators to reject comments containing block markup like<!-- wp:legacy-widget -->. - Deploy WAF rule blocking wp:legacy-widget in comment submissions — Add a WAF rule (ModSecurity, Cloudflare WAF, Wordfence) that blocks POST requests to
wp-comments-post.phpwhere the body containswp:legacy-widget. This is a precise, low-false-positive rule. Deploy within the noisgate mitigation SLA of 30 days. - Update to The Events Calendar 6.17.4.1 — This is the definitive fix. Apply within the noisgate remediation SLA of 180 days. Given the RCE severity and large install base, prioritize this in your next maintenance window.
- Generic rate-limiting on comments does not help — the attacker only needs one comment to land the payload, not high volume.
- Akismet / anti-spam plugins may not flag the comment as spam because the payload is embedded in HTML comment delimiters (
<!-- -->), not in visible text patterns Akismet typically scores. - PHP
disable_functionsis a partial control but trivially bypassed in many RCE scenarios; do not rely on it as a primary mitigation.
Crowdsourced verification payload.
Run this script on each WordPress host (or via SSH across your fleet). It checks the installed version of The Events Calendar plugin and whether comments are enabled on tribe_events posts. Requires read access to the WordPress installation directory. Example: bash check_cve_2026_78159.sh /var/www/html
#!/usr/bin/env bash
# check_cve_2026_78159.sh — Detect CVE-2026-78159 exposure
# Usage: bash check_cve_2026_78159.sh <WORDPRESS_ROOT>
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
WP_ROOT="${1:-/var/www/html}"
PLUGIN_DIR="$WP_ROOT/wp-content/plugins/the-events-calendar"
VERSION_FILE="$PLUGIN_DIR/the-events-calendar.php"
if [ ! -d "$PLUGIN_DIR" ]; then
echo "UNKNOWN — The Events Calendar plugin not found at $PLUGIN_DIR"
exit 2
fi
if [ ! -f "$VERSION_FILE" ]; then
# Try readme.txt fallback
VERSION_FILE="$PLUGIN_DIR/readme.txt"
if [ ! -f "$VERSION_FILE" ]; then
echo "UNKNOWN — Cannot determine plugin version"
exit 2
fi
fi
# Extract version
VERSION=$(grep -i 'Version:' "$VERSION_FILE" | head -1 | sed 's/.*Version:[[:space:]]*//' | tr -d '[:space:]')
if [ -z "$VERSION" ]; then
echo "UNKNOWN — Could not parse version from $VERSION_FILE"
exit 2
fi
echo "Detected The Events Calendar version: $VERSION"
# Compare versions (vulnerable: <= 6.17.3)
# Using sort -V for version comparison
FIXED="6.17.4"
if printf '%s\n%s\n' "$FIXED" "$VERSION" | sort -V | head -1 | grep -q "^${FIXED}$"; then
echo "PATCHED — Version $VERSION >= $FIXED (CVE-2026-78159 fix applied)"
exit 0
else
echo "VULNERABLE — Version $VERSION < $FIXED"
echo " Checking comment status on tribe_events..."
# Check if wp-cli is available for deeper inspection
if command -v wp &>/dev/null; then
COMMENTS_OPEN=$(wp post list --post_type=tribe_events --field=comment_status --path="$WP_ROOT" 2>/dev/null | grep -c 'open' || true)
if [ "$COMMENTS_OPEN" -gt 0 ]; then
echo " WARNING: $COMMENTS_OPEN tribe_events posts have comments OPEN — actively exploitable"
else
echo " INFO: No tribe_events posts with open comments found (reduced risk)"
fi
else
echo " INFO: wp-cli not found; manually verify comment status on tribe_events posts"
fi
exit 1
fiIf you remember one thing.
tribe_events posts and deploy a WAF rule blocking wp:legacy-widget in comment submissions — this satisfies the noisgate mitigation SLA of 30 days and effectively eliminates the attack surface while you schedule the patch. If you have WordPress multisite deployments running The Events Calendar, prioritize those first. Monitor Wordfence and GreyNoise feeds daily for the next two weeks — if active exploitation surfaces, accelerate to emergency patching within hours.Sources
- OffSeq Threat Radar — CVE-2026-78159 Detail
- Shenlong CVE Platform — TEC ≤6.17.3 RCE & Patch 6.17.4
- WordPress.org — The Events Calendar Plugin Page
- VulDB — CVE-2026-78159
- GitHub — The Events Calendar Releases
- The Events Calendar Knowledgebase — Settings Overview
- GHSA-9c57-9fxg-8x9j (GitHub Security Advisory)
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.