← All posts

Patch Latency Is a Vulnerability: Auditing Windows Update Hygiene Across Your Endpoints

The window between a patch shipping and it landing on every machine is where breaches live. Here is how to measure Windows patch latency, catch machines stuck behind, and keep update hygiene from silently rotting.

Every credible breach retrospective eventually names the same accomplice: a machine running software with a patch that shipped weeks or months earlier and never landed. WannaCry didn't need a zero-day — it needed hosts that were still missing MS17-010 two months after Microsoft released it. The uncomfortable truth of endpoint security is that most of what actually gets exploited was already fixed by the vendor. The vulnerability wasn't the missing patch; it was the latency — the gap between "a fix exists" and "the fix is on every machine you own."

Antivirus won't tell you about that gap. Neither will a green checkmark in Windows Update that only reflects one machine on one day. Patch latency is a fleet-level, time-series property, and if you're not measuring it, you're flying blind on the single most exploited weakness in the Windows ecosystem.

Why "we have automatic updates on" is not an answer

Automatic updates are necessary and nowhere near sufficient. In practice, updates stall for boring, invisible reasons that compound across a fleet:

Patch compliance is not a state you reach; it is a rate you sustain. The question is never "are we patched?" but "how long does a fix take to reach the last machine, and which machines are stuck?"

Measure the gap on a single machine first

Before you can manage patch latency across a fleet, you need to see it on one host. Windows exposes enough to build a real picture from PowerShell. Start with what's actually installed and when:

Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10

The date of the most recent security update is your first signal. If the newest hotfix is 90 days old, you don't have a hardened machine — you have a time capsule. Next, check whether the box is quietly waiting on a restart, which is the most commonly missed exposure:

$paths = @(
  'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired',
  'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending'
)
$paths | ForEach-Object { [pscustomobject]@{ Path = $_; Pending = Test-Path $_ } }

Then ask Windows Update directly what it still owes you. The COM interface is more honest than the Settings UI because it reports what is applicable but not installed:

$searcher = (New-Object -ComObject Microsoft.Update.Session).CreateUpdateSearcher()
$pending  = $searcher.Search("IsInstalled=0 and Type='Software'").Updates
$pending | ForEach-Object { $_.Title }

Cross-reference the titles against the current Patch Tuesday and you now have three numbers that matter: how old your newest patch is, whether a reboot is holding back protection, and how many applicable updates are outstanding. That is patch latency, made concrete.

The metrics that actually track risk

Raw counts of missing KBs are noise. What a security team should watch over time is a small set of signals:

Tracked as a trend rather than a snapshot, these turn "we patch regularly" into something you can prove and defend.

Auditing it once is easy — keeping it true is the job

Anyone can run the commands above on the machine in front of them on a Tuesday. The failure mode is drift: the reboot nobody performs, the update stack that breaks in silence three weeks later, the deferral that quietly stretches out. A patch posture that isn't continuously re-checked rots without ever throwing an error.

On a single machine you don't need a subscription to stay honest. WinSentinel is free and runs at full power on one box — all modules, no limits — so a single command rolls patch age, pending reboots, outstanding updates, and servicing status into your overall posture score alongside every other check:

winsentinel audit
winsentinel score

Re-run it after patch day and the score moves if you regressed. The update-hygiene checks flag a stale hotfix date, a machine stuck reboot-pending, and an out-of-servicing build the same way a reviewer would — but every run, not once a quarter when someone remembers.

When the gap spans dozens of machines

Patch latency is fundamentally a fleet problem, and manual re-auditing is where good intentions die: the one laptop three months behind is invisible in a spreadsheet, and it is exactly the machine an attacker finds first. That continuous, centralized assurance is what WinSentinel Pro exists for. Lightweight agents report each machine's patch posture to a central node, so a host that falls behind on updates or sits reboot-pending surfaces as a drift alert instead of an incident ticket. Pro rolls the same per-machine findings into fleet-wide patch-compliance evidence — the depth of each machine's audit is identical to the free single-machine scan; Pro adds the history, rollups, and alerting you need to trust that every endpoint, not just the one on your desk, actually closed the gap.

The takeaway

The patches that stop breaches almost always exist before the breach happens. What fails is the last mile — the latency between release and universal deployment, and the silent regressions that reopen the gap after you thought it was closed. Measure the age of your newest fix, hunt down reboot-pending hosts, and count what's still outstanding. Then make that measurement continuous: free on the machine in front of you, fleet-wide with Pro when one machine becomes fifty. A fix you haven't finished deploying is not protection — it's a vulnerability with a countdown.