A landmine buried in a trackback that only detonates if someone decides to move the house
CVE-2026-19949 is a second-order SQL injection in the All-in-One WP Migration and Backup plugin for WordPress, affecting all versions through 7.109 (fixed in 7.110, released August 20, 2026). The flaw lies in incorrect parsing of escaped backslashes and quotation marks during archive restoration. An unauthenticated attacker plants a crafted payload via WordPress trackbacks. That payload sits dormant until an administrator performs an export-then-import cycle — a core function of this migration plugin. When the restore runs, the injected SQL leaks the plugin's ai1wm_secret_key into a public comment. The attacker reads the key, then imports a malicious .wpress archive containing executable PHP, achieving full site takeover. The plugin has over 5 million active installations, and as of early September 2026, only ~35% have updated — leaving an estimated 3.25 million sites still running vulnerable versions.
The vendor score of 8.8 HIGH overstates the real-world risk. The CVSS vector (AV:N/AC:L/PR:L/UI:N) treats this as a straightforward authenticated network attack, but the actual chain is a *second-order* injection that requires (1) trackbacks/pingbacks to be enabled, (2) the admin to perform a migration or backup-restore cycle, and (3) the attacker to monitor public comments for the leaked key and then act on it before it's noticed. Each of these conditions introduces timing friction that CVSS cannot capture. Patchstack independently categorized this as 'low priority, unlikely to be exploited', and the EPSS score of 0.00538 sits well below the 95th percentile. There is no KEV listing and no confirmed in-the-wild exploitation. The 8.8 is a theoretical ceiling; the operational reality is a MEDIUM.
5 steps from start to impact.
Plant payload via trackback
wp_comments table. No authentication is required — trackbacks are an open XML-RPC feature enabled by default in many WordPress installations.- Target site has trackbacks or pingbacks enabled
- XML-RPC endpoint (
/xmlrpc.php) is reachable
- Many hardened WordPress sites disable XML-RPC entirely via plugin (Wordfence, iThemes) or
.htaccessrule - Some WAFs (Cloudflare, Sucuri) block or challenge XML-RPC traffic by default
- WordPress 6.x+ shows declining trackback usage; some hosts disable it at the platform level
Wait for admin export+import cycle
- Plugin must be version ≤ 7.109
- Admin must perform a backup export followed by an import/restore
- Migration events are infrequent — most sites migrate during initial setup, hosting changes, or staging refreshes, not on a daily schedule
- The attacker has no control over *when* this happens — exploitation is non-deterministic
- Sites using external backup solutions (UpdraftPlus, host-level snapshots) may never trigger this plugin's restore path
Secret key leaks to public comment
ai1wm_secret_key from the wp_options table and writes it into a publicly visible comment on the site. The attacker monitors the site's comments (or RSS feed) for the leaked key value.- Comments must be publicly visible on the site
- Attacker must be monitoring the site for the leaked value
- Sites with comment moderation enabled will hold the leaked key in a moderation queue, invisible to the attacker
- Sites using Disqus or other external comment systems won't surface the wp_comments data publicly
- Anti-spam plugins (Akismet) may filter or quarantine the generated comment
wp_options during restore operations; comment anomaly detectionImport malicious .wpress archive
ai1wm_secret_key, the attacker crafts a malicious .wpress archive containing a PHP webshell or backdoor. They use the plugin's import endpoint with the stolen key to upload and restore the malicious archive, overwriting site content and planting executable code.- Valid
ai1wm_secret_keyobtained from step 3 - Plugin import endpoint is accessible
- If the admin has already updated to 7.110 by the time the attacker obtains the key, the import endpoint behavior may differ
- WAFs with file upload inspection may flag
.wpressarchives containing PHP code - Rate limiting on the import endpoint could slow brute-force attempts if the key is partial
/wp-content/plugins/all-in-one-wp-migration/ endpoints; file integrity monitoring (OSSEC, Wordfence) detecting new PHP files after importWebshell execution and site takeover
www-data or equivalent). The attacker now has arbitrary code execution on the WordPress host, enabling data exfiltration, defacement, lateral movement to co-hosted sites, or use as a spam/phishing relay.- Malicious archive successfully imported and restored
- PHP execution enabled in the webroot (standard WordPress config)
- Container-based or read-only filesystem hosting environments may prevent persistent file writes
- PHP
disable_functionshardening can limit post-exploitation capability - Network segmentation between web tier and backend databases limits lateral movement
The supporting signals.
| In-the-Wild Exploitation | No confirmed exploitation. Not listed on CISA KEV. No GreyNoise tags or Shadowserver alerts as of 2026-09-03. |
|---|---|
| Proof of Concept | Technical details of the full chain (trackback → second-order SQLi → key leak → RCE) are publicly documented. No standalone weaponized PoC tool identified in public repos. Researcher Jack Taylor disclosed through Wordfence/Defiant. |
| EPSS Score | 0.00538 — low probability of exploitation in the next 30 days. Well below the 95th percentile threshold. |
| KEV Status | Not listed. No CISA KEV entry as of 2026-09-03. |
| CVSS Vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — 8.8 HIGH. The PR:L is debatable; the initial trackback injection is unauthenticated, but the CVSS may reflect the admin-action dependency as a privilege gate. |
| Affected Versions | All-in-One WP Migration and Backup ≤ 7.109 (all versions since inception) |
| Fixed Version | 7.110 (released August 20, 2026). No distro backports — WordPress plugins update via wordpress.org repository. |
| Exposure Population | ~5.25 million active installations per wordpress.org. As of early September 2026, only ~35% have updated — ~3.25 million sites remain on vulnerable versions per BleepingComputer. |
| Disclosure Date | 2026-08-25 (public advisory). Patch released 2026-08-20 (5-day head start). |
| Researcher / Org | Jack Taylor, reported through Wordfence / Defiant Inc. |
noisgate verdict.
The single most decisive downgrade factor is the timing-dependent second-order execution: the attacker's payload lies dormant until an administrator voluntarily performs a migration export+import cycle, an infrequent operational event over which the attacker has zero control. This non-deterministic trigger window, combined with multiple prerequisite conditions (trackbacks enabled, comments public, key monitoring), compresses the realistic exploitability far below what the 8.8 CVSS suggests.
Why this verdict
- Non-deterministic trigger: The entire chain depends on an administrator performing an export+import cycle — a migration event the attacker cannot force. Most WordPress sites perform this operation a handful of times per year at most, creating an exploitation window measured in weeks or months, not hours.
- Compounding prerequisites: Trackbacks must be enabled (many hardened sites disable XML-RPC), comments must be publicly visible (moderation queues break the key leak), and the attacker must be actively monitoring the target — each condition independently narrows the exploitable population.
- No exploitation momentum: Zero KEV listing, no GreyNoise tags, EPSS at 0.00538, and Patchstack independently assessed this as 'low priority, unlikely to be exploited.' The security ecosystem is not treating this as an active threat.
- Role multiplier: WordPress sites are overwhelmingly (b) typical role — public web presence or line-of-business applications. Blast radius of successful exploitation is limited to one site/tenant. WordPress is not canonically a high-value-role component (not an IdP, hypervisor, DC, backup server, or CI/CD system). In rare shared-hosting scenarios, lateral movement to co-hosted sites is possible but requires additional privilege escalation beyond the webshell. No floor override applies.
Why not higher?
Despite 5 million active installations and an RCE end-state, upgrading to HIGH would require either active exploitation evidence, a deterministic trigger the attacker controls, or a high-value deployment role. None of these conditions are met. The second-order nature with an admin-dependent trigger fundamentally limits weaponization at scale — mass exploitation campaigns cannot reliably time the detonation.
Why not lower?
Dropping below MEDIUM would undercount the sheer exposure population (~3.25 million vulnerable sites) and the severity of the end-state (unauthenticated-to-RCE, even if timing-dependent). The full chain IS publicly documented, trackbacks ARE enabled by default in many WordPress installations, and a motivated attacker targeting a specific site could plant the payload and wait patiently. This is not a theoretical-only vulnerability — it is a viable targeted attack vector.
What to do — in priority order.
- Disable XML-RPC and trackbacks — Block or disable
/xmlrpc.phpentirely via.htaccess, Nginx config, or a security plugin like Wordfence or Disable XML-RPC. This eliminates the unauthenticated injection vector completely. No noisgate mitigation SLA applies for MEDIUM — go straight to the 365-day remediation window, but this control is trivial to deploy immediately. - Enable comment moderation for all comments — Set WordPress to hold all comments for manual approval (
Settings → Discussion → Comment must be manually approved). This prevents the leakedai1wm_secret_keyfrom being publicly visible, breaking step 3 of the chain. - Update to version 7.110 — The definitive fix. Update via the WordPress plugin repository. Per the noisgate remediation SLA for MEDIUM, complete within 365 days — but given the trivial update mechanism, there's no reason not to do it within your next maintenance window.
- Restrict plugin import endpoint access — If you don't actively use the migration/import feature, consider deactivating the plugin entirely on production sites. If needed only during migrations, activate it only for the migration window and deactivate afterward.
- Web Application Firewall (generic SQL injection rules): The injection payload is stored via trackback and only executes during a restore operation internal to the plugin. Standard SQLi WAF signatures inspect HTTP request parameters, not internal database rewrite operations during plugin restore cycles.
- Database-level query logging without restore-context correlation: Logging all SQL queries will generate massive noise. Without context that the query originated from a plugin restore operation, the injection is indistinguishable from normal plugin database rewrites.
- WordPress auto-updates alone: While WordPress supports auto-updates for plugins, many enterprise WordPress deployments disable auto-updates for stability. Do not assume auto-update is covering your fleet — verify the installed version explicitly.
Crowdsourced verification payload.
Run this on each WordPress host (or via SSH across your fleet). Requires read access to the WordPress plugin directory. Example: bash check_cve_2026_19949.sh /var/www/html/wordpress
#!/bin/bash
# CVE-2026-19949 Checker — All-in-One WP Migration and Backup
# Usage: bash check_cve_2026_19949.sh <wordpress_root>
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -euo pipefail
WP_ROOT="${1:-/var/www/html}"
PLUGIN_FILE="${WP_ROOT}/wp-content/plugins/all-in-one-wp-migration/all-in-one-wp-migration.php"
if [ ! -f "$PLUGIN_FILE" ]; then
echo "UNKNOWN — All-in-One WP Migration plugin not found at ${PLUGIN_FILE}"
exit 2
fi
# Extract version from plugin header
VERSION=$(grep -i '^[[:space:]]*\*[[:space:]]*Version:' "$PLUGIN_FILE" | head -1 | sed 's/.*Version:[[:space:]]*//' | tr -d '[:space:]')
if [ -z "$VERSION" ]; then
echo "UNKNOWN — Could not parse plugin version from ${PLUGIN_FILE}"
exit 2
fi
echo "Detected All-in-One WP Migration version: ${VERSION}"
# Compare versions — vulnerable if <= 7.109
# Split version into major.minor components
MAJOR=$(echo "$VERSION" | cut -d. -f1)
MINOR=$(echo "$VERSION" | cut -d. -f2)
if [ "$MAJOR" -lt 7 ] 2>/dev/null; then
echo "VULNERABLE — Version ${VERSION} is affected by CVE-2026-19949 (fixed in 7.110)"
exit 1
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -le 109 ] 2>/dev/null; then
echo "VULNERABLE — Version ${VERSION} is affected by CVE-2026-19949 (fixed in 7.110)"
exit 1
elif [ "$MAJOR" -eq 7 ] && [ "$MINOR" -ge 110 ] 2>/dev/null; then
echo "PATCHED — Version ${VERSION} is not affected"
exit 0
elif [ "$MAJOR" -gt 7 ] 2>/dev/null; then
echo "PATCHED — Version ${VERSION} is not affected"
exit 0
else
echo "UNKNOWN — Could not compare version ${VERSION}"
exit 2
fiIf you remember one thing.
Sources
- BleepingComputer — WordPress backup plugin flaw exposes millions of sites
- Patchstack — All-in-One WP Migration SQLi to RCE
- FreshySites — CVE-2026-19949 Security Bulletin
- SentinelOne Vulnerability Database — CVE-2026-19949
- SOCRadar — CVE-2026-19949
- WPScan — All-in-One WP Migration Plugin Security History
- WordPress.org — All-in-One WP Migration Plugin Page
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.