Four years after Log4Shell (CVE-2021-44228) set the internet on fire, security researchers are still finding vulnerable instances of Log4j running in production. Not exotic edge cases — internet-facing servers, unpatched since December 2021. A fix was available within days of disclosure. The machines in question just never got it.
That's the patch gap: the window between "a fix exists" and "our fleet actually has it." Microsoft ships fixes on Patch Tuesday. Attackers reverse-engineer and weaponize them in days — sometimes hours — and mass scanning starts immediately. Patch Tuesday is the starting gun, not the finish line.
If you run IT internally or you're an MSP tech supporting a dozen client environments, you already know your patch compliance number is partly a guess. The WSUS console says 94%, but you also know about the three machines where last month's cumulative failed with 0x800f0922, the eleven endpoints sitting on "pending reboot" for weeks, and the sales laptop that hasn't checked in since October. When the next Log4Shell-grade bug drops and your CIO asks "are we exposed?", the honest answer at most shops is: "give me two or three days to find out."
The exploit doesn't give you two or three days.
The Problem in Depth: Your Patch Data Is Lying to You
WSUS was never built for this
Windows Server Update Services is a 2005-era architecture still doing the patching for a huge share of small and mid-size environments. Three problems are baked into its design:
- It only sees Microsoft. Chrome, Adobe Reader, 7-Zip, Java, Zoom, Notepad++, WinRAR — some of the most-exploited software on your fleet is invisible to WSUS. Third-party updates require a completely separate process (or prayers and Ninite).
- Its reports are stale snapshots, not live state. Every sysadmin has opened the WSUS compliance report only to see "last status report: 47 days ago."
- "Installed" doesn't mean "active." WSUS will happily mark a patch installed on a server that hasn't rebooted. The fix isn't in memory. That's not compliance — that's paperwork.
The tools that could help don't talk to each other
The typical mid-size stack looks like this: WSUS or SCCM/MECM for Windows updates, a separate RMM (NinjaOne, ConnectWise Automate) for scripting, standalone monitoring (PRTG, Zabbix, Nagios) for uptime, and a helpdesk (ConnectWise Manage, Freshservice, Jira Service Management) for tickets. Patch data lives in one system, device health in another, and user reports in a third.
The consequences are painfully familiar:
- The 2:14am mystery outage. A scheduled patch job reboots a file server inside its maintenance window. Your standalone monitoring tool sees "host down" and fires a critical alert. The on-call tech has zero context, treats it as an outage, pages the senior admin. Two hours of night-shift adrenaline for behavior that was planned. Worse: when a patch reboots a machine outside its window because a policy misfired — the thing you actually needed to catch — it looks identical in the monitoring tool. Same alert. No signal difference.
- The "my computer restarted itself" ticket flood. A user loses 20 minutes of work to a forced reboot. The helpdesk tech sees an unexplained reboot, logs it as "could not reproduce," moves on. Nobody connects it to the patch deployment, because the helpdesk can't see patch data. The broken maintenance-window policy keeps breaking for weeks.
- The exploit-day fire drill. A critical RCE drops. "Are we affected?" requires exporting from WSUS, cross-referencing the RMM inventory, reconciling with the CMDB, and manually chasing machines that appear in none of them. That's a one-to-three-day exercise at most organizations — for a question attackers are already automating.
The silent failures are the dangerous ones
Patches don't just fail to deploy — they fail quietly. A corrupted WU agent, error 0x800f0922, a download stalled at 87%, a reboot that hangs. In a well-instrumented environment, a failed patch becomes a ticket within minutes. In a typical environment, it's discovered at the quarterly audit. Or the incident post-mortem.
The business impact is measurable:
- Real compliance vs. reported compliance. It's common for WSUS to show 90%+ compliance while dozens of endpoints carry installed-but-inactive updates or failed patches nobody reviewed.
- Downtime you caused yourself. Unexpected in-hours reboots from misconfigured patch policies generate outage tickets, angry users, and executive questions — for work that's supposed to be invisible.
- Burnout by attrition. Nothing erodes an on-call rotation faster than pages for known, self-inflicted, scheduled activity. Techs learn to ignore 2am alerts — which is exactly when the real alert arrives.
- SLA and audit exposure. MSPs can't answer "what percentage of Client A's fleet is patch-compliant?" without a manual export-and-spreadathon before every QBR. Cyber insurance renewals now demand documented patch cadence — and a WSUS screenshot doesn't cut it.
How AlertMonitor Closes the Gap
AlertMonitor was built on a simple premise: patching, monitoring, RMM, and helpdesk are not four products — they're one workflow. When they live in one platform, the patch gap shrinks from weeks to hours.
One live source of truth for patch state
Every managed Windows device reports patch status in real time: which updates are missing, which failed (with the error code), and which are stuck on pending reboot. No nightly sync, no stale compliance snapshots. "Are we exposed to KB-whatever?" becomes a filter, not a two-day project. And because monitoring is part of the same platform, patch state is continuously reconciled against device health — a machine that stops checking in gets flagged before it becomes an invisible hole in your compliance.
Staged deployments that don't page anyone
Deployments are scheduled and staged by ring — pilot group, then department, then site — with automatic progression and rollback if something breaks. Maintenance windows are enforced by the same platform that does the alerting, and that changes everything:
- A reboot inside an approved patch window generates no page. The event carries full context: triggered by patch job #4471, ring: standard, expected behavior.
- A reboot outside the window fires an immediate alert — with the patch job attached, so the tech sees "policy misfire" in seconds instead of investigating a mystery at 2am.
The same integration kills the "my PC restarted itself" ticket problem: when a user submits it, the ticket auto-attaches the device's patch history. The tech resolves it in one glance — or AlertMonitor links it to the deployment automatically.
The exploit-day workflow, on rails
When the next Log4Shell happens, the AlertMonitor workflow is:
- Search every managed device for the affected software or missing KB — across all clients, one query, seconds.
- Push an emergency deployment outside normal cadence to a dynamic group of affected machines.
- Watch the compliance percentage climb in real time on the dashboard.
- Export the timestamped compliance report for the CIO, the auditor, or the cyber insurance questionnaire.
For MSPs, that's per-client: "show me every endpoint across all 40 clients missing this update" is one saved view — not 40 exports.
| Scenario | Fragmented stack | AlertMonitor |
|---|---|---|
| "Are we vulnerable to X?" | 1–3 days of exports and reconciliation | Minutes — one filtered query |
| Failed patch discovered | Next audit (weeks later) | Real-time, auto-ticketed |
| Patch reboot at 2am | Critical "host down" page, no context | Silent — logged with patch context |
| Reboot outside the window | Same alert as a planned reboot | Immediate alert with root cause attached |
| QBR / audit reporting | Half a day of spreadsheet work | One-click per-client compliance report |
Practical Steps: Shrink Your Patch Gap This Week
Before you change anything, get an honest picture of where you stand. These are the checks to run today.
1. Find the machines with installed-but-inactive updates
Pending reboots are the most underestimated hole in patch compliance. A patch that's installed but not active protects no one.
# Check whether a machine has updates installed but waiting on a reboot
$wuReboot = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired'
$cbsReboot = Test-Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'
if ($wuReboot -or $cbsReboot) {
Write-Warning 'Pending reboot detected - installed updates are NOT yet active'
} else {
Write-Output 'No pending reboot - patch state is live'
}
2. Verify a specific critical KB across your servers
The moment a targeted patch — or an exploit — makes the news, you need a per-machine answer, not a percentage.
$kb = 'KB5044284' # replace with the KB you need to verify
$servers = Get-Content 'C:\Temp\servers.txt'
$results = foreach ($server in $servers) {
$hotfix = Invoke-Command -ComputerName $server -ScriptBlock {
Get-HotFix -Id $using:kb -ErrorAction SilentlyContinue
}
[PSCustomObject]@{
Server = $server
KBInstalled = [bool]$hotfix
InstalledOn = if ($hotfix) { $hotfix.InstalledOn } else { $null }
}
}
$results | Sort-Object KBInstalled | Format-Table -AutoSize
3. Flag machines whose last patch is too old
Anything unpatched for 45+ days is your patch gap, by definition. This is the list an attacker would work from.
$cutoff = (Get-Date).AddDays(-45)
$stale = foreach ($server in (Get-Content 'C:\Temp\servers.txt')) {
$last = Invoke-Command -ComputerName $server -ScriptBlock {
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 1
}
if (-not $last -or $last.InstalledOn -lt $cutoff) {
[PSCustomObject]@{
Server = $server
LastKB = $last.HotFixID
InstalledOn = $last.InstalledOn
}
}
}
$stale | Export-Csv 'C:\Temp\stale-patch-report.csv' -NoTypeInformation
4. Check the update agent itself
A surprising number of "failed patches" are actually dead update services.
Get-Service -Name wuauserv, bits | Select-Object Name, Status, StartType
# If the Windows Update service is stuck, restart it
Restart-Service -Name wuauserv -Force
And if you have Linux servers in the mix:
# Debian/Ubuntu: list pending security updates
sudo apt update && apt list --upgradable 2>/dev/null | grep -i security
# RHEL/CentOS/Alma: check for pending security updates
sudo dnf check-update --security
5. Turn these one-off scripts into continuous visibility
Scripts like the above go stale the moment you run them — they're a snapshot of a moving target. In AlertMonitor:
- Ring your devices: pilot (IT admin machines), standard (most of the fleet), restricted (domain controllers, hypervisors, production SQL).
- Define deployment policies: pilot within 24 hours of release, standard within 72, restricted with explicit approval and a fixed window.
- Enable patch-context alerting so reboots inside windows stay silent and anomalies page immediately.
- Set up the saved view "Failed patches older than 7 days" and let it auto-create helpdesk tickets — failed patches should never age silently.
- Run a quarterly exploit-day drill: time how long it takes to answer "which machines are missing KB-X?" If the answer is more than an hour, you have a gap.
The Bottom Line
Patch Tuesday is a calendar event. Exploitation is a 24/7 operation. Everything between those two — the failed updates, the pending reboots, the offline laptops, the third-party apps nobody owns — is the patch gap, measured in days of exposure you can't get back.
Closing it doesn't take more headcount or another console. It takes one system where patch state is live, monitored, and connected to the alerts and tickets your team already lives in. Four years after Log4Shell, the industry has run out of excuses — the vulnerable instances still out there weren't failed by knowledge. They were failed by visibility.
Related Resources
AlertMonitor Patch Management & Software Updates AlertMonitor Platform Overview Book a Demo Patch Management & Software Updates Resources
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.