Skip to main content
Agency Program Get 2× more leads and save 50% on hosting. Built for agencies ready to grow. Book a call

WordPress Virtual Patching: How We Block a Plugin Exploit Before You Can Update

Virtual patching blocks a WordPress exploit at the web server, before PHP runs, so a site is protected while it still runs the unpatched plugin. How InstaWP detects, ships and verifies those rules, using the Elementor Pro RCE (CVE-2026-32475) as the worked example.

VS
Vikas Singhal
Founder, InstaWP
Updated Sep 17, 2026 37 min read

Virtual patching is a rule at the web server that refuses requests matching a known exploit, so a WordPress site is protected before its plugin is updated. It does not change your site, and it does not need the vendor’s fix to exist yet. On 19 August 2026, InstaWP used one to shut down a critical unauthenticated remote code execution flaw in Elementor Pro across its entire hosting fleet in under two hours, while every affected site was still running the vulnerable plugin.

Key takeaways

  • Virtual patching blocks the exploit, not the bug. A rule on the web server refuses requests that match a known exploit, so a site is protected while it still runs the unpatched plugin.
  • The window is the enemy. Sites are not usually taken by unknown bugs. They are taken in the gap between a public advisory and the day somebody clicks update.
  • Licensed plugins are the hard case. Elementor Pro updates need the customer’s own licence key, so no host can push the fix. A server-level rule is the only control that works there.
  • Where the rule runs decides what it costs you. InstaWP evaluates it in nginx, before PHP starts. A plugin firewall has to boot WordPress before it can decide to block anything.
  • An unverified protection is not a protection. Every InstaWP rule ships with a positive test and negative controls, and every server carries a permanent self-test that fails loudly.
  • Readiness, not clairvoyance. InstaWP cannot predict the next vulnerability. The pipeline that responds to it already exists, which is why protection lands the same day instead of next quarter.
Does this affect me? Three questions
1 Do any of your sites run a paid or licensed plugin?
Elementor Pro, a premium forms plugin, a paid theme bundle. If yes, nobody can update it for you, because the download needs your licence key. A rule at the web server is the only protection that works in that gap.
2 Would you know within 24 hours that a plugin you use had a critical advisory?
If the honest answer is “whenever I next log in”, your exposure window is not measured in hours. It is measured in however long it takes you to notice.
3 If your host says it blocks exploits, could you tell where the block happens?
At the web server, or inside WordPress after PHP has already started. The outcome looks the same on paper. The cost and the reliability are not, and there is a two-line test for it further down.
Answered no to any of them? Start with why the gap is the real risk, then how to test your own host. The rest of this post is the machinery behind those two answers.

This post is about the machinery behind that, not the incident. The next critical WordPress vulnerability has not been disclosed yet. Nobody knows what it is, including us. The question that decides whether your sites survive it is not whether they are secure today. It is what happens in the first 24 hours after the flaw becomes public knowledge.

What is virtual patching in WordPress?

Virtual patching is the practice of blocking a vulnerability’s exploit path at a layer in front of the application, instead of fixing the vulnerable code itself. It is a long-established security practice with its own OWASP guidance, not a hosting invention. For WordPress that usually means a rule on the web server that inspects an incoming request and refuses it if it matches the shape of a known attack. The vulnerable plugin stays exactly where it is, at exactly the version it was. The attack simply never reaches it.

If the plugin is a door with a broken lock, a virtual patch is a guard in the corridor who turns away anyone carrying the one tool that opens it. The lock is still broken. Nobody gets to reach it. When the locksmith finally arrives with the vendor’s fix, you replace the lock, and the guard stays on anyway.

It is worth being precise about the distinction, because it is the whole basis for trusting one. A vendor patch removes the bug. A protection rule removes the attacker’s route to the bug. They are different things and you want both. What a protection rule buys you is time: it holds the line during the days or weeks when the real fix exists but has not been applied to your sites yet.

The term, for developers. The industry name for this is a virtual patch, and inside InstaWP that is what we call it. In this post we mostly say “server-level protection rule” instead, because “patch” implies we changed your code, and we did not. Nothing in your site is modified.
The word What it means here
AdvisoryThe public write-up saying a specific plugin version has a specific flaw. Publishing it is what starts the race.
CVEA permanent catalogue number for one vulnerability, so everyone is talking about the same bug. CVE-2026-32475 is the Elementor Pro one in this post.
CVSS scoreA 0 to 10 severity rating. Useful as a signal, unreliable as an instruction, which is why a 9.8 can still mean zero real exposure.
RCERemote code execution. The attacker gets your server to run code they chose. It is the worst outcome on the list.
UnauthenticatedNo login needed. Anyone on the internet can attempt it, which is why these get automated within hours.
Exploit pathThe exact route a request takes to reach the flaw. A protection rule is written against the path, not against the flaw.
nginxThe web server software that answers the request before WordPress is involved. Rules that live here are evaluated first and cost almost nothing.
WAFWeb application firewall. Broad rules against whole attack families. A virtual patch is the narrow, single-vulnerability cousin.
Zero-dayA flaw nobody has published yet. Virtual patching cannot help with one, and this post says so plainly further down.

Why is the gap between disclosure and update the real risk?

Most WordPress sites are not compromised by vulnerabilities nobody knows about. They are compromised by vulnerabilities everybody knows about, on sites that had not been updated yet. That is not a WordPress quirk either: CISA maintains an entire catalogue of known exploited vulnerabilities precisely because published flaws, not secret ones, are what gets used.

Disclosure is the starting gun: the moment an advisory is published, the exploit details are public, and automated scanning for vulnerable installs begins almost immediately. That scanning is indiscriminate. It does not care whether your site is a Fortune 500 storefront or a dentist’s brochure page.

For an agency, the window has a very specific, very unglamorous shape. An advisory lands at 7pm. You manage multiple client sites, say forty of them. Some are on retainers that cover updates and some are not. Three of them broke last time a major plugin was updated, so they need testing first. Two clients have to approve any change. One site has not been logged into since it launched in 2023 and nobody remembers who owns the licence.

That is the window. It is measured in days, sometimes weeks, and it is where sites actually get taken. Every serious managed host is really selling you one thing: how short that window is, and whether closing it requires you to do anything. InstaWP’s answer is to close it at the server, on every site, before anyone has been told there is a problem.

Advisory public Scanners arrive Vendor fix released You click update A typical host unknown Exposed, and the clock is running: days to weeks patched On InstaWP unknown Protected by a server-level rule, still running the unpatched plugin about 2 hours update when it suits you
The exposure window is the red bar, and its length is set by your own maintenance schedule rather than by the vendor. A server-level rule does not shorten the time until you update. It removes the risk of taking that time.

What happened with the Elementor Pro RCE, CVE-2026-32475?

On 19 August 2026 Patchstack published an advisory for an unauthenticated file upload leading to remote code execution in Elementor Pro’s Forms module, tracked as CVE-2026-32475 and rated 9.0 by Patchstack and 9.8 by Wordfence. Every version up to and including 4.2.1 was affected. Elementor fixed it in 4.2.2 the same day. InstaWP had server-level protection live and verified across the entire hosting fleet within two hours of the advisory going public, and customers did not have to do anything.

We picked this one as the worked example because it is the hard case, not the easy one. Three things stack up:

What made it hard Why it matters
Unauthenticated RCE No login, no nonce, no account. A public contact form is the entry point, so the attack is fully automatable at internet scale.
Licence-gated plugin Elementor Pro updates are pulled with the customer’s own licence key. No host on earth can push 4.2.2 on a customer’s behalf. “Just turn on auto-updates” is not an available answer.
Enormous install base Elementor Pro runs on millions of sites, and the vulnerable range covered every version ever shipped. Plenty of those sites belong to agencies managing dozens each.
A quiet precondition Only sites with a published page carrying a form with a File Upload field were exploitable. That is an ordinary configuration, and someone can add one next month without touching the plugin.

The exploit pays off at the moment the uploaded file gets executed, so that is what InstaWP denied. A malicious upload has nowhere useful to land and nothing to run when it gets there. The rule sits underneath the plugin rather than inside it, which means it never had to know or care which version of Elementor Pro any given site was on. It held before customers updated, and it still holds afterwards.

The sentence that matters

You were protected on day one, while still running the unpatched plugin, because the fix lives on our server, not inside your site.

InstaWP published a full technical breakdown of the flaw itself, including the root cause and the response timeline, in our write-up of the Elementor Pro RCE. The rest of this post is about the standing machinery that made a two-hour response possible, because that is the part that applies to the vulnerability that has not been disclosed yet.

Stop being the person who has to be awake at 7pmManaged WordPress hosting that watches the advisories, moves first, and tells you afterwards.
See InstaWP hosting

How does a host find out a new vulnerability affects your sites?

InstaWP runs an automated sweep every day that pulls the authoritative advisory feeds, including the Patchstack vulnerability database, and cross-references every affected plugin slug against a live inventory of what is actually installed across the fleet. The output is not “here is today’s security news”. It is “here are the advisories that landed on a site we host”. On one day in August 2026 that sweep narrowed 55 critical advisories down to the 11 that actually touched us, and it took about two minutes.

55 critical advisories published that day, across the ecosystem cross-referenced against live fleet inventory 11 landed on a site InstaWP hosts and became a to-do list ~2 min every day, automatically, before anyone reads a feed The feed on its own is alarming and mostly irrelevant. The inventory is what turns it into a short, honest list.
One day’s sweep in August 2026. The 11 is a measured floor rather than a total, for the reporting reason described below.

The difference between those two outputs is the whole point. A feed of critical WordPress advisories is genuinely alarming and almost entirely irrelevant to any individual fleet, because most of the affected plugins are not installed anywhere on it. Reading the feed as a to-do list produces panic and wasted nights. Cross-referencing it against real inventory produces a short, honest list you can act on before the scanners arrive.

One honest caveat about that inventory, because it is the sort of thing a vendor usually leaves out. Only a minority of sites report their plugin list back to us, so the number the sweep returns is a measured floor, not a total. InstaWP treats it that way internally: a low count is never read as “we are fine”, it is read as “these are the ones we can see”. The server-level rule is applied fleet-wide regardless, which is precisely why the reporting gap does not become an exposure gap.

How do you avoid over-reacting to an inflated advisory?

By reading the source code before believing the score. A CVSS rating describes how bad a flaw would be if you were exposed to it, which is a different question from whether you are. Advisory feeds systematically over-claim, because writing “every version before the fix” is easier than establishing when the vulnerable feature was actually introduced. InstaWP runs three checks before calling any site affected, and each one exists because a naive version comparison got it wrong in a way that mattered.

The check What it catches
Licence-edition version lines One wp.org slug can carry several parallel version lines, one per paid edition. InstaWP has seen a single slug ship seven of them. Feeds publish only the free line’s patched version, so a plain version compare reads a genuinely vulnerable premium site as patched. This check exists because that exact miss hid live exposure on an actively exploited authentication bypass.
The real affected range “Anything below the patched version” is wrong in both directions. A supply-chain backdoor affected exactly two poisoned releases and nothing older. A separate flaw listed a backport branch as its patched version, so every site on the current major line compared as safe and was genuinely vulnerable.
A diff of the actual source Reserved for advisories that look wrong. One was published as CVSS 9.8, affecting every version ever shipped. Reading the source showed the vulnerable feature had only ever existed in a single release, and no site InstaWP hosts was on it. Real exposure was zero.

That last example is the one worth sitting with. A 9.8 rating on every version ever shipped is about as loud as an advisory gets, and the correct response to it was to do nothing except record why. The discipline is not scepticism for its own sake: poisoned releases are real, which is what happens when legitimate plugins turn into malware, and telling the two situations apart is exactly what reading the source buys you. The discipline cuts both ways: InstaWP does not panic-patch on a headline, and it does not miss a real one because the version arithmetic looked reassuring.

Where does the protection rule actually run?

In nginx, at the web server, before PHP starts. That is the single most consequential design decision in the whole system, and it is the one most security products cannot match. A request that matches a protection rule on InstaWP is refused in microseconds by the web server itself. WordPress is never loaded, PHP never boots, the database is never touched, and the plugin that carries the vulnerability never sees the request.

Compare that to a WordPress security plugin. A plugin firewall is itself a WordPress plugin, so before it can decide whether to block a malicious request, it first has to do all the work of starting WordPress: boot PHP, load the core, connect to the database, and load the plugin stack far enough to reach the firewall’s own code. The block still works. It just costs a full application boot on every single request, malicious or not.

Rule in nginx, the InstaWP placement Request nginx evaluates the rule Refused Microseconds. PHP never starts, WordPress never loads. Rule inside a WordPress security plugin Request nginx PHP boots WP core Database Plugin stack Firewall Refused Same outcome, after a full application boot. That boot is paid on every request, by every visitor, whether the request was malicious or not.
Both rows end in a refused request. The difference is everything that had to happen first, and who pays for it.
Why this shows up as speed, not just security. Protection that runs before PHP costs nothing on the request path. Protection that runs inside WordPress is paid for by every visitor, on every page load, forever. It is unusual for a security decision to also be a performance decision, and this one is.

There is a second, less obvious benefit to living below the application. A rule that sits underneath WordPress keeps working when WordPress does not. It holds on a site whose plugin stack is broken, on a site mid-update, and on a site running a version of the plugin nobody anticipated. It has no opinion about your plugin list at all. The same logic is why filtering keeps moving outward, which is the subject of our explainer on edge security in WordPress.

How does a rule reach the whole fleet without breaking anything?

In stages, with an automatic rollback if the configuration does not validate. A new InstaWP protection rule is proven on a staging environment first, then goes to a single canary server, then soaks there while the rule is probed, and only then reaches the rest of the fleet. Every step validates the web server configuration before applying it, and a configuration that fails validation is rolled back rather than loaded.

1. Staging prove the rule blocks 2. One canary a single live server 3. Soak and probe watch for collateral 4. Whole fleet every server Every stage validates the web server configuration before it applies it Validation fails: rolled back, never loaded
A bad rule shipped everywhere at once is an outage on every site at once, which is a worse day than the vulnerability itself.

That caution is not theatre. A bad rule shipped to every production server is an outage on every site at once, which is a considerably worse day than the vulnerability. Two rules that we live by, both learned expensively: never block /.well-known/acme-challenge/, or SSL renewals fail silently and the failure only surfaces ninety days later; and never write a rule that assumes WordPress lives at the document root, because multisite and subdirectory installs do not.

A failure we hit, and the structural fix. Protection rules used to live inside a configuration file that our own deployment tooling managed. That meant a rule could be live on every server and still have a silent expiry date: the next routine deploy would overwrite the file and quietly revert it. Nothing alerted, and nothing logged it as a security event. It happened twice inside six days in August 2026. The fix was structural rather than procedural. Rules now live in a separate drop-in directory that the deployment process does not touch at all, so a deploy is physically incapable of reverting one. We would rather tell you that than let you assume a system like this arrives correct.

How do you know the protection is still working?

Because InstaWP re-probes it on a schedule and treats a result it cannot attribute as a failure. This is the part that separates a protection layer from a claim about one, and it is the question almost nobody in this category answers. A rule that was deployed six months ago and has never been tested since is not a control. It is a belief.

Every InstaWP rule ships with a positive test and at least two negative controls. Taking the Elementor rule as the worked example, here is what a real verification looked like when it was re-probed on 24 August 2026, five days after it shipped:

Probe Expected Result, 24 Aug 2026
Positive: a request matching the exploit path Refused 403 on 7 of 7 server groups
Negative: a harmless image on the same path Not refused 404, as it should be
Layer self-test on every server Refused 403 on 7 of 7 server groups

The negative control is the row that makes the other two mean anything. Without it, a probe that returns “blocked” everywhere might just be a server that blocks everything, and a monitor that cannot fail is not a monitor. Because the harmless request came back unblocked from the same path on the same servers, the blocked result is attributable to the rule rather than to something else.

The third row is a permanent fixture. Every InstaWP server carries a self-test rule whose only job is to be blocked. If that self-test ever comes back unblocked on a server, the entire protection layer on that machine is treated as broken and every rule on it is considered absent until proven otherwise. It collapses a complicated question into one continuously checkable assertion.

The same instinct runs through the rest of the platform, which is why you can also watch a WordPress site’s health in real time rather than find out from a client.

We will also be straight about a limit here, because it is the kind of thing that quietly turns a monitoring dashboard into fiction. Not every rule can be verified from outside. Rules that key on the raw encoding of a request cannot be read accurately through a CDN, because the edge normalises the request before it reaches the origin, and the probe then returns the same response as a server with no rule at all. InstaWP classifies every rule by whether an external probe can see it, and a reading that cannot be attributed is recorded as inconclusive rather than as a pass.

How can you test whether your own host does any of this?

Ask for a positive and a negative result on the same path, and refuse to accept either one on its own. You do not need access to your host’s configuration to reason about this. The test that matters is whether a request matching a known exploit shape is refused before WordPress renders anything, while an ordinary request to a comparable path behaves normally.

bashthe shape of the check
# The signal is the PAIR, never a single reading.
# Compare a request that should be refused against a harmless
# one on the same path, and look at the body size too.

$ curl -s -o /dev/null -w '%{http_code} %{size_download}\n' \
    https://your-site.example/some/guarded/path
403 0        # refused by the web server, tiny body, no WordPress

$ curl -s -o /dev/null -w '%{http_code} %{size_download}\n' \
    https://your-site.example/some/ordinary/path
404 58880    # a full themed WordPress 404, so PHP clearly ran

# Both refused? Inconclusive: the server may block everything.
# Both large? The block is happening inside WordPress, if at all.

The body size is the tell that most people miss. A tiny, byte-identical response means the web server answered by itself. A large response that varies from site to site means WordPress was loaded, rendered a themed error page, and only then decided what to do. Same status code, completely different story about where your protection lives. This pair is the same discriminator InstaWP uses internally when a rule returns a status code that would otherwise be ambiguous.

Which vulnerabilities can be virtually patched, and which cannot?

A vulnerability can be virtually patched when the attack has a recognisable shape in the request itself. It cannot when identifying the attack needs information only WordPress has, such as who is logged in or what state the site is in. That distinction decides everything else, and it is the honest answer to “so why do you still tell me to update?”

InstaWP classifies every advisory this way before writing anything, because a rule written for a class that resists server-level matching is worse than no rule: it produces a dashboard that says protected while the site is not. OWASP’s virtual patching guidance makes the same split, and it predates WordPress-specific tooling by a decade.

Vulnerability class Server rule? Why
Unauthenticated file upload leading to RCE Yes, reliably The upload, its destination and the later request that executes it are all visible at the web server. This is the Elementor Pro case.
Path traversal or arbitrary file read Yes The traversal sequence is in the URI. Encoding tricks are the only complication, and they are a known list.
A flaw reachable only through one specific endpoint Yes A named REST route or admin-ajax action can be refused outright. Blunt, but the blast radius is one endpoint rather than the site.
SQL injection Usually Payloads show up in query strings and request bodies, so a targeted rule works. Broad signatures get brittle fast, which is why securing the WordPress database itself still matters.
Stored cross-site scripting Partly The request that injects the payload can be blocked. Anything already sitting in the database cannot, because it never crosses the web server again.
Server-side request forgery Partly The triggering request is visible. The outbound request WordPress then makes is not, so the rule has to catch it on the way in or not at all.
Privilege escalation that depends on the logged-in user Rarely The web server cannot see WordPress roles or capabilities without booting WordPress, which is the one thing the placement is designed to avoid.
Logic flaws in a plugin’s own workflow No There is nothing distinctive to match. The malicious request is byte-for-byte a legitimate one, and only the application knows the difference.

Read the bottom two rows as the reason this post keeps saying “and you should still update”. For those classes the vendor’s fix is the only real control, and the useful thing a host can do is tell you clearly and early rather than imply coverage it does not have. It is also the question worth putting to any host that claims it blocked something on your behalf: which class was it, and was the rule verified afterwards?

What about the plugins InstaWP can actually update for you?

Those get the real fix, not just the rule. When a vulnerable plugin is freely updatable from the WordPress.org repository, and therefore reachable by WordPress’s own update mechanism, InstaWP rolls the actual update across affected sites in batches, taking a snapshot of every site first and running an HTTP health check on each one afterwards. The server-level rule still goes out, because the update and the rule protect against different failure modes, but the durable resolution is the vendor’s code.

Splitting a vulnerability response into “fixable by us” and “needs the site owner” is the single most decision-useful line in any security report, and getting it wrong sends everyone down a dead end. Here is how InstaWP divides it.

Plugin type What InstaWP does What you do
Free, on WordPress.org Ships the protection rule, then rolls the real update in batches with a snapshot and a health check per site. Nothing.
Licensed or premium Ships the protection rule as the primary control, and tells you exactly which plugin and which version to update to. Apply the vendor update when it suits you. No 2am window.
Free, but a major version jump Ships the rule, then treats the update as risky rather than routine. Snapshot, verify the front page, and be willing to roll back and convert it to a notice instead. Nothing, unless InstaWP tells you the update needs your judgement.

One detail in that table is a genuine trap that catches automated tooling regularly. Some premium plugins share a slug with a free edition in the WordPress.org repository. A naive “is it in the repo? then update it” check will happily replace a customer’s licensed build with the free version, destroying their paid features and configuration in the name of security.

InstaWP checks which edition line a site is actually on before it touches anything. The same care applies when you are choosing what to install in the first place, which is the subject of our notes on WordPress plugin security best practices.

What else is running underneath all of this?

Protection rules are the response to a specific disclosed vulnerability. Underneath them, InstaWP runs several always-on layers that do not need a CVE to exist, and most attack traffic never reaches the rule layer at all because one of these caught it first.

  • Behavioural bot and brute-force blocking. Detection based on what a client is doing across many requests, not on a signature, which is what catches credential stuffing and scanner sweeps. This is part of InstaWP Shield.
  • A fleet-wide shared blocklist. An address caught attacking one site on the platform is blocked across the platform, so the fleet learns as a unit rather than site by site.
  • Edge WAF on CDN-fronted sites. Filtering that happens before traffic reaches the origin server at all, via InstaWP’s CDN layer. If you are weighing up where filtering belongs in general, our guide to WordPress firewalls for agencies covers the trade-offs.
  • Exposed credential and backup-file blocking. Server-level refusal of requests for environment files, configuration backups and leftover migration archives. These are boring and they matter: a forgotten database export sitting in a public directory hands over credentials with no exploit required.

Together these refuse thousands of exploit attempts at the server every week. We are deliberately not publishing a single headline number for that, and it is worth explaining why, because the reasoning is the point. Block volume is dominated by a small number of rules, and a single aggressive scanner pointed at one site can inflate a fleet-wide total by an order of magnitude in a week.

A number like that is easy to publish and impossible to defend, so InstaWP reports block metrics per rule internally and does not put a headline figure in marketing copy.

How does this compare to a security plugin or a DIY VPS?

The three approaches differ most in where the protection runs and in how much of the work lands on you. A security plugin gives you real coverage but charges every visitor a PHP boot for it. A self-managed VPS gives you total control and, by default, nothing at all. Managed hosting with server-level rules puts the protection below the application and takes the operational work off your plate.

  WordPress security plugin Self-managed VPS or cPanel InstaWP managed hosting
Where it runs Inside WordPress, after PHP boots Nothing by default nginx, before PHP
Covers licensed plugins you cannot auto-update Partially, usually on paid tiers No Yes
Costs you performance Yes, every request boots PHP Depends what you build No, the request dies before PHP
Requires you to do anything Install, configure, maintain, per site Everything Nothing
Verified still working Take the vendor’s word for it Only if you built the monitoring Probed on a schedule, per rule, per server

None of this means you should uninstall your security plugin. A good one does things a server rule does not: file integrity monitoring, login hardening, two-factor, malware scanning inside the WordPress installation. The argument here is narrower and it is about placement. The exploit-blocking job specifically belongs below the application, because that is where it is both cheaper and harder to bypass. If you want the detail of what sits at that layer on InstaWP, we have broken down Security Shield basic against premium feature by feature.

What does virtual patching not do?

It does not make a site immune, and it cannot block a vulnerability nobody has discovered yet. This is the honest boundary of the claim, and any host that blurs it is selling you something. A protection rule is written against a known exploit path. Until a flaw is found and described, there is no path to write a rule against.

So what does readiness actually mean, if not prediction? It means the detection pipeline, the patching lane, the staged rollout, the verification probes and the rollback machinery all exist before the next CVE does. When an unknown vulnerability becomes a known one, none of that has to be built, staffed, argued about or scheduled. It runs. That is why protection lands the same day instead of next quarter, and it is a more useful property than clairvoyance would be.

Three other honest limits worth stating plainly. A rule blocks new attempts, so InstaWP also sweeps affected sites for evidence a flaw was exploited before anyone knew about it, and the signs a WordPress site has been hacked are worth recognising yourself. A rule is not a substitute for the vendor’s fix, which is why InstaWP still tells you to update.

And a rule protects against the exploit path it was written for, not against a site that was already compromised last year, which is what automatic backups and malware scanning are for.

What should you do in the first 24 hours after an advisory drops?

Confirm you are actually affected, close the entry point, then update, in that order. Most people do it in the opposite order and lose the first few hours to panic-updating plugins that were never involved. This list works whoever you host with, and steps 3 and 4 are the ones that matter most if you are not on a managed platform.

  1. Check the version you actually run, not the one you remember. In the dashboard it is Plugins, then read the version column. From the command line it is one line, and our note on checking whether WordPress plugins are up to date using WP-CLI covers doing it across several sites at once. Half the advisories that frighten people turn out not to apply.
  2. Check whether the vulnerable feature is in use. Advisories usually name a precondition, and it is often specific. In the Elementor Pro case only sites with a published page carrying a form with a file upload field could be exploited. A precondition narrows your list, but treat it as today’s answer rather than a permanent one, because someone can add that field next month.
  3. Ask your host one question, and listen for a specific answer. Is protection live at the web server for this CVE, and can you name it? “We have a firewall” is not an answer to that question. If you want to check for yourself instead of asking, the pair of curl requests above tells you where the block happens without needing access to anything.
  4. Update, in the right order for the plugin type. If it is free on WordPress.org and the jump is a patch release, update now. If it is licensed, find the licence key first: hunting for it during an incident is how sites stay vulnerable for three weeks. If it is a major version jump, treat it as a deployment rather than an update and test it on a staging site before it touches production.
  5. Take the backup before you update, not after. A backup taken after a bad update preserves the bad update. If you are unsure what you actually have, our breakdown of full, incremental and differential backups explains what each one will and will not get you back.
  6. Then look backwards. A rule and an update both stop what happens next, and neither undoes what already happened. Scan for new admin users, unexpected files in the uploads directory and scheduled tasks you did not create. The signs a WordPress site has been hacked are worth knowing before you need them, and AI-assisted security workflows make the sweep across a portfolio considerably less tedious.

If you run a store, add one step at the front: check whether the vulnerable plugin touches checkout, because the testing burden and the cost of getting it wrong are both higher there. Our guide to building a secure WooCommerce store covers what changes when money is involved.

The version of this list for people who do not want a version of this list. On InstaWP, steps 3 and 5 happen without you, step 1 is answered by the daily sweep, and step 4 is the only one left on your side, for licensed plugins only. That is the whole product argument in one sentence, and it is why the rest of this post is about machinery rather than advice.
The recap

The next critical WordPress vulnerability is unknown today and will be public knowledge on some ordinary Tuesday evening. What decides the outcome is not whether your sites are secure right now, but whether the platform underneath them can detect, size, block, roll out and verify a response while you are asleep. On InstaWP that machinery already exists and is already running, which is why the Elementor Pro RCE was closed fleet-wide in under two hours and customers did not have to do a thing.

Move your client sites somewhere that moves firstManaged WordPress hosting with server-level protection, verified continuously, on every site by default.
Explore InstaWP hosting
Questions

Frequently asked

Does virtual patching protect against zero-day vulnerabilities?
Not against a flaw nobody has discovered yet, and any host claiming otherwise is overselling. A protection rule is written against a known exploit path, so it needs the flaw to be described first. What it does protect against is the far more common scenario: a vulnerability that has just been disclosed publicly, where attackers are already scanning for it and your site has not been updated yet. InstaWP’s value here is that the whole response pipeline is built and running before the disclosure, so protection ships the same day.
Do I still need to update the plugin if my host has blocked the exploit?
Yes, and you can do it calmly instead of urgently. A server-level rule neutralises the attack; the vendor’s release removes the bug. They are different things and you want both. The practical difference is that a protected site can be updated during your normal maintenance window, with testing, rather than at 11pm on the night an advisory drops.
Can any host push an update to a licensed plugin like Elementor Pro?
No. Premium plugin updates are pulled using the customer’s own licence key, so the host has no mechanism to fetch or install them on your behalf. InstaWP cannot do it either, and neither can anyone else. That is exactly why a server-level protection rule matters more for licensed plugins than for free ones: it is the only control that works in the gap, and for a plugin that is only licensed on some sites that gap can run for weeks.
Does a server-level protection rule slow my site down?
No, and it is cheaper than the alternative. The rule is evaluated by nginx before PHP starts, so a blocked request is refused in microseconds without WordPress ever loading. A WordPress security plugin has to boot PHP, load the core and connect to the database before its firewall code can even run, which means that protection is paid for on every request by every visitor. Moving the exploit-blocking job below the application removes that cost entirely.
Will a protection rule break legitimate functionality on my site?
It should not, and InstaWP tests specifically for that before a rule reaches production. Every rule is proven on staging, then on a single canary server, then soaked before it reaches the fleet, with automatic rollback if the configuration fails validation. With the Elementor Pro rule, InstaWP verified afterwards that genuine form attachments still went through, because blocking an exploit is not worth breaking a client’s careers page.
How do I find out whether my current host does any of this?
Ask three questions and listen for specifics. First, when the last critical plugin CVE was disclosed, how long was it before protection was live, and can they name the CVE? Second, does the protection run at the web server or inside WordPress? Third, how do they verify a rule is still working months after it shipped, and what happens if it is not? A host that answers the third question with anything other than a testing method has a belief rather than a control.
Is virtual patching the same as a web application firewall?
Related, but narrower and more precise. A WAF applies broad rulesets against general attack classes such as SQL injection or cross-site scripting. A virtual patch is a targeted rule written against one specific disclosed vulnerability and its exact exploit path, which makes it far less likely to produce false positives. InstaWP runs both: an edge WAF on CDN-fronted sites, plus per-vulnerability rules at the origin server.
I only have one WordPress site. Does any of this matter to me?
More than it does for an agency, in one specific way. The scanning that follows a disclosure is automated and indiscriminate, so it finds a single brochure site exactly as fast as it finds a portfolio of forty. What you do not have is somebody whose job is to notice at 7pm on a Tuesday. That is the gap a host closes for you, and it is the reason the useful question is about your host rather than about your site.
Can I set up virtual patching myself on my own server?
Technically yes, and the hard part is not the rule. Writing an nginx rule for a disclosed exploit path is an afternoon’s work for someone comfortable with the config. What takes real effort is everything around it: reading advisories daily, checking the affected range against your own source rather than the feed, testing that the rule does not break legitimate requests, rolling it out without taking the site down, and re-probing it months later to confirm it is still loaded. Writing the rule is the small part of the job. Keeping it correct, loaded and proven is the rest of it.
How long does a protection rule stay in place?
Indefinitely, and that is deliberate. A rule is not removed once customers have updated, because there is no reliable moment at which every site on the fleet has. It costs nothing to keep, it goes on protecting the sites that lag, and it keeps protecting a site that later restores an old backup or reinstalls an old version. The one thing InstaWP had to fix was rules quietly disappearing on their own, which is the deployment story described earlier in this post.

References

VS
Vikas Singhal
Founder, InstaWP

Vikas builds tools that take the friction out of WordPress development. He writes about WP-CLI, dev workflows, and running WordPress at agency scale.