Back to Intelligence

CVE-2026-119077: Critical PHP Object Injection in ELEX WordPress HelpDesk Plugin — Unauthenticated RCE Detection and Remediation Guide

SA
Security Arsenal Team
November 13, 2026
11 min read

NVD has published CVE-2026-119077, a CVSS 9.8 (CRITICAL) PHP Object Injection vulnerability in the ELEX WordPress HelpDesk & Customer Ticketing System plugin — all versions up to and including 3.3.9. The vulnerability is remotely exploitable over the network, requires no authentication, and can lead to arbitrary code execution on the underlying web server.

This is the class of vulnerability that keeps IR teams busy on weekends. WordPress plugins sit on the public internet by design, are frequently installed and forgotten by marketing or support teams outside of IT's asset inventory, and — as this CVE demonstrates — often ship with deserialization paths guarded by nothing more than a nonce that the application itself hands out to any visitor. If your organization runs a WordPress site with the [wsdesk_support] shortcode anywhere on it, treat this as an active incident-response priority, not a routine patch ticket.

The three compounding failures here are worth naming plainly, because they define your detection surface:

  1. Missing server-side authentication on the vulnerable form handler.
  2. No class allowlist on deserialization — attacker-controlled input reaches unserialize() (or an equivalent path) directly.
  3. The only guard — a nonce — is publicly emitted on any page rendering the [wsdesk_support] shortcode. Any unauthenticated visitor can scrape a valid nonce and submit a malicious payload.

That combination converts what should be an authenticated, low-risk feature into a pre-auth RCE primitive.

Technical Analysis

Affected component and versions

ItemDetail
ProductELEX WordPress HelpDesk & Customer Ticketing System (wsdesk)
Affected versionsAll versions up to and including 3.3.9
CVECVE-2026-119077
CVSS v3.x9.8 (CRITICAL) — network-exploitable, no privileges required, no user interaction
Vulnerability typePHP Object Injection (CWE-502: Deserialization of Untrusted Data)
Attack vectorAttacker-controlled ticket_label field inside a URL-encoded form string parameter
Referencehttps://nvd.nist.gov/vuln/detail/CVE-2026-119077

How the attack works — defender's view

The vulnerable code path processes a form parameter containing a URL-encoded string. Within that string, the ticket_label field is fully attacker-controlled and is passed into a PHP deserialization routine without a class allowlist. The intended CSRF protection — a WordPress nonce — is rendered into the page source of any public page containing the [wsdesk_support] shortcode, so an attacker simply:

  1. Requests any page embedding the support form and extracts the nonce from the HTML.
  2. Crafts a serialized PHP object payload (a "POP chain") in the ticket_label field, URL-encoded inside the form parameter.
  3. Submits it to the plugin's form-handling endpoint. On deserialization, magic methods (__wakeup(), __destruct(), __toString()) on classes present in WordPress core, the theme, or other installed plugins are invoked with attacker-controlled properties.

The practical impact depends on which gadget chains are available on the target — but WordPress's plugin ecosystem makes usable chains the norm, not the exception. Successful exploitation typically yields arbitrary file write (webshell drop into wp-content/uploads/ or a theme directory) or direct code execution under the web server account (www-data, apache, or nginx). From there, expect the standard post-exploitation pattern we've seen in dozens of WordPress IR engagements: webshell deployment, wp-config.php credential theft (database credentials, auth keys/salts), creation of rogue admin users in wp_users, and persistence via mu-plugins or injected theme files.

Exploitation status

At time of writing, the CVE has been published by NVD with full technical detail in the advisory. A CVSS 9.8 unauthenticated RCE in a WordPress plugin is a near-certain candidate for rapid weaponization — historically, mass scanning and exploitation of pre-auth WordPress plugin RCEs begins within days of public disclosure, frequently by automated botnets that enumerate plugin readme files for version fingerprinting. Defenders should operate on the assumption that exploit code either already exists or will shortly. Check CISA KEV status daily; pre-auth WordPress RCEs with public detail are routinely added.

Detection & Response

The most reliable detection surfaces for this vulnerability are: (1) web server access logs showing suspicious requests to the wsdesk form handler, (2) the web server process spawning child processes it never should (the canonical signal of webshell/RCE activity), and (3) filesystem artifacts — newly written PHP files in upload directories or modified plugin/theme files.

YAML
---
title: Web Server Process Spawning Suspicious Child Processes
description: Detects PHP-FPM, Apache, or Nginx worker processes spawning shells, downloaders, or reconnaissance commands — a high-fidelity indicator of successful PHP Object Injection / webshell execution on WordPress hosts, consistent with post-exploitation of CVE-2026-119077.
id: 3c8a1f92-6d4e-4b7a-9c21-5f0e2d8a4b63
status: experimental
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-119077
  - https://attack.mitre.org/techniques/T1505/003/
  - https://attack.mitre.org/techniques/T1059/004/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.persistence
  - attack.t1505.003
  - attack.execution
  - attack.t1059.004
logsource:
  category: process_creation
  product: linux
detection:
  selection_parent:
    ParentImage|endswith:
      - '/php-fpm'
      - '/php-fpm8.1'
      - '/php-fpm8.2'
      - '/php-fpm8.3'
      - '/apache2'
      - '/httpd'
      - '/nginx'
  selection_child:
    Image|endswith:
      - '/sh'
      - '/bash'
      - '/dash'
      - '/zsh'
      - '/curl'
      - '/wget'
      - '/python'
      - '/python3'
      - '/perl'
      - '/nc'
      - '/ncat'
      - '/base64'
      - '/id'
      - '/whoami'
      - '/uname'
  condition: selection_parent and selection_child
falsepositives:
  - Rare; legitimate WordPress plugins invoking system commands (e.g. image processing) — validate against known plugin behavior before tuning
level: high
---
title: Webshell or PHP File Written to WordPress Uploads Directory
description: Detects creation of PHP files in wp-content/uploads or other web-accessible directories — a common post-exploitation artifact following PHP Object Injection RCE such as CVE-2026-119077, where gadget chains are used to drop a webshell for persistent access.
id: 8f2b7d41-1a5c-4e9f-b3d6-7c0a9e2f5d18
status: experimental
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-119077
  - https://attack.mitre.org/techniques/T1505/003/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.persistence
  - attack.t1505.003
logsource:
  category: file_event
  product: linux
detection:
  selection:
    TargetFilename|contains:
      - '/wp-content/uploads/'
      - '/wp-content/cache/'
      - '/wp-content/upgrade/'
      - '/wp-content/mu-plugins/'
    TargetFilename|endswith:
      - '.php'
      - '.phtml'
      - '.php5'
      - '.php7'
      - '.phar'
  condition: selection
falsepositives:
  - Legitimate plugin/theme updates writing PHP files — correlate with wp-admin administrative sessions and known maintenance windows
level: high
---
title: Suspicious URL-Encoded Form Payload Targeting wsdesk Ticket Handler
description: Detects HTTP requests containing the wsdesk form parameter with suspicious serialized-object markers (O:, base64 blobs, or PHP magic-method indicators) in the ticket_label field, indicative of CVE-2026-119077 exploitation attempts captured in web/proxy telemetry.
id: 5e1c9a08-3f7d-4b2c-a6e4-9d1f8c3b7a52
status: experimental
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-119077
  - https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/04/06
tags:
  - attack.initial_access
  - attack.t1190
logsource:
  category: webserver
detection:
  selection_uri:
    cs-uri-query|contains:
      - 'ticket_label'
      - 'wsdesk'
  selection_serialized:
    cs-uri-query|contains:
      - '%3AO%3A'
      - 'O%3A%2B'
      - 'a%3A'
      - 'O:'
  condition: all of selection_*
falsepositives:
  - Legitimate ticket submissions with unusual label content — unlikely but possible; pair with response-code and volume analysis
level: high
KQL — Microsoft Sentinel / Defender
// Hunt: web server processes executing shells or downloaders on WordPress hosts
// Onboard Syslog/CEF from Linux web servers into Sentinel for coverage
Syslog
| where TimeGenerated > ago(7d)
| where ProcessName has_any ("php-fpm", "apache2", "httpd", "nginx")
    or SyslogMessage has_any ("php-fpm", "apache2", "httpd", "nginx")
| where SyslogMessage has_any ("/bin/sh", "/bin/bash", "curl ", "wget ", "python", "nc -", "base64 -d")
| project TimeGenerated, Computer, ProcessName, SyslogMessage
| order by TimeGenerated desc;

// Hunt: inbound requests carrying wsdesk form payloads with serialized-object markers
CommonSecurityLog
| where TimeGenerated > ago(7d)
| where RequestURL has_any ("wsdesk", "ticket_label")
| where RequestURL has_any ("%3AO%3A", "O%3A", "O:", "a%3A")
| summarize RequestCount = count(), DistinctSources = dcount(SourceIP) by SourceIP, RequestURL, RequestMethod, bin(TimeGenerated, 1h)
| order by RequestCount desc;

// Hunt: new or modified admin accounts / suspicious PHP under uploads (via file integrity or EDR telemetry on web tier)
DeviceFileEvents
| where TimeGenerated > ago(7d)
| where FolderPath has_any ("wp-content/uploads", "wp-content/mu-plugins", "wp-content/cache")
| where FileName endswith ".php" or FileName endswith ".phtml"
| project TimeGenerated, DeviceName, FolderPath, FileName, InitiatingProcessAccountName, InitiatingProcessCommandLine
| order by TimeGenerated desc
VQL — Velociraptor
-- Hunt for webshell artifacts and web-server-spawned processes on a WordPress host
-- Artifact 1: Recently created/modified PHP files in upload & writable content directories
SELECT FullPath, Size, Mtime, Ctime
FROM glob(globs=['/var/www/**/wp-content/uploads/**/*.php',
                 '/var/www/**/wp-content/mu-plugins/**/*.php',
                 '/var/www/**/wp-content/cache/**/*.php'])
WHERE Mtime > now() - 604800
ORDER BY Mtime DESC;

-- Artifact 2: Suspicious child processes of the web server (live execution)
SELECT Pid, Ppid, Name, Exe, Cmdline, Username
FROM pslist()
WHERE Cmdline =~ '/bin/(ba)?sh|curl |wget |nc |base64 -d|python'
  AND Username =~ 'www-data|apache|nginx|nobody';

-- Artifact 3: Web server processes holding unexpected outbound connections (C2 / reverse shell)
SELECT Pid, Name, Status, Address, Port, Raddress, Rport
FROM netstat()
WHERE Name =~ 'php-fpm|apache2|httpd|nginx'
  AND Status =~ 'ESTABLISHED'
  AND Rport NOT IN (80, 443)
Bash / Shell
#!/bin/bash
# CVE-2026-119077 — ELEX wsdesk plugin: detect, verify version, and quarantine
# Run on the WordPress host (or via your config-management tooling across the fleet)

WP_ROOT="/var/www/html"   # adjust to your document root
PLUGIN_DIR="$WP_ROOT/wp-content/plugins"

# 1) Locate every wsdesk installation across common vhost roots
echo "[*] Searching for ELEX HelpDesk (wsdesk) plugin installs..."
find /var/www -type d -iname "*wsdesk*" -path "*wp-content/plugins*" 2>/dev/null

# 2) Check installed version — anything <= 3.3.9 is vulnerable
for readme in $(find /var/www -type f -iname "readme.txt" -path "*wsdesk*" 2>/dev/null); do
  echo "[*] $readme"
  grep -i "Stable tag" "$readme"
done

# 3) If WP-CLI is available, enumerate precisely
sudo -u www-data wp plugin list --path="$WP_ROOT" --format=table 2>/dev/null | grep -i wsdesk

# 4) EMERGENCY CONTAINMENT: deactivate the plugin until patched
sudo -u www-data wp plugin deactivate wsdesk --path="$WP_ROOT" 2>/dev/null
# Fallback if WP-CLI unavailable — rename the plugin directory to break the load path
# mv "$PLUGIN_DIR/wsdesk" "$PLUGIN_DIR/wsdesk.DISABLED-CVE-2026-119077"

# 5) Hunt for dropped webshells: PHP files under uploads modified in last 14 days
echo "[*] Hunting for recent PHP files in writable directories..."
find "$WP_ROOT/wp-content/uploads" "$WP_ROOT/wp-content/cache" \
  -type f \( -name "*.php" -o -name "*.phtml" -o -name "*.phar" \) \
  -mtime -14 -ls 2>/dev/null

# 6) Check for rogue admin users (requires WP-CLI + DB access)
sudo -u www-data wp user list --role=administrator --path="$WP_ROOT" --format=table 2>/dev/null

# 7) Review access logs for exploitation attempts targeting the form parameter
echo "[*] Grepping access logs for ticket_label / wsdesk payloads..."
grep -hEi "ticket_label|wsdesk" /var/log/apache2/access*.log /var/log/nginx/access*.log 2>/dev/null \
  | grep -Ei "O:|%3AO%3A|a%3A" | tail -n 50

Remediation

  1. Patch immediately. Update the ELEX WordPress HelpDesk & Customer Ticketing System plugin to the first fixed release above 3.3.9 as soon as the vendor publishes it. Monitor the plugin's WordPress.org page, the ELEX vendor advisory channel, and the NVD entry (https://nvd.nist.gov/vuln/detail/CVE-2026-119077) for the fixed version number.
  2. If no patch is available yet, deactivate the plugin. A disabled ticketing form is a business inconvenience; a pre-auth RCE on your web tier is a breach. Use WP-CLI (wp plugin deactivate) or rename the plugin directory. Removing the [wsdesk_support] shortcode from pages alone is not sufficient — the vulnerable handler may remain reachable while the plugin is active.
  3. WAF virtual patching. Deploy rules blocking requests containing serialized-object markers (O:+, a:, URL-encoded equivalents) in parameters associated with the wsdesk form handler. On ModSecurity, a targeted rule on the ticket_label field is appropriate. Treat this as a bridge control, not a fix.
  4. Assume compromise on internet-exposed instances. Any host running ≤3.3.9 with the shortcode publicly rendered should get a compromise assessment: webshell sweep, wp_users admin audit, wp-config.php integrity check, review of mu-plugins, and web log analysis going back to the disclosure date.
  5. Rotate credentials on suspicion of exploitation. Database credentials and WordPress auth keys/salts in wp-config.php, plus all admin passwords and any API keys stored in the database.
  6. Harden the web tier going forward. Block PHP execution in wp-content/uploads/ via web server config, run the site under a least-privilege account, enable file-integrity monitoring on the document root, and inventory all WordPress plugins continuously — the plugin you don't know about is the one that gets you.
  7. Watch CISA KEV. If CVE-2026-119077 is added, federal deadlines (typically 3 weeks for BOD 22-01 scoped agencies) apply, and it is a reliable signal that mass exploitation is confirmed.

The Bottom Line

Pre-authentication deserialization bugs in WordPress plugins are among the most reliably weaponized vulnerability classes we see in incident response. CVE-2026-119077 combines every element that makes defenders' lives hard: no auth, a public nonce, no allowlist, and a direct path to server-side code execution. Patch or deactivate today, hunt for the artifacts above, and don't assume your marketing team's support portal is someone else's problem — it's your perimeter.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.