wp2shell: Critical WordPress core vulnerability actively exploited

wp2shell is a WordPress core vulnerability (CVE-2026-63030, CVE-2026-60137). Confirm 6.8.6, 6.9.5, or 7.0.2, then check leftover admins and what a scanner can actually prove.

Topics Hardening & checklists

Lars Koudal

Lars Koudal

Updated Published

Latest developments

  1. More than a month later: leftover access is the remaining job

    WordPress shipped 6.8.6, 6.9.5, and 7.0.2 on July 17. That is more than a month ago. FortiGuard Labs still lists scanning against WordPress core. The news is not new. What still goes wrong is leftover access on sites that were patched late, or never checked after the update. Confirm the version first. Then Users, must-use plugins, and PHP in uploads. A checker tells you if the hole is still open. It does not prove leftover access is gone. If a site already looks wrong, treat that as cleanup work, not a dashboard glance.

  2. Monday after one month: check the sites nobody opened last week

    WordPress shipped 6.8.6, 6.9.5, and 7.0.2 on July 17. That was one month ago yesterday. FortiGuard Labs still lists scanning against WordPress core. Monday is when agencies and freelancers usually open the quiet installs: the ones auto-updates missed, and the ones nobody logged into last week. Confirm the version first. Then Users, must-use plugins, and PHP in uploads. A checker tells you if the hole is still open. It does not prove leftover access is gone. If a site already looks wrong, treat that as cleanup work, not a dashboard glance.

  3. One month later: if you found a strange admin email, start here

    WordPress shipped 6.8.6, 6.9.5, and 7.0.2 on July 17. That is one month ago today. FortiGuard Labs still lists scanning against WordPress core. What still turns up is leftover access: an administrator you did not create, often with an email on @wp2shell.invalid or @wp2shell.local. Confirm the version on every site, including ones nobody opened this week. Then check Users, must-use plugins, and PHP in uploads. Searchlight Cyber’s wp2shell.com checker tells you if a site is still vulnerable. Eye Security’s Compromise Scanner looks for known traces after you update. Neither one finishes cleanup, and a clean result is not a guarantee.

  4. Saturday check: the sites nobody opened this week still count

    It is almost four weeks since WordPress shipped 6.8.6, 6.9.5, and 7.0.2. FortiGuard Labs still lists scanning against WordPress core. Weekends are when agencies and site owners usually stop looking. That is also when leftover access on a quiet install keeps working. Confirm the version on every site, including ones nobody logged into this week. Then check Users, must-use plugins, and PHP in uploads. Eye Security published a read-only Compromise Scanner for wp2shell on WordPress.org that looks for known database and plugin traces. A clean result is not a guarantee. A match is not automatic proof. Update core first, then use helpers as extra eyes.

  5. Almost four weeks later: check every site, including the ones nobody logged into

    WordPress shipped 6.8.6, 6.9.5, and 7.0.2 on July 17. FortiGuard Labs still reports scanning against WordPress core. Most people who were going to hear the news already did. What still goes wrong is skipping installs where auto-updates were blocked, or calling a site clean after a dashboard glance. If you manage client sites, check each one, including the dormant ones. InstaWP published a read-only wp2shell-scan helper, and Elastic Labs published detection notes for teams that already collect logs. Those tools can surface traces. They do not replace the WordPress update, and they do not finish cleanup on a site that was already owned.

Earlier timeline 12
  1. Forensics: attackers can stay active after the site reaches a fixed WordPress version

    A forensic write-up from a July compromise describes one site taken over by at least two different attacker groups, each with its own way of staying in. Activity continued after WordPress was updated to 7.0.2. The leftovers were not only rogue admins and webshells in the site files. Investigators also found host-level footholds such as system crontab entries and payloads outside the WordPress folder. Takeaway: confirm every install is on 6.8.6, 6.9.5, 7.0.2, or newer, then treat cleanup as a WordPress plus hosting check. FortiGuard Labs still reports scanning against WordPress core. If you manage many sites, verify versions one by one, including installs where automatic updates were blocked for stability.

  2. Nearly a month later: scanning continues

    It has been almost four weeks since WordPress shipped 6.8.6, 6.9.5, and 7.0.2. FortiGuard Labs still reports wp2shell exploitation attempts against WordPress core. Confirm the version on every site you manage. A fixed version closes the known hole. It does not clean a site that was already compromised. Keep checking for rogue admins, must-use plugins, PHP in uploads, and leftover webshells.

  3. Hosting forensics: a quick cleanup can leave the door open

    InMotion Hosting published a report from real wp2shell compromises. Attackers went from the batch endpoint to a new admin and a malicious plugin in under 30 seconds. They stayed in through rogue admins, lookalike plugins, must-use plugin files that restore deleted malware, PHP under uploads, encoded options-table payloads, wp-config loaders, and cron. One site was cleaned of rogue admins and patched, then taken over again six days later through a leftover webshell. Another used a must-use credential stealer that hid from the mu-plugin list. Extra checks: look in wp-content/mu-plugins, review application passwords on real accounts, and treat a patched dashboard as closing the hole, not proof the compromise is gone. FortiGuard still reports ongoing exploitation attempts.

  4. FortiGuard: thousands of attempts still blocked daily

    FortiGuard Labs is still seeing wp2shell exploitation attempts against WordPress core. In one recent 24-hour window its IPS blocked 4,649 attempts, with about 88,452 detections over seven days. The highest recent volume involved Poland, Australia, Japan, the United States, and Turkey. Three weeks after the security releases, the reminder is the same: confirm every install is on 6.8.6, 6.9.5, 7.0.2, or newer, then check for compromise, including rogue administrators left by failed exploit runs.

  5. Research chain shows a path from wp2shell past PHP hardening to Linux root

    Calif published wp2root, a research chain that starts after wp2shell already has PHP execution. It uses a PHP memory-corruption path to get around disable_functions and similar interpreter limits, then Copy Fail (CVE-2026-31431) to reach fileless root without changing binaries on disk. This shows what is possible after a successful foothold. It is not a claim that this exact chain is already common in the wild. Practical takeaway: update WordPress, check for compromise, and do not assume PHP hardening alone contains the damage. Hosts should also apply kernel updates for CVE-2026-31431. FortiGuard Labs still reports thousands of exploitation attempts daily.

  6. Failed exploit attempts can still leave rogue admins behind

    Bitdefender MDR documented a wp2shell incident where the attack stalled twice after creating unauthorized w2s_-prefixed administrator accounts, with no plugin or webshell left behind. On the third attempt it succeeded, uploaded malicious plugin droppers, and deployed PHP webshells. The cleanup step only runs when the whole chain works, so an unknown admin can mean the site was targeted and the attacker may come back. Check Users for admins you did not create before deciding a patched site is clean.

  7. Attack volume jumped the day the patches shipped

    Cyber Security Cloud reported about 1.95 million batch-endpoint detections over nine days after disclosure, including a roughly 277x jump on the day the patches shipped. FortiGuard Labs still reports exploitation attempts worldwide. Same reminder: update and verify each install, then check for compromise.

  8. More defender write-ups, and sharper compromise checks

    Wordfence reports more than 11 million blocked exploit attempts against the chain. Eye Security, Tenable, Wiz, and others published defender guidance, including admin username and email patterns tied to public PoCs. Indicators and sources on this page were refreshed.

  9. Attack data and leftover malware reporting refreshed

    Wordfence published technical analysis and real attack data. Broader reporting confirms opportunistic webshell and malicious-plugin installs after a successful chain. Compromise checks and sources on this page were updated.

  10. Advisory published

    Initial advisory with affected versions, fixed releases, recommended checks, and primary sources.

  11. Added to CISA Known Exploited Vulnerabilities Catalog

    CISA added CVE-2026-63030 and CVE-2026-60137 to the KEV catalog based on evidence of active exploitation.

  12. WordPress security releases published

    WordPress 6.8.6, 6.9.5, and 7.0.2 were released with security fixes for the related core vulnerabilities.

Fixed versions

Confirm that every WordPress install is on 6.8.6, 6.9.5, 7.0.2, or newer. Updating closes the known holes, but it does not by itself prove a previously exposed site is clean.

60-second check

  1. WordPress version is 6.8.6, 6.9.5, 7.0.2, or newer (Dashboard → Updates, not only “you have the latest”).
  2. Users: no administrators you did not create, and no odd emails such as @wp2shell.invalid or @wp2shell.local.
  3. Plugins: nothing new, renamed, or unknown.
  4. wp-content/mu-plugins/: unexpected files (these often hide from the Plugins list).
  5. Uploads and cache: no unexplained PHP files.

If any of those look off, keep going through the full checklist below. Do not stop at the version number.

Who is affected?

WordPress branchExposureFixed version
7.0 through 7.0.1Both vulnerabilities and complete attack chain7.0.2
6.9 through 6.9.4Both vulnerabilities and complete attack chain6.9.5
6.8 through 6.8.5Related SQL-injection vulnerability only6.8.6
Earlier than 6.8Not affected by these two vulnerabilitiesUpgrade to a currently supported branch

Older WordPress

Versions before 6.8 are not affected by these two vulnerabilities. That does not mean older or unsupported WordPress installs are generally safe. Unsupported branches still need a supported upgrade path.

WordPress 7.0.2 was released on July 17, 2026 and fixed one critical and one high-severity core issue. WordPress 6.9 is affected by both. WordPress 6.8 is affected only by the facilitated SQL-injection vulnerability. Because of the severity, WordPress enabled forced automatic updates for affected installations.

If you manage many sites

Verify each install, including sites nobody has logged into for months and sites where automatic updates were blocked for stability. One dashboard glance is not a portfolio check. WP-CLI (wp core version) or a hosting panel list is faster than opening every wp-admin. Searchlight Cyber’s wp2shell.com checker tests whether a site is still vulnerable. Helpers such as InstaWP’s read-only wp2shell-scan and Eye Security’s Compromise Scanner for wp2shell can flag known traces after you update. They do not replace the core update, and they do not finish cleanup.

What site owners should do now

Do now

  1. Check the installed WordPress version (Dashboard → Updates, or the About WordPress screen / admin footer).
  2. Update to WordPress 6.8.6, 6.9.5, 7.0.2, or a newer secure release on your branch.
  3. Verify the update finished. Dashboard → Updates should show 6.8.6, 6.9.5, 7.0.2, or newer, not only a generic “you have the latest” message.

Then check for compromise

  1. Check for unexpected administrator accounts, including odd usernames or email addresses you did not create. Public PoCs have used login prefixes such as wp2_ and w2s_, and emails on @wp2shell.invalid (including addresses such as site_admin@wp2shell.invalid), @wp2shell.local, and @wp2shell.shellcode.lol.
  2. Review application passwords on every administrator (Users → Profile / Application Passwords). A rogue admin is easy to spot. An application password on a legitimate account can survive a rushed cleanup.
  3. Review recently installed, uploaded, or modified plugins, including anything that looks like a renamed lookalike.
  4. Inspect wp-content/mu-plugins/. Must-use plugins load automatically, often do not appear in the normal Plugins list, and cannot be deactivated from the dashboard. Hosting forensics after wp2shell found guardians and credential stealers here.
  5. Check for unexplained PHP files under uploads, cache, and other writable directories.
  6. Review hosting, firewall, WordPress, and application logs around the period the site may have been vulnerable. Pay attention to traffic hitting the REST API batch endpoint (/wp-json/batch/v1 or ?rest_route=/batch/v1), especially unusual Multi-Status (HTTP 207) responses.
  7. Investigate unexplained redirects, scheduled tasks (including server cron), outbound requests, or newly created files.
  8. Change sensitive credentials when there are signs of compromise. The SQL-injection path can expose password hashes, so force password resets for administrators (and preferably all users) if the site was exposed before patching. Also rotate salts / force logout of all sessions when compromise is suspected.
  9. Restore from a known-clean backup or get professional help when compromise is confirmed. Do not assume a backup taken after July 17 is clean.

Changing passwords alone does not clean a compromised site. If you find clear signs of intrusion, treat credentials, files, and plugins as one problem, not separate chores.

If this already looks wrong

You do not have to finish cleanup alone. If you found an unknown admin, odd plugins, or PHP where it should not be, we can help with cleanup and next steps. Use the checklist first so you know what you are looking at.

Patched is not the same as clean

Installing the update stops the known vulnerability from being used going forward. It does not undo anything an attacker may have done while the site was still vulnerable.

A fixed version in the dashboard is not the same as finishing a security check. Investigators have documented sites that looked clean after a quick cleanup, then were re-owned days later through a leftover webshell or a must-use plugin that restored files.

If you updated quickly and nothing looks wrong after the 60-second check, you may not need a full incident response. If you find suspicious accounts, files, plugins, redirects, or logs, dig deeper, including host cron and files outside the WordPress folder.

Rule of thumb

Update first. Then decide how deep to investigate based on what you find in users, plugins, files, and logs. PHP hardening helps, but it is not a substitute for patching WordPress or reviewing a site that was exposed.

What is wp2shell?

wp2shell is the informal name for a WordPress core vulnerability chain, not a plugin bug. The two CVE IDs are CVE-2026-63030 (REST API batch route/handler confusion) and CVE-2026-60137 (SQL injection in WP_Query). Together they can let someone take over an affected site without logging in.

At a high level:

  1. A WordPress REST API batch-processing issue can cause validation and execution to become associated with different route handlers.
  2. That confusion can expose a separate SQL-injection weakness in WP_Query.
  3. When chained, the vulnerabilities can let someone take over an affected site without logging in. After that, attackers often install malware: webshells, malicious plugins, or both.

Wordfence recorded probing of WordPress REST API traffic on July 17, 2026, with a clear SQL-injection attempt minutes later. Later reporting from multiple vendors describes opportunistic campaigns that install webshells and malicious plugins after a successful chain. No exploit steps here on purpose.

Indicators worth reviewing

Treat these as areas to investigate, not proof that a website has been compromised:

  • Unexpected WordPress administrator accounts (including unusual login names or email domains)
  • Admin usernames starting with wp2_ or w2s_ (reported PoC patterns)
  • Admin emails using @wp2shell.invalid (including addresses such as site_admin@wp2shell.invalid), @wp2shell.local, or @wp2shell.shellcode.lol
  • Unexpected application passwords on otherwise legitimate administrator accounts
  • Recently activated, uploaded, or installed plugins, including lookalike or unknown plugin folders
  • Unexpected files in wp-content/mu-plugins/ (must-use plugins may hide from the normal plugin list)
  • Modified theme or plugin PHP files
  • Unexpected PHP files in uploads, cache, or other writable directories
  • Encoded or suspicious options / transients that mimic site-health names
  • Requests involving the WordPress REST API batch endpoint (/wp-json/batch/v1 or ?rest_route=/batch/v1), especially HTTP 207 Multi-Status responses
  • User-agent strings that mention wp2shell or rezwp2shell (reported as tool signatures)
  • Unexplained WordPress cron events or server crontab entries that restore files
  • Unfamiliar redirects or injected JavaScript
  • New outbound network connections
  • Changes to wp-config.php, .htaccess, server configuration, or must-use plugins
  • Security alerts around the time the site remained vulnerable

Partial exploit warning

Bitdefender MDR saw wp2shell fail twice while still creating unauthorized w2s_ administrators, with no webshell or malicious plugin left behind. The third attempt succeeded and deployed droppers. An unknown admin is a serious indicator even when the file system looks clean.

If you still have admin access, a malware scan and security tests can help surface suspicious files and configuration issues. For confirmed compromise, professional cleanup is often the safer path.

Does a firewall protect the website?

A web application firewall may block known attack patterns and reduce exposure while you update. Useful, but:

  • A firewall is not a substitute for installing the WordPress update.
  • Temporarily blocking anonymous access to the REST batch endpoint at the edge can buy time while you patch. It is not a permanent fix.
  • Rules differ between vendors and hosting providers.
  • Confirm both the WordPress version and any protection status.
  • A firewall cannot clean a site that was already compromised.

A security plugin does not replace applying the official WordPress security releases for this issue. WP Security Ninja can still help with monitoring and scanning after you update.

Frequently asked questions

Is wp2shell a plugin vulnerability?

No. It is a WordPress core vulnerability chain (CVE-2026-63030 and CVE-2026-60137). Plugins and themes are not the root cause of these two issues, though a compromised site may still show malware afterward: malicious plugins, webshells, or file changes.

Which WordPress versions are affected?

WordPress 7.0 through 7.0.1 and 6.9 through 6.9.4 are affected by both issues in the chain. If you are still on 6.9.4 or 7.0.1, you are on the last vulnerable release of that branch. WordPress 6.8 through 6.8.5 is affected by the related SQL-injection vulnerability only. Fixed releases are 7.0.2, 6.9.5, and 6.8.6.

Did WordPress update automatically?

WordPress enabled forced automatic updates for affected installations because of the severity. You should still verify that every site reached a fixed version. Automatic updates can fail on some hosts, locked files, or heavily customized setups.

How can I check my WordPress version?

In wp-admin, open Dashboard → Updates, or check the version shown on the About WordPress screen / admin footer (depending on your setup). Hosting panels and WP-CLI (wp core version) also report it.

Is there a wp2shell checker?

There are a few, and they answer different questions. Searchlight Cyber’s wp2shell.com checker tests whether a site is still vulnerable to the hole. After you update, Eye Security’s Compromise Scanner for wp2shell and InstaWP’s wp2shell-scan look for known leftover traces. None of them prove a site is clean. Update WordPress first, then use them as extra eyes.

Does updating prove my website is clean?

No. Updating closes the known vulnerabilities going forward. It does not undo earlier unauthorized changes. Investigate if you see suspicious accounts, files, plugins, redirects, or logs.

Should I disable the REST API?

Disabling the REST API is not the recommended fix and can break legitimate features. Install the official security update for your WordPress branch instead. If you cannot update immediately, a temporary edge rule against anonymous batch REST access is a bridge, not a replacement for the core release.

Does a security plugin replace the update?

No. Update WordPress first. Security plugins can help with detection, monitoring, and layered protection, but they do not replace applying the core security releases.

Can a scanner prove the site is clean?

No. Read-only helpers such as Eye Security’s Compromise Scanner for wp2shell and InstaWP’s wp2shell-scan can flag known traces. A clean result is not a guarantee. A match still needs a human check. Update WordPress first, then use scanners as extra eyes.

What should I do if I find an unknown administrator?

Treat it as a serious indicator. Do not only delete the user and move on. Investigate how it was created, review plugins and file changes, rotate credentials, and consider a full malware review or cleanup help.

I found an admin email like site_admin@wp2shell.invalid. Is that wp2shell?

Treat it as a serious indicator, not automatic proof. Public PoCs have used emails on @wp2shell.invalid, @wp2shell.local, and @wp2shell.shellcode.lol, plus login prefixes such as wp2_ and w2s_. Confirm the WordPress version, then go through the checklist: Users, application passwords, must-use plugins, and PHP in uploads.

Are WordPress versions before 6.8 safe?

They are not affected by these two specific vulnerabilities. That is not the same as being secure or supported. Unsupported versions still need upgrading to a currently maintained branch.

Where can I follow new developments?

Watch the WordPress.org news post for 7.0.2, the CISA KEV catalog, and this advisory page. We update the Latest developments section when something material changes.

After you update

Keeping WordPress updated is the first line of defense. If you need cleanup help, we can help. When you are ready for extra monitoring, WP Security Ninja can review configuration, watch security events, and spot suspicious changes.

Sources

Reference IDs

  • CVE-2026-60137, CVE-2026-63030
  • CVE-2026-31431 (Copy Fail, post-exploitation host escalation research)
  • GHSA-fpp7-x2x2-2mjf, GHSA-ff9f-jf42-662q

Found this useful? Share it.

Larger screenshot