Skip to content

Build1 publisher2 min readPublished

Admin Menu Editor Pro's own update channel delivered the web shell to 1,500 sites

The developer pulled 2.35 and published 2.36, but the distribution server was still compromised, so some 2.36 downloads carried the same code and about 1,500 sites need a restore from backups taken before September 14.

The Engineer · Build desk

Illustration accompanying Admin Menu Editor Pro's own update channel delivered the web shell to 1,500 sites

What happened

  • An attacker breached Admin Menu Editor Pro's official distribution infrastructure and placed code that deploys a web shell into version 2.35 and into some copies of version 2.36.
  • Initial reports put the spread at roughly 230 customers and about 1,500 WordPress sites.
  • Affected sites show persistence traces including hidden users, extra PHP files, database options, MU plugins and WP-Cron entries, though the same behaviour has not been confirmed everywhere.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint Upgrading is not a remedy when the replacement build shipped from the same compromised server, so an operator cannot close this incident out through the plugin updater.
  • cost Restore and credential rotation land on the customer, and at roughly 6.5 sites per customer the average buyer does that work several times over.
  • exposure Anything written outside the plugin directory survives an uninstall, so a site that only removed the plugin can still be reached through hidden users and files placed elsewhere.
  • decision Automatic updating gave the compromised server a direct write path into production. Whether to leave it on becomes a decision taken per plugin.

The write happens at install time. WordPress unpacks the package, the plugin's PHP loads, and `includes/wp-user-consent.php` deploys a web shell [4]. It executes with the privileges of the process running WordPress, and that is the only prerequisite the code has: dropping a shell or a persistence hook needs write access to files or the database under those privileges [8][9]. A filename like wp-user-consent.php also survives a skim of a plugin directory.

To an administrator, the install looked like a normal plugin update [10]. Hidden users may not show up in the dashboard, and the developer's instructions are to query the `wp_users` table directly [11]. Automatic updates take the same path as a manual click, so unattended sites pulled the package with nobody watching [18].

The account here comes from a dev.to summary of the developer's advisory and BleepingComputer's reporting, dated September 14 and updated September 16, which rates the incident Emergency [19].

Version 2.36 is where the standard remedy fails. The developer removed 2.35 and published 2.36, but the distribution infrastructure was still compromised, and malicious code was mixed into some copies of 2.36 as well [3]. The version string does not tell you what was in the zip you received. The summary attributes a suspicion of compromised root privileges to the description of the distribution server, and separates that from privileges on customer servers [7].

That also breaks hash checking. Digests published by the compromised source cannot establish that a package is safe, and the summary marks this as its own inference rather than reported fact; it points to comparison against a trusted source independent of the compromise, or staged rollouts, as what limits how far a bad build spreads [13].

Roughly 1,500 sites across about 230 customers works out to about 6.5 sites per customer [2][21]. Remediation is per site. The developer's guidance is to remove 2.35 and 2.36, recover from a backup created before September 14 where one exists, and change credentials [6][23].

Shells and persistence written elsewhere survive deletion of the plugin [17]. A WAF can block the attacker's HTTP requests and still leave the code that already ran during the update, and the users created at that moment, in place, again per the summary's analysis [14].

The developer's position is that sites where a web shell was deployed should be handled as if the attacker had full control [12]. Restoring a backup does not revoke information already taken [15]. The scope of that theft has not been publicly disclosed [16].

What to watch

  • Whether the developer publishes how the distribution server was breached and what changed in the build and signing pipeline before the next release.
  • Whether the 230-customer, 1,500-site count moves as notifications go out; the summary treats the notification list as incomplete.
  • Whether the developer publishes what data left compromised sites.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories