Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.
To reduce a vulnerability backlog, close findings faster than new ones arrive. Prioritizing on its own won't do that. Measure inflow and outflow, then work both sides: stop new findings at the pull request, filter noise before anyone triages, rank what's left by real exploitability, retire what doesn't need fixing, and fix the rest in campaigns your developers can absorb.
This guide explains why backlogs grow, then walks through nine steps to shrink one and keep it small.
A vulnerability backlog is every open security finding your team has detected but not yet fixed, retired, or formally accepted. It usually spans code (SAST), open-source dependencies (SCA), containers, leaked secrets, cloud misconfigurations, and pentest results, often spread across several tools that each keep their own list.
The backlog is one part of vulnerability management. It's the part where findings go to wait.
A backlog is a flow. Its size changes by one simple rule:
Backlog change = new findings in − findings closed out
Say your scanners add 400 findings a month and the team closes 300. The backlog grows by 100 a month however carefully you prioritize. Re-sorting the queue changes which findings get fixed, but not how many.
Inflow tends to rise on its own:
Outflow is usually capped by people. Every finding needs someone to confirm it's real, find the owner, write a fix, and get it reviewed. When that work is done one ticket at a time, the backlog grows.
Not every open finding is dangerous, but the backlog hides the ones that are. A critical that's actually exploitable looks the same as fifty that aren't, so it waits in the same queue.
A large backlog also wears down trust. Developers learn that security tickets are mostly noise, security teams spend their week re-sorting lists, and leadership gets the same answer every quarter about why the number hasn't moved.
Regulators now expect risk-based remediation. In June 2026, CISA issued Binding Operational Directive 26-04, which replaced fixed federal patch deadlines with timelines based on four factors: asset exposure, Known Exploited Vulnerabilities (KEV) status, whether exploitation can be automated, and technical impact. The directive covers federal agencies, but the model works for any backlog.
Steps 1–3 cut the inflow and the noise. Steps 4–5 decide what actually needs fixing. Steps 6–9 raise the outflow.
Before changing anything, get four numbers for the last 90 days:
If inflow is higher than outflow, no prioritization scheme will shrink the backlog. The age buckets tell you where to start: findings over a year old are often in code that has changed or been deleted, and they close quickly once someone checks.
The cheapest finding to fix is one that never merges. Scan every pull request, not only the default branch on a schedule, so the author fixes the issue while the code is still fresh in their mind. Then add guardrails so the same class of issue doesn't come back:
Every finding stopped here is one that never enters the backlog.
Much of a typical backlog isn't real risk. In one study across five Nullify production tenants, 57% of 14,847 SAST findings triaged over 90 days were ultimately classified as false positives. Every one of those cost someone time before the real findings could be found.
Filter automatically, and record why each finding was dismissed:
Keeping the reason means a reviewer can audit the decision instead of redoing it.
CVSS describes how bad a vulnerability class could be in theory. It doesn't know whether the vulnerable function is reachable in your deployment. Layer signals that do:
| Signal | What it tells you | Source |
|---|---|---|
| Known exploitation | Attackers are already using it | CISA KEV catalog |
| Exploit likelihood | Probability of exploitation in the next 30 days, updated daily | FIRST EPSS |
| Exposure | Whether the asset is reachable from the internet | Your asset inventory and cloud config |
| Reachability | Whether untrusted input can reach the vulnerable code | Code analysis |
| Business impact | What an attacker gets: customer data, payments, production control | Your service catalog |
| Severity | Theoretical impact of the vulnerability class | CVSS |
A KEV-listed, internet-facing, reachable finding goes to the top. A CVSS 9.8 in an internal service that no untrusted input reaches can wait. Use EPSS to sort the backlog, not to delete from it: a low score is a forecast, not proof of safety.
Some findings shouldn't be fixed: the system is being decommissioned, a compensating control blocks the path, or the risk is too small to justify the change. Leaving them open inflates the backlog and buries real work.
Close them explicitly instead:
The thing to avoid is the silent bulk close. Suppressing old findings to hit a number lowers the count without lowering the risk.
One dependency upgrade can close dozens of findings across many repositories. One helper function rewrite can fix a whole class of injection bugs. If those findings sit as separate tickets, they get worked separately, or not at all.
Group the remaining backlog into campaigns, each with one objective, one owner, and a progress count:
Campaigns turn a 2,000-row list into a dozen goals a team can actually finish, and they stop the long tail of forgotten repositories.
The fastest person to fix a vulnerability is the one who owns the code. Route using the commit author first, then CODEOWNERS, then the wider team.
Then pace it. Dropping 200 tickets on a team in one sprint doesn't clear 200 findings. It teaches developers to ignore security tickets. Cap how many open security fixes each repository and each person carries at once, and feed in the next batch as the current one merges.
A finding that arrives as a pull request with a minimal, root-cause fix merges faster than a ticket that says "this endpoint is vulnerable to SSRF." A good fix:
Keep a human approving every merge. Speed that skips review only moves the risk somewhere else.
Give each risk tier a target fix time, informed by the same factors as step 4. When a fix stalls, escalate it to the owner and their lead in the channel they actually read, with the risk and deadline stated.
Report the burn-down each week: inflow, outflow, open count by age bucket, and progress per campaign and per team. If inflow is creeping back above outflow, you'll see it in weeks, not quarters.
Nullify puts code, secrets, cloud, dependency and pentest findings into one backlog and scores each finding 0–100 on severity, exploitability, reachability and business impact. Actively exploited vulnerabilities and zero-days affecting your stack move to the top. Unreachable code, test fixtures and benign configurations are filtered out before a person reviews anything.
From there, security leaders run campaigns against a class of findings, scoped by type, CWE, CVE, repository, team or severity. Nullify opens minimal fixes that are validated against your build, routes them to the owner from CODEOWNERS and commit history, and paces the work at no more than 3 open fix PRs per repository and 5 per remediation plan. Stalled PRs are escalated in Slack, your developers approve every merge, and reporting tracks resolved versus remaining for each campaign and team.
One HealthTech team cut its open vulnerabilities from 1,996 to 565 in a quarter, and SmithRx merged 324 patches in a single month. See how campaigns work on the security program management page.
Detection scales with your codebase, but remediation scales with people. Each new repository, dependency and disclosed CVE adds findings, while every fix still needs someone to confirm it, find the owner, write the change and get it reviewed. When new findings arrive faster than fixes merge, the backlog grows whatever the prioritization.
Start with findings that are known to be exploited (on the CISA KEV catalog), reachable from untrusted input, and on internet-facing or business-critical systems. Then work down by exploit likelihood and impact. Severity scores alone aren't enough, because they don't account for whether the vulnerable code runs in your environment.
Yes, if each closure has a reason, an approver and, for accepted risks, an expiry date. Old findings in deleted code or decommissioned systems should be closed. What isn't OK is bulk-suppressing findings to hit a target, because that lowers the count without lowering the risk.
It depends on the backlog's size, how much is noise, and how fast fixes merge. Filtering duplicates and unreachable findings often removes a large share in the first weeks. After that, progress comes down to outflow beating inflow, so track the weekly burn-down rather than aiming for zero by a fixed date.