Key takeaways

  • Maintain an inventory of running services, images, and owners before you scale scanning.
  • Set SLAs by exposure and data class, then report ageing and exception debt.
  • Track recurrence and reachable exploited issues—not only open-finding volume.
  • Dedupe at the platform layer so one base-image CVE is one owned item.
  • Run a weekly operating rhythm: intake, ageing, exceptions, intel matches.

You cannot manage what you cannot name

Application vulnerability management collapses when findings attach to repositories nobody deploys or to images nobody owns. Start with a living inventory: services, environments, runtime language, data classification, internet exposure, and a named engineering owner. SBOMs and container scans are useful only when they map to that inventory.

Unowned assets are a program defect. Assign a default owner for anything that reaches production without a mapped team, and treat persistent orphans as risk equal to an unpatched critical—because nobody is positioned to patch them.

Refresh the inventory when you ship, not once a year. A quarterly CMDB export that misses last week’s service is how “we scanned everything” becomes a comforting fiction.

Scan on a cadence that matches change

A weekly dump of every CVE in every image creates noise. Align detection to how the software actually changes. Dependencies and images should be checked when they are built and when they run. Application code should be checked when it is reviewed. Production should be re-checked when threat intelligence says a component you already shipped is now being exploited.

Deduplicate relentlessly. The same library in a base image should produce one owned item for the platform team, not twenty copies for every downstream service—unless a service pins its own vulnerable version. Aggregation is how you see systemic risk; duplication is how you burn trust.

Retire findings when the system is gone. Closing as “fixed” because the service was decommissioned pollutes metrics. Closing as “gone” tells the truth and keeps SLAs honest.

  • Build-time: lockfiles, images, and SBOMs attached to the artifact.
  • Change-time: SAST and dependency review on the pull request.
  • Run-time: confirm what is actually serving traffic.
  • Intel-time: re-open or escalate when KEV or active exploit matches inventory.
  • Retirement: stop scanning decommissioned systems and close their findings as gone, not fixed.

SLAs should describe exposure, not tool output

“Patch criticals in seven days” fails when critical includes unreachable test dependencies and excludes an exploited moderate on a public API. Define clocks by a small matrix: internet-facing plus exploitable, sensitive data plus reachable, internal plus no known exploit, and so on. Publish the matrix. Let teams plan capacity against it.

Ageing is the operational view. A finding that is one day old and a finding that is ninety days old are different risks even at the same score. Report how much production exposure sits past SLA, how much sits in exception, and how much is waiting on a platform-level upgrade that many services share.

Do not hide shared-platform work inside every team’s SLA. If twelve services wait on one base image, that is one program item with twelve dependents—not twelve red teams.

Close the loop with engineering practice

If the same injection or access-control class returns every quarter, scanning is detecting a skills and design problem. Feed recurrence into training, paved-road libraries, and code-review prompts. The cheapest vulnerability is the one that is difficult to introduce.

Share fix patterns in the same language and framework the team ships. A generic “sanitize input” advisory will lose to delivery pressure. A repository helper, a failing test, and a short lab that reproduces the last incident will not.

Connect the loop in tooling: the finding queue, the training assignment, and the team workspace should talk about the same weakness class. Isolated LMS completions do not change a backlog.

Report the exposure leaders can fund

Executives cannot act on a count of open plugin alerts. They can act on: internet-facing services with reachable exploited vulnerabilities; exception debt past expiry; time-to-remediate for high-exposure classes; percentage of production artifacts with a current SBOM and owner; recurrence of the same CWE after “fix.”

Keep the working backlog short and owned. Keep the inventory complete. Keep intelligence correlated. That combination is application vulnerability management. A growing spreadsheet of unsorted CVEs is only evidence that detection exists.

Ask for funding with a before-and-after: “Authorization helper plus targeted labs in two quarters; recurrence of IDOR-class findings in tenant services.” Vague “more AppSec headcount” requests lose to product roadmaps.

A weekly operating rhythm

Run a short, boring meeting. Review new matched intelligence, items past SLA, exceptions due this month, and unowned assets. Do not live-demo scanners. Do not relitigate CVSS. Decide, assign, or expire.

Between meetings, intake should not wait for the huddle. Critical matched exposure can break the cadence. Everything else waits in a clearly labeled unsorted pile so the huddle has a job.

Publish notes the same day. A rhythm nobody can read is a private ritual. Engineering managers need the list of owned work, not a recording of the debate.

Cover what you do not compile

SaaS admin consoles, CI runners, and third-party apps hold data and identity even when they are not in your monorepo. Inventory them with the same owner field. A perfect application program that ignores the identity provider or the support vendor is incomplete.

Apply the same triage overlay: reachability, data class, exploitability, and owner. A critical CVE in a product you do not run is not your sprint. A misconfigured tenant isolation control in a SaaS you do run might be.

Write “out of scope” explicitly when it is true. Silence looks like neglect. A scoped program that names its edges is easier to defend than a claim that every CVE in the industry is on the board.

Put it into practice

Build the judgement the program depends on

Train teams on the weakness classes you actually see, then track verified labs and challenge evidence beside your finding queue.

Start practicing