Cyber Threat Brief — October 19 2026

⚠️ This report is AI-generated. Always validate findings.

1. UpdraftCentral-2026-10 — stolen dashboard keys installing WordPress backdoors

TL;DR: An attacker with valid UpdraftCentral dashboard keys is pushing backdoor plugins to connected WordPress sites, and no UpdraftPlus release stops a command those keys sign. Delete every UpdraftCentral key on the site itself, then look for the plugin description and the two accounts below.

What’s New:

  • Patchstack and Nethemba both recorded signed plugin.upload_plugin commands on 18–19 October. This is a stolen-key incident, not a flaw in the plugin. Free 1.26.11 and premium 2.26.11 / 2.26.11.26 still execute the commands. Team Updraft had not published an explanation when those writeups went live.
  • The backdoor is supposed to create an Editor that also holds manage_options and install_plugins, then set a login cookie so two-factor authentication never runs. The samples analyzed so far crash on PHP 8 before that check, which returns HTTP 500. Do not repair the plugin. Repairing it turns the backdoor on.
  • The key that matters lives in the site option updraft_central_localkeys. Removing the site from the UpdraftCentral dashboard does not delete it. Backups keep working after the key is gone. Keys do not expire. Patchstack saw November 2025 keys still accepted in October 2026.
  • Sites still on UpdraftPlus 1.26.4 / premium 2.26.4 or older also face CVE-2026-10795, which forges commands with no key at all. That bug was fixed in 1.26.5 / 2.26.5 and is a separate problem from this campaign.

Actionable Intel

ArtifactTypeATT&CKLog SourceAction
WordPress option updraft_central_localkeysRemote-management keyT1078.002WP-CLI / wp_optionsRun wp option delete updraft_central_localkeys, or in wp-admin open Settings, UpdraftPlus Backups, Advanced Tools, UpdraftCentral, and delete every key. Any value means the site will run commands signed by the stolen dashboard key.
IP 43.250.53.42Source addressT1071.001Web server access logSearch access logs for 43.250.53.42 sending POST /. Nethemba and Patchstack both saw this address deliver plugin.upload_plugin. Treat a hit as a push attempt, then block the address only as a supplement to deleting the key.
IPv6 2a09:bac5:4e21:2e3c::49b:9Source addressT1071.001Web server access logSearch access logs for 2a09:bac5:4e21:2e3c::49b:9. Patchstack telemetry saw this address about three hours before 43.250.53.42. The attacker rotated within a day, so an IP block is not the control.
User-Agent WordPress/6.4; class-udrpc.phpHTTP clientT1071.001Web server access logAlert on POST / whose User-Agent is exactly WordPress/6.4; class-udrpc.php. The real dashboard sends class-udrpc.php/2.0 and https://teamupdraft.com in the same header. This string has neither.
Query parameter _ plus 6 hex characters and a 32-character tokenActivation triggerT1505.003Web server access logSearch the access log for [?&]_[A-Za-z0-9]{4,10}=[A-Za-z0-9_]{32}. Nethemba’s samples use _9f5696 and _3e9caa. A hit means the backdoor was used. Treat the site as fully compromised.
Plugin description Small maintenance toolkit: keeps option storage tidy.Backdoor file markerT1505.003File search on the web rootSearch plugin trees for Small maintenance toolkit: keeps option storage tidy. Patchstack says every sample carries that sentence, while the folder name changes. Quarantine the directory. Do not edit it back into working PHP.
Plugin name Site Health CacheBackdoor pluginT1505.003Plugin list / file inventorySearch the plugin list and plugin directories for Site Health Cache. Patchstack says that is the one name reused repeatedly among 99 observed names, and the strongest name-based indicator. A miss does not clear the site. Quarantine the directory. Do not edit it back into working PHP.
Plugin directory wp-content/plugins/load-stack-35c/Backdoor pluginT1505.003File inventory / web access logIf wp-content/plugins/load-stack-35c/ exists, move it out of the web root. Nethemba’s first site received it at 04:14:30 CEST on 19 October from 43.250.53.42. Deleting it in wp-admin runs uninstall.php, which erases the plugin’s options.
Plugin directory wp-content/plugins/text-gantry-eb0/Backdoor pluginT1505.003File inventoryIf wp-content/plugins/text-gantry-eb0/ exists, move it out of the web root the same way. Nethemba’s second site received this copy. The generator changes the folder name per site, so a miss here does not mean the site is clean.
Database option <plugin_slug>_sync_tokenBackdoor markerT1505.003wp_optionsSearch wp_options for <plugin_slug>_sync_token, including load_stack_35c_sync_token and text_gantry_eb0_sync_token. Nethemba’s check matches ^[a-z]+_[a-z]+_[0-9a-f]{3}_ followed by sync_token or setup_stamp. Preserve the row, then delete it.
SHA-256 3c3355f7692d4951e5655683783795579467c9bf1ae2152e13b8c80e9021209fFile hashT1505.003EDR file inventoryBlock and sweep for 3c3355f7692d4951e5655683783795579467c9bf1ae2152e13b8c80e9021209f, the main file of the load-stack-35c sample.
SHA-256 bb40f9a87cea678aa50e5286dd91c0903d6a7fc1b12391472187a0919b4d0801File hashT1505.003EDR file inventoryBlock and sweep for bb40f9a87cea678aa50e5286dd91c0903d6a7fc1b12391472187a0919b4d0801, the main file of the text-gantry-eb0 sample.
SHA-256 4186ae2aa0472a4e7929b21bb87f9b61866cb3790f69f4b6c9813e196955d5f0File hashT1505.003EDR file inventoryBlock and sweep for 4186ae2aa0472a4e7929b21bb87f9b61866cb3790f69f4b6c9813e196955d5f0, uninstall.php from the load-stack-35c sample.
SHA-256 4943fc21efa4b81516130f92bf4efe3b832e1bb69e499d2e42587233a0a005e9File hashT1505.003EDR file inventoryBlock and sweep for 4943fc21efa4b81516130f92bf4efe3b832e1bb69e499d2e42587233a0a005e9, uninstall.php from the text-gantry-eb0 sample.
Username data-ops43Backdoor accountT1136.001wp_usersDelete the user data-ops43 if present. Nethemba’s first sample would have created it with email [email protected] and display name Site Tools, as Editor plus manage_options and install_plugins. The account survives plugin removal.
Username media-staff96Backdoor accountT1136.001wp_usersDelete the user media-staff96 if present. It is the account name in Nethemba’s second sample, with the same Editor-plus-capabilities pattern and an @example.org address.
Display name Site ToolsBackdoor account markerT1136.001wp_usersList users whose display name is Site Tools and remove them. The login name changes per site. The two public names are data-ops43 and media-staff96, and Patchstack says other names exist.
Log string Command received: plugin.upload_pluginUpdraftCentral client logT1505.003Database option updraftcentral_client_logSearch updraftcentral_client_log for Command received: plugin.upload_plugin. The option keeps about the last 50 events, so also search the web access log if the line has rotated out.
Host string probe.central.updraftplus.comUpdraftCentral probeT1071.001Database option updraftcentral_client_logSearch updraftcentral_client_log for probe.central.updraftplus.com. Nethemba saw this probe, sent to a key that does not exist, a few hours before plugin.upload_plugin on the real key 0.central.updraftplus.com.

Detection

SourceRuleGap
Splunk ESCUNone — verifiedWordPress Bricks Builder plugin RCE matches a different plugin URL. No rule keys on class-udrpc.php or updraft_central_localkeys.
ElasticPartial — PHP File Creation in WordPress Plugin DirectoryFires when php-fpm, Apache, nginx, or a shell writes any file under wp-content/plugins/. It also fires on a normal plugin install, and it does not see the description string.
SigmaNone — verifiedLinux Webshell Indicators requires children such as whoami or cat. These samples fatal inside PHP and do not spawn that child.

Detection index: ESCU 1391417 (2026-10-19) · elastic detection-rules a61fa31 (2026-10-16) · SigmaHQ f083329 (2026-10-19).

Hunt hint: Delete the key first, or the next push can replace a broken plugin with a working one. Then run wp option get updraft_central_localkeys even on sites that only use UpdraftPlus for backups, because the TeamUpdraft account screen ticks the UpdraftCentral checkbox by default. Search users for display name Site Tools or an email ending in @example.org, and for any non-administrator whose capabilities include both manage_options and install_plugins. A WordPress mail about a plugin you did not install, plus HTTP 500 on uncached requests, matches the PHP 8 crash Undefined constant <Class>::FIELD. If that account exists, or the access log shows its URL parameter, restore the site from a backup taken before the attack (Patchstack’s earliest observed install was 18 October 15:32, time zone not stated) and rotate administrator and UpdraftCentral Cloud passwords. Until Team Updraft explains the leak, do not create a new key. Nethemba published a read-only check script and an optional mu-plugin that returns 403 on any POST with udrpc_message to block UpdraftCentral commands until the vendor explains (this also blocks UpdraftPlus Migrator).

Sources: Patchstack · Nethemba · Oliver Sild (Patchstack) · Nethemba on X


Status Updates

  • CVE-2026-102764 (BeyondTrust Remote Support): KEV due today, Oct 19. Forensic triage still required. No public PoC. Self-hosted 26.2.3 and older need the BT26-05-RS patch. Original brief.
  • CVE-2025-61624 (FortiOS auto-script path traversal / PEERSTITCH): KEV due today, Oct 19. Forensic triage still required. Original brief.
  • CVE-2026-21589 (Atlassian Data Center file read): KEV due date was Oct 18 and is now overdue. Forensic triage still required. Original brief.
  • KEV deadlines already passed, no new fix or IOC: CVE-2026-0322 (PAN-OS) and CVE-2026-76519 (Cisco Secure Email Gateway; AsyncOS 16.0 still has no fixed build, so migrate to 15.5.5-014 or 16.5.0-780, or confirm Content Scanner Tools 25.3.0.5525 or later) (brief); CVE-2026-105134 and CVE-2026-105133 (AhsayCBS) (brief); CVE-2026-104935 (Ivanti) and CVE-2026-96951 (Windows Shell) (brief); CVE-2026-86950 (Apple CoreGraphics) (brief).
  • GhostAction-2026-10: OpenSourceMalware’s 16 October note adds a second stage on 94 repositories: .vscode/tasks.json task eslint-check runs public/fonts/fa-solid-400.woff2, and a crontab line commented #ghc2 calls 193.32.204.199:8080. Deleting the workflow does not remove that cron entry. Original brief.
  • Deferred, PwnEscape CVE-2026-99999: Risky Bulletin restates the kernel fix. No in-the-wild claim and not in KEV. Recheck Oct 22.
  • Deferred, BlockStrap CVE-2026-103849: Sansec’s teardown still says no attacks on live stores. An aggregator post claiming Magecart use is unverified and contradicts Sansec. Not in KEV. Recheck Oct 22.
  • Deferred, new: SiteGuard CVE-2026-106931 (vendor-only exploitation claim, fixed in 8.00 Update 5 / FreeBSD 7.00 Update 6, recheck Oct 20); Rank Math SEO Pro 3.0.123 (vendor notice not retrieved; recheck Oct 20); Plex2Shell CVE-2026-96652 / CVE-2026-96654 / CVE-2026-96655 / CVE-2026-96656 (honeypot claim is one origin; fixed in 1.43.3.10861; recheck Oct 21); APT28 Covenant Grunt .docm cluster (Nextron writeup not retrieved; recheck Oct 20); Heartbreaker macOS sample (Objective-See only; recheck Oct 22).
  • Deferred, carried: Langflow CVE-2026-105740, Redis CVE-2026-25243, npm imgdecode, and the OpenCode Console key rotation (Oct 20); Drupal SA-CORE-2026-014 / CVE-2026-108097 (Oct 21).
  • Retired from watch (last update 2026-10-12): CVE-2026-0257 (KEV due 2026-06-01, no material change since 2026-10-12).
  • Retired from watch (last update 2026-09-29): GHSA-qx49-fqc8-xw99.
  • Retired from watch (last update 2026-09-28): Carbonato, CVE-2026-62062.
  • Retired from watch (last update 2026-09-27): CVE-2026-18143, MiniShaiHuludActions.
  • Retired from watch (last update 2026-09-26): CVE-2026-48842.
  • Retired from watch (last update 2026-09-25): CVE-2026-61674.
  • Retired from watch (last update 2026-09-24): CVE-2026-80521.
  • Retired from watch (last update 2026-09-23): BlueMoon, CVE-2026-85103.
  • Retired from watch (last update 2026-09-22): CVE-2026-32996, CVE-2026-93485, Click2Shell.
  • Retired from watch (last update 2026-09-21): ChainScript, JadeSleet, indexed-btree.
  • Retired from watch (last update 2026-09-20): WaterPlum, CVE-2026-32882.
  • Retired from watch (last update 2026-09-19): CVE-2026-58138, CVE-2026-28326.
  • Retired from watch (last update 2026-09-18): BrevoClickFix, CVE-2026-91843, CVE-2026-81642.
  • Retired from watch (last update 2026-09-16): CVE-2026-27540, CVE-2026-90894.
  • Retired from watch (last update 2026-09-15): CVE-2026-51990.
  • Retired from watch (last update 2026-09-13): Storm-3121, CVE-2026-86793.
  • Retired from watch (last update 2026-09-09): PoisonedRefresh, ShieldCrash.
  • Retired from watch (last update 2026-09-05): FalconFlank, CVE-2026-6471.
  • Retired from watch (last update 2026-09-04): CVE-2026-20212, CVE-2026-84645.
  • Retired from watch (last update 2026-09-03): CVE-2026-32475, CVE-2023-54391.
  • Watching (no change): ConnectWise-CloudBackup-SkyKick-2026-10 (10-17); UNC7017-AOMEI-2026-10 (10-17); Candiru-AdFection-DiscoverTech-2026-10 (10-18); InfinityCore-2026-10 (10-18); CVE-2026-110447 (10-15); CVE-2026-102255 (10-15); Danfoss-AKSM-FROMAGEGATE-2026-10 (10-13); CVE-2026-97229 (10-13); CVE-2026-85097 (10-09); CVE-2026-107406 (10-09); CVE-2026-82077 (10-11); CVE-2026-61500 (10-04); CVE-2026-88062 (10-04); CVE-2026-86360 (10-06); ClickFix-CacheSmuggle-2026-10 (10-07); CVE-2026-102406 (10-07); CVE-2026-103007 (10-07); FortiBleed-2026-10 (10-08); tensorlake-npm-0.5.144 (10-08); CVE-2026-105192 (10-08); CyberXero-2026-10 (10-12).