Click2Shell Advisory vulnerability and BitFire protection

After 1,155 days of no bypasses - Click2Shell Bypassed BitFire: What Failed and What We Changed

WordPress vulnerability research

After 1,155 days of 0-day protection for every critical vulnerability - BitFire did not stop Click2Shell at disclosure. Learn why, what we deployed on September 20, and how PRO RASP protection will expand.

Administrator Visit Required Researcher-Assessed 9.3 Remote Code Execution Chain Selector Injection / CSRF
BitFire · Vulnerability advisoryResearch published
AdvisoryClick2Shell Advisory
ComponentWordPress Core Click2Shell and Mobile Repair Zone 2.5.4
Relevant sourcewp-admin/js/theme.js; Mobile Repair Zone 2.5.4 AJAX installer
Executive summary

What WordPress administrators need to know

Click2Shell is a WordPress Core selector-injection chain that BitFire did not stop when it was disclosed. An unauthenticated attacker persuades a logged-in administrator to visit a crafted theme-preview URL. WordPress then installs an official catalog theme without another click. A Customizer request can load the inactive theme's PHP; Mobile Repair Zone 2.5.4 exposed an AJAX installer that fetched, unpacked, and loaded an attacker-selected plugin. The researchers assessed the demonstrated chain at CVSS 9.3, although WordPress had not issued a CVE or final severity. BitFire deployed firewall rules blocking off-site POSTs to `/wp-admin/admin-ajax.php` on September 20 and is developing broader BitFire PRO RASP enforcement for this attack class.

At a glance

Key facts

  • The attacker needs no WordPress account, but a logged-in administrator must visit the crafted URL
  • WordPress versions before 7.1.1 are expected to contain the Core forced-theme-install primitive
  • Mobile Repair Zone 2.5.4 supplied the separate pre-activation AJAX path used for demonstrated PHP execution
  • BitFire's standard protection layers did not block the disclosed chain
  • Firewall rules blocking off-site admin-ajax POSTs were pushed to clients on September 20
01
Vulnerability overview

Understand the exposure

The affected component, attack path, and practical risk for WordPress websites.

Affected componentWordPress Core Click2Shell and Mobile Repair Zone 2.5.4
Potential reach+100,000,000 installations
Attack techniqueselector injection and cross-site request forgery
Published2026-09-21
BitFire did not stop Click2Shell at disclosure. We shipped a firewall mitigation on September 20 and are building origin-aware PRO RASP enforcement for future attacks in this class.
02
Technical analysis

How the vulnerability works

Research details, affected versions, exploitation behavior, and remediation guidance.

How Click2Shell Reached PHP Execution

The Core flaw begins at `/wp-admin/theme-install.php?theme=...`. WordPress.org canonicalizes the crafted value to a real catalog slug, while the administrator's browser reuses the unescaped original value as a jQuery selector. Injected selector syntax reaches the genuine Install control, and WordPress spends the administrator's nonce and `install_themes` capability. The theme remains inactive, but a Customizer request can load its PHP. Mobile Repair Zone 2.5.4 then registered an authenticated AJAX installer without its own nonce or capability check. That handler accepted a plugin URL, fetched the package, wrote it under the plugins directory, unpacked it, and loaded the selected PHP entry point. The Core primitive alone is forced catalog-theme installation; PHP execution requires the second flaw.

Why BitFire's Existing Layers Did Not Stop It

Click2Shell crossed our controls in ways they were not designed to reject. The administrator used a real, verified browser, so Bot Protection correctly treated the visitor as human. The first request carried selector syntax rather than SQL injection, XSS, object injection, traversal, or another standard WAF payload class. The follow-on AJAX POST used ordinary-looking plugin metadata, while the vulnerable server fetched the ZIP itself instead of receiving a malicious file upload for inspection. Most importantly, the attack rode a valid administrator session. At disclosure, BitFire had no origin-aware rule that treated an off-site POST to `admin-ajax.php` as unauthorized. We therefore cannot claim the standard WAF or BitFire PRO RASP stopped this chain: they did not.

Firewall Mitigation Deployed September 20

On Sunday, September 20 the day after public disclosure, BitFire pushed new firewall filtering rules to free and PRO clients that block this specific clik2shell attack. This targets the initial link an attacker must trick an administrator into clicking to exploit the vulnerability. The mitigation does not repair WordPress Core or clean an already compromised site. It is a focused request-layer interruption based on provenance, not a claim that the selector-injection payload matches a generic WAF signature. Site owners should still install WordPress 7.1.1 or later as soon as possible to address this and other vulnerabilities.

BitFire PRO RASP Protection Is Being Expanded

BitFire is investigating a BitFire PRO RASP control that will prevent off-site POSTs to `/wp-admin/admin-ajax.php`, closing the trust gap that let a foreign page drive a sensitive action through a legitimate administrator browser. The control is scheduled to roll out to PRO clients in alert-only mode during September. Alert mode records matches but does not block them, giving us evidence about legitimate integrations and false positives. After one month of evaluation with no false positives, enforcement will move to blocking. This mechanism is broader than a Click2Shell signature: RASP clients will receive protection against future vulnerabilities in the same class, where an external origin attempts to invoke an AJAX operation through an authenticated WordPress session.

If Your Site Was Affected, Investigate for Persistence.

WordPress 7.1.1 escapes the URL-derived slug with `$.escapeSelector()` and limits the selector to a real `div.theme` card, preventing the forced Install click. Patch immediately, and remove or update Mobile Repair Zone 2.5.4 when a vendor-fixed release is available. Patching closes the known routes but does not remove an earlier compromise. Sites that ran affected software should investigate, remove discovered persistence, and rotate relevant WordPress, hosting, database, SSH, and SFTP credentials. BitFire Threat Hunter can uncover backdoor administrator accounts, hidden database triggers, long-running PHP processes, and droppers capable of restoring malware. The absence of an obvious malicious plugin does not prove the site is clean.

Transparent Security Means Fixing the Gap

BitFire failed to stop the disclosed Click2Shell chain, and WordPress owners deserve that fact without evasive marketing. The immediate firewall rule now blocks its initial attack vector stage, while the planned BitFire PRO RASP control is being evaluated for safe, durable enforcement across this vulnerability class. Update WordPress now, investigate any previously exposed site with Threat Hunter, BitFire rules auto update daily so sites are already protected. Protection improves when failures are analyzed precisely, mitigations ship quickly, and runtime controls evolve from evidence rather than unsupported claims.

03
Source review

Vulnerable and fixed code

The relevant source is located in wp-admin/js/theme.js; Mobile Repair Zone 2.5.4 AJAX installer.

BeforeVulnerable behavior
$( 'div[data-slug="' + slug + '"]' ).trigger( 'click' );
AfterCorrected behavior
$( 'div.theme[data-slug="' + $.escapeSelector( slug ) + '"]' ).trigger( 'click' );
04
Zero-day protection

Protection from the first exploit request

BitFire protects WordPress servers on day zero—before a vulnerability is publicly known and before other vendors have time to develop signatures or patches.

01 · VerifyStop unknown clients

Bot controls and browser verification stop untrusted automated clients before previously unknown exploit code reaches WordPress.

02 · DetectBlock malicious behavior

General WAF protections identify dangerous request behavior and hostile payloads without waiting for a vulnerability-specific signature.

03 · PreventContain attacks at runtime

RASP follows execution inside PHP and prevents unauthorized changes to protected files, accounts, and database content.

BitFire · WordPress protectionZero-day ready
BitFire zero-day WordPress vulnerability protection
BitFire combines verified-client controls, behavior-based WAF detection, and runtime RASP enforcement to protect WordPress before an exploit has a name, CVE, signature, or vendor patch.
About the author

Cory Marsh

Cory has more than 20 years of internet security experience and is a lead developer on the BitFire project.

Read BitFire security research →
Protect your WordPress website

Add protection before the next exploit arrives.

BitFire combines bot controls, request inspection, malware detection, and runtime protection in one WordPress security platform.

Protect my site free →