Triaging Auto-Filed Vulnerability Tickets

Stop routing scanner output directly to on-call. Automatically enrich each finding with exposure, asset owner, and exploitation status, auto-close findings for components you do not run or cannot reach, batch everything that is not internet-facing and actively exploited into a scheduled queue, and page only for the narrow set that genuinely needs action tonight.

Why the queue floods

Vulnerability scanners are designed for coverage, not for prioritisation. A single dependency update in a base image can generate hundreds of findings across services. A new scan of the same unchanged systems refiles what was already known. Container images pull in operating system packages that your application never calls.

Three structural problems follow.

Severity is not exposure. Scanners report a base score without knowing whether the component is reachable, authenticated, or even loaded at runtime.

Ownership is missing. A finding lands on on-call because the scanner has no model of which team owns the affected service.

Repetition is constant. The same unpatched package reappears on every scan, so triage effort is spent re-reading decisions that were already made.

The result is an on-call engineer reading hundreds of tickets that describe the same handful of underlying facts, while the one that matters sits in the middle of them.

Why this is an incident management problem

On-call exists to respond to things that are breaking now. A vulnerability that has existed for six months and will still exist tomorrow does not qualify, even at a high severity. Treating scanner output as pages trains engineers to dismiss the queue, which is exactly the habit that causes the real one to be missed.

Scanners are not wrong, just unaware

The tool reports what it can see: a package version and a published advisory. It cannot see your network policy, your runtime configuration, or which code paths execute. Treating its output as a list of facts to enrich, rather than a list of tasks to complete, is the shift that makes the queue manageable.

A triage pipeline that works

1. Enrich automatically before a human sees it. Attach the affected asset, its owner, whether it is internet facing, what data it handles, the runtime version actually deployed, and whether the vulnerable code path is reachable where you can determine that.

2. Attach exploitation status. Check the finding against known exploited vulnerability catalogues and exploit prediction data. This is the single most useful enrichment step.

3. Auto-close the noise. Components not deployed, packages present in an image but not used at runtime where you can prove it, and findings already tracked under an existing ticket.

4. Route by ownership. Send remaining findings to the team that owns the service, into their backlog, with a due date derived from severity and exposure.

5. Page only on a narrow rule. For example: internet facing, unauthenticated, remote code execution or authentication bypass, and either publicly exploited or with a public proof of concept. Everything else waits for business hours.

6. Suppress with an expiry. Accepted risks and false positives get a suppression with an owner, a reason, and a review date, so they cannot become permanent invisible debt.

7. Feed patterns back. Group findings by weakness class and by base image or shared library. Most flood problems are fixed once at the base image, not repeatedly per service.

Making it stick

Agree the paging rule with security and engineering together. Written down, with examples of what does and does not page. An unwritten rule becomes an argument during an incident.

Set service level targets by tier, not by score alone. For example, internet-facing critical findings within days, internal criticals within a sprint, everything else within a release cycle. Then measure against them.

Measure the right things. Time to triage, time to remediate by tier, the number of findings auto-closed, the number of pages generated, and how many of those pages led to same-night action. If almost none did, the rule is too broad.

Review suppressions on a schedule. The list of accepted risks is where quiet failure accumulates.

Keep one ticket per underlying problem. If forty services share a vulnerable base image, the work is one image fix and forty follow-ups, not forty investigations.

Record decisions with a root cause code. Over a quarter, the codes show whether the queue is dominated by base images, unpatched dependencies, or scanner false positives, and each of those has a different fix.

Re-run the rule against past incidents. Take the last few genuinely urgent vulnerabilities and check whether your rule would have paged for them. That is the only real test of the threshold.

Frequently asked questions

How do you triage CVE tickets that are auto-filed to on-call?
Stop routing scanner output to on-call. Enrich findings automatically with exposure, ownership, and exploitation status, auto-close ones for components you do not run, route the rest to owning teams with due dates by tier, and page only for internet-facing, unauthenticated, actively exploited issues.
Should vulnerability scanner findings page the on-call engineer?
Almost never. On-call responds to things breaking now, while most findings describe long-standing conditions. Paging on scan output trains engineers to ignore the queue. Reserve pages for a narrow written rule, such as internet-facing unauthenticated remote code execution with known exploitation.
How do you reduce duplicate vulnerability findings?
Deduplicate against existing tickets, group findings by shared base image or library so one fix closes many, suppress accepted risks and false positives with an owner and review date, and auto-close findings for components that are not deployed or not reachable at runtime.
What should the paging threshold for vulnerabilities be?
Define it in writing with security and engineering, typically internet-facing, unauthenticated, high-impact issues with public exploitation or proof-of-concept code. Then test it against past urgent vulnerabilities to check it would have paged, and measure how many pages led to same-night action.