Ask who owns a vulnerability and you will usually get two answers at once. Security says the developers own it, because they own the code. Developers say security owns it, because security found it. Both are partly right, and the finding sits in the gap between them until it breaches its SLA, or until someone exploits it.

In short

  • Ownership has to be decided before the finding exists. Map every repository, image and cloud account to a team; findings inherit the owner automatically.
  • Split the work, not the accountability. Security owns the policy, the priority and the verification. The owning team owns the fix and the date.
  • SLAs only work with an exception process. Every dismissal needs a reason, every snooze needs an end date, and long-term risk acceptance needs a named approver.
  • Platform teams own shared fixes. A base image or a shared library should be fixed once, centrally, not by fifty product teams separately.

Three teams, one finding

Most organisations have three groups with a hand on a vulnerability. The security team (AppSec, cloud security, the CISO’s office) sets policy and runs the tooling. Product engineering teams own services and the code in them. Platform teams own the things everybody builds on: base images, CI pipelines, shared libraries, the cloud landing zone.

A vulnerable package in a base container image is a good test. Security’s scanner reports it in fifty services. Fifty product teams each get a ticket. Forty-eight of them cannot fix it, because the fix is in the base image, which a platform team owns. The right answer is one finding routed to one team, and fifty services that inherit the fix when they rebuild.

flowchart TD F["New finding"] --> Q{"Where is the fix?"} Q -->|"In the service's own code
or its direct dependencies"| P["Product team
owns the fix"] Q -->|"In a base image, shared library
or pipeline template"| PL["Platform team
owns the fix"] Q -->|"In cloud configuration
or identity policy"| C["Cloud or platform team
owns the fix"] P --> S["Security verifies
on the next scan"] PL --> S C --> S

Route the finding to whoever can change the thing that fixes it, not to whoever runs the affected service.

A RACI for the vulnerability lifecycle

A RACI chart (Responsible, Accountable, Consulted, Informed) is unfashionable, but for vulnerability management it removes most of the arguments. This is a starting point; adapt the columns to your own organisation.

ActivitySecurity teamProduct teamPlatform teamCISO
Set the priority model and SLAsRCCA
Map assets to owning teamsRA (confirms)CI
Set business context (exposure, data, criticality)CA/RCI
Run scanning and correlationA/RIC (CI integration)I
Triage: confirm or dismissA/RCCI
Fix in service code and direct dependenciesCA/RII
Fix in base images, shared libraries, pipelinesCIA/RI
Verify the fixA (automatic rescan)III
Approve risk acceptance beyond SLAR (recommends)R (requests)CA
Report to the boardRIIA

The important line is the second one. If ownership is assigned when a finding appears, every new finding starts with an argument. If it is assigned to the asset in advance, every finding on that asset inherits an owner, and the argument happens once.

The lifecycle, step by step

sequenceDiagram autonumber participant S as Scanner and CI participant F as InsightFortify participant A as Security analyst participant D as Owning team participant L as Security lead S->>F: Results from a scan or pipeline F->>F: Correlate, score, set P1-P4 and SLA due date F->>A: New P1 or P2 in the queue A->>F: Confirm and assign to the owning team F->>D: Finding with evidence and fix guidance alt Fixed within SLA D->>S: Ships the fix S->>F: Next scan no longer reports it F->>F: Marks it fixed and records time to remediate else Cannot fix in time D->>L: Requests an exception with a reason L->>F: Snooze with an end date, or escalate to the CISO end

Security finds, prioritises and verifies. The owning team fixes or asks for an exception. Nothing closes on someone's word alone.

Two details in that sequence matter more than they look. First, a finding is marked fixed by the next scan, not by a person. Ticket systems close when someone says the work is done; vulnerability management should close when the evidence says it is gone. Second, the exception path is part of the process, not a failure of it. Some findings genuinely cannot be fixed inside the SLA, and a process without a legitimate way to say so gets worked around.

SLAs that teams can actually meet

An SLA is a promise the organisation makes to itself about how long a known risk may stay open. It is only credible if the volume it applies to is manageable. That is why prioritisation comes first: an SLA of seven days on every “critical” is unachievable when half of everything is critical. An SLA of seven days on known-exploited, reachable findings is achievable, because there are few of them.

PriorityDefault SLATypical contentEscalation if missed
P17 daysKnown exploited, reachable, on exposed or sensitive systemsSecurity lead at breach; CISO at 2× SLA
P230 daysHigh likelihood or high impact, but not bothSecurity lead at breach
P390 daysReal but limited: internal, mitigated, or low likelihoodTeam review at quarterly planning
P4180 daysHygiene: test code, dev-only dependencies, informationalNone; fix opportunistically

These are the defaults in InsightFortify and they are deliberately conventional. You can change them per organisation. What matters more than the exact numbers is that they are written down, agreed with engineering leadership, and applied to a list short enough to meet.

The InsightFortify findings queue showing priority, score, kind, repository, sources and SLA due date
The findings queue. Every finding carries its priority, its owning repository and its SLA due date, so overdue work is visible without a separate report.

Exceptions: the part most programmes get wrong

There are three legitimate reasons not to fix a finding on time, and each needs a different mechanism.

SituationRight mechanismWhat must be recorded
It is not real: a false positive, or the code is never deployedDismissThe reason, and who decided. Kept and auditable; never deleted.
It is real but cannot be fixed yet: no patch, a release freeze, a dependency upgrade that needs planningSnooze with an end dateThe reason, the date, and the plan. Once the date has passed, the next scan that still sees it reopens it.
It is real and the business chooses to live with itRisk acceptance, approved by the CISO or a risk committeeThe business owner, the compensating controls, the review date.

Watch for snoozes that become permanent

A snooze renewed every quarter is a risk acceptance nobody signed. Review long-running snoozes in the quarterly cycle and either fix them or formally accept them.

Security champions

The most effective lever on ownership is not a process. It is a person in each engineering team who understands the priority model, can triage the team’s own findings, and is the first call when security needs something. Champions are usually volunteers given a small time allocation, some training and recognition. They turn “security’s tickets” into the team’s own work.

Setting up ownership in the first monthDo this before switching on SLA reporting
1
Export the asset listsecurity lead

Every repository, production image and cloud account the tooling sees.

2
Assign an owning team to eachengineering managers

Use your service catalogue if you have one. Unowned assets are a finding in themselves.

3
Set business context with each teamproduct teams

Internet-facing, data classes, criticality, compensating controls. Thirty minutes per team, once.

4
Agree the SLA and exception policyCISO with engineering leadership

Written down, signed off, published where every engineer can find it.

5
Name a champion per teamengineering managers

One person, a few hours a month, with a direct line to AppSec.

6
Switch on SLA reportingsecurity lead

Only now do overdue numbers mean anything.

Roles in the tool

InsightFortify maps these responsibilities to four roles. Security lead manages repositories, policies, SLAs and settings. Security analyst triages: confirm, dismiss, snooze, reopen and assign. Developer reads findings and works on the ones assigned to them. Auditor has read-only access, including the audit trail of every triage decision. Each dismissal and snooze keeps who made it and why.

For the CISO

Ownership is a design decision you make once, not a negotiation you have per finding.

You are accountable for the exception process. If it is too hard to use, people will work around it.

For the AppSec lead

Route to whoever can change the thing that fixes it. Base images and shared libraries go to the platform team.

Let the next scan close the finding, not the ticket.

For the board

Ask how many findings have no owner, and how many exceptions are past their review date.

A programme with a working exception process is more trustworthy than one that claims to fix everything.

A vulnerability without an owner is a vulnerability nobody will fix.

Assign owners to assets in advance, split the work clearly, and give every exception an end date.

Keep reading