Why a WAF Rule Is a Stopgap, Not a Substitute for Patching
A WAF rule blocking a vulnerable endpoint buys time, not safety. How to treat virtual patching as a stopgap with an expiry date and build re-triage into your vulnerability program.
When a critical vulnerabilityVulnerability🛡️A weakness in software, hardware, or processes that can be exploited by attackers to gain unauthorized access or cause harm. lands and you cannot patch immediately, a firewallFirewall🌐Security system that monitors and controls network traffic based on predetermined rules. rule that blocks the vulnerable path feels like a save. Often it is, for a while. The danger is in what you do next, which is frequently nothing, because the dashboard went green and the ticket got closed. The ShinyHunters campaign against Oracle PeopleSoft is the cautionary tale: organizations that met the June advisory with a rule blocking `/PSEMHUB/` were breached in September when attackers encoded one character to get around it. This piece is about treating a WAF rule as what it actually is, a stopgap with an expiry date, and building your vulnerability program so the stopgap never becomes the plan.
What a Virtual Patch Actually Buys You
Blocking a vulnerable endpoint at the firewall is a form of virtual patchingVirtual Patching🛡️The use of a compensating control, such as a firewall rule that blocks a vulnerable endpoint, to reduce exposure to a vulnerability without changing the vulnerable code. It buys time before the real patch is applied but leaves the flaw in place, so it must be treated as a temporary measure with a defined expiry., a compensating controlCompensating Control🛡️A security measure applied in place of a primary control that cannot be implemented yet, such as network restriction while a patch is unavailable. It reduces risk to an acceptable level without fixing the underlying flaw. that reduces exposure without changing the vulnerable code. Its value is real and specific: it buys time. It lets you survive the window between a vendor advisory and the change window in which you can safely deploy the real fix. For an internet-facing system under active exploitation, that time can be the difference between a controlled patch and an incident.
What a virtual patch does not do is remove the vulnerability. The flawed code is still there, still reachable by any request that finds a path your rule did not anticipate. A compensating control narrows the attack surfaceAttack Surface🛡️The sum of all points where an unauthorized user could attempt to enter or extract data from a system: exposed services, interfaces, accounts, and integrations. Reducing attack surface means removing reachability, not just patching.; it does not eliminate it. Confusing the two is how a stopgap silently becomes a permanent architecture.
Why the Control Decays
Compensating controls degrade against a motivated adversary for a simple structural reason: a firewall rule that matches a pattern is a blocklist, and a blocklist is only as good as the imagination of the person who wrote it. The attacker needs to find one representation of the attack you did not block. In the PeopleSoft case that representation was `/%50SEMHUB/`, the target path with the letter P percent-encoded, which slid past a rule matching the literal string. The full mechanics of that evasion are covered in why URL encoding lets attackers slip past string-matching WAF rules, but the strategic point stands on its own: any control built around enumerating bad inputs will eventually meet an input it did not enumerate.
Decay is not always adversarial, either. Rules rot as applications change, as new endpoints appear, and as the people who understood the original rule move on. A virtual patch left in place for months becomes a piece of undocumented infrastructure that everyone is afraid to touch and no one remembers the purpose of.
Build Re-Triage Into the Program
The fix is process, not a better rule. A vulnerability that you mitigate rather than remediate must not leave your active queue. Keep the ticket open, tagged as mitigated-not-patched, with a defined date by which the real fix must land. The compensating control's expiry is not when it stops working; it is when you have verified the patch is deployed.
That discipline requires a few concrete habits:
- **Record the mitigation as temporary.** Every virtual patch gets an owner, a linked vulnerability, and a review date. A green dashboard is not closure.
- **Separate "exposure reduced" from "vulnerability removed."** Report them as two different states so leadership can see how much of your risk is being held up by stopgaps.
- **Re-triage when inputs change.** New exploitation activity, a proof of concept, or a KEV listing should automatically reopen and re-prioritize a mitigated item. This is the same reasoning behind why auto-updates are not a substitute for a patch response plan: automation and stopgaps both create a false sense of finality.
- **Verify the control, don't assume it.** Test that the rule blocks encoded, mixed-case, and double-encoded variants, not just the literal path. If you cannot prove it holds against obfuscation, you have not measured your actual exposure.
Prefer Removing Exposure to Blocking It
Where the choice exists, eliminating the attack surface beats filtering it. In the PeopleSoft incidents, Mandiant's guidance included disabling the Environment Management Hub service or removing the vulnerable application entirely for organizations that were not using it. A component that is not running cannot be exploited by any encoding. Blocking by allowlist, permitting only the routes and clients that are supposed to reach a system and denying everything else, is likewise far more durable than trying to pattern-match the attacks against it.
When you do detect an evasion attempt against a mitigated endpoint, treat it as a priority signal that your window has closed, and know how to find the follow-on activity in your logs, which we cover in how to hunt your web server logs for path-normalization evasion.
The Real Lesson
The organizations breached in September were not undone by a sophisticated exploitExploit🛡️Code or technique that takes advantage of a vulnerability to cause unintended behavior, such as gaining unauthorized access.. They were undone by a completed ticket. They had the vendor patch available for three months and relied on a control that a single encoded byte defeated. A WAF rule is a fire door: it holds back the fire long enough to get out, but you do not move your desk next to it and call the building safe. Deploy the stopgap, start the clock, and measure your program by how fast the real patch follows, not by how quickly the alerts went quiet.