Vulnerability Management
Finding and fixing weaknesses before attackers do: scanning, CVE and CVSS, prioritizing, patching, and penetration testing.
The vulnerability management lifecycle
Vulnerability management is the continuous process of identifying, assessing, prioritizing, remediating and verifying weaknesses in an organization's systems and software. "Continuous" is the key word: new vulnerabilities are published every day, and new systems appear every week, so a one-time cleanup is outdated within a month.
Report closes the loop: management needs to see whether the number of open critical findings goes down, how long fixes take, and which risks were accepted. Those numbers decide whether the process gets enough people and maintenance windows.
Asset inventory first
You cannot protect what you do not know you have. A scanner only scans the address ranges and systems it is pointed at; the forgotten test server, the webcam on the office network and the cloud account a project team opened with a credit card stay invisible. An asset inventory lists hardware, software, cloud resources and their owners, together with how critical each one is to the business. It is the foundation of vulnerability management: it defines the scope, tells you whom to call about a finding, and supplies the "how important is this system?" context for prioritization.
Inventories drift, so they are kept current by several sources at once: the configuration management database, endpoint management and endpoint detection and response (EDR) agents, network discovery scans, and the cloud providers' own resource listings. Differences between those sources are themselves useful findings.
Vulnerability scanning
A vulnerability scanner is a tool that automatically checks systems against a database of known vulnerabilities and misconfigurations, and reports what it finds with a severity for each. Scanners work in three main ways:
| Type | How it works | Strengths and limits |
|---|---|---|
| Unauthenticated (non-credentialed) | Probes systems over the network from outside, like an attacker without an account would | Shows what is exposed; sees only versions that services reveal, so it misses much and guesses more |
| Authenticated (credentialed) | Logs in with a dedicated read-only account and inspects installed software, patches and settings | Far more complete and accurate; the scan account must itself be protected carefully |
| Agent-based | A small program on each host reports its software and configuration to a central server | Works for laptops that are rarely on the office network; one more agent to deploy and maintain |
Scanners report false positives, for example a vulnerability "found" because of a version number, while the operating system vendor has already backported the fix into that version. They also miss things: custom applications, logic flaws and anything outside the scope. Every finding is therefore assessed before work is assigned: is it real, does it apply in this configuration, and who owns the system?
Container images and infrastructure code are scanned too: see image scanning and security scanners for IaC.
CVE and CVSS
CVE: a name for each vulnerability
CVE (Common Vulnerabilities and Exposures)
is the public list of identifiers for known vulnerabilities, in the
form CVE-year-number. Each identifier
refers to one vulnerability, so a vendor advisory, a scanner finding
and a news article can all be sure they mean the same thing. The
well-known Log4Shell vulnerability in the Log4j logging library, for
example, is CVE-2021-44228. The program is operated by the MITRE
Corporation with funding from the United States Cybersecurity and
Infrastructure Security Agency (CISA), and identifiers are assigned
by many CVE Numbering Authorities, including large software vendors.
A CVE entry says what the vulnerability is, not how bad it
is in your environment.
CVSS: how severe is it?
CVSS (Common Vulnerability Scoring System) is an open standard, maintained by FIRST (the Forum of Incident Response and Security Teams), that rates the technical severity of a vulnerability with a score from 0.0 to 10.0. The base score is calculated from base metrics that describe the vulnerability itself. In CVSS version 3.1 those are:
- Exploitability: attack vector (from network down to physical access), attack complexity, privileges required, and whether user interaction is needed.
- Scope: whether a successful attack can affect components beyond the vulnerable one.
- Impact: the effect on confidentiality, integrity and availability (none, low or high).
The metrics are written as a vector string.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H reads:
reachable over the network, low complexity, no privileges and no
user interaction needed, and high impact on all three; its base
score is 9.8. Version 4.0, published in 2023, refines the metrics
(it adds "attack requirements" and drops "scope", among other
changes) and renames the optional groups; both versions are in use,
so check which one a score comes from. Optional threat and
environmental metrics let an organization adjust the base score for
active exploitation and for its own environment.
Severity bands
Scores are grouped into qualitative bands, which most tools and patch policies use:
| Severity | CVSS score |
|---|---|
| None | 0.0 |
| Low | 0.1 – 3.9 |
| Medium | 4.0 – 6.9 |
| High | 7.0 – 8.9 |
| Critical | 9.0 – 10.0 |
The program below maps scores to these bands, including the boundary values, and then sorts a fake list of scan findings. It does not sort by score alone: findings on the CISA list of known exploited vulnerabilities (see the next section) come first, then the severity band, and within a band, internet-facing systems before internal ones.
def severity(score):
"""Map a CVSS base score (0.0-10.0) to its qualitative severity band."""
if not 0.0 <= score <= 10.0:
raise ValueError(f"not a CVSS score: {score}")
if score == 0.0:
return "None"
if score < 4.0:
return "Low"
if score < 7.0:
return "Medium"
if score < 9.0:
return "High"
return "Critical"
# Fake scan findings: (finding, host, CVSS base score, known exploited, internet-facing)
findings = [
("Outdated TLS configuration", "web01", 5.3, False, True),
("Remote code execution in VPN gateway", "vpn01", 9.8, True, True),
("Privilege escalation in print service", "pc-0447", 7.8, True, False),
("SQL injection in intranet app", "intra01", 8.8, False, False),
("Server version shown in HTTP header", "web01", 0.0, False, True),
("Denial of service in file server", "fs01", 6.5, False, False),
("Weak SSH cipher allowed", "jump01", 3.7, False, True),
]
for score in (0.0, 3.9, 4.0, 6.9, 7.0, 8.9, 9.0, 10.0):
print(f"{score:>4} {severity(score)}")
print()
BANDS = ["None", "Low", "Medium", "High", "Critical"]
def priority(finding):
name, host, score, exploited, exposed = finding
# Known exploited first, then severity band, then internet-facing, then score.
return (exploited, BANDS.index(severity(score)), exposed, score)
ranked = sorted(findings, key=priority, reverse=True)
for name, host, score, exploited, exposed in ranked:
flags = ("KEV " if exploited else " ") + ("internet" if exposed else "internal")
print(f"{score:>4} {severity(score):<8} {flags:<12} {host:<8} {name}")
0.0 None 3.9 Low 4.0 Medium 6.9 Medium 7.0 High 8.9 High 9.0 Critical 10.0 Critical 9.8 Critical KEV internet vpn01 Remote code execution in VPN gateway 7.8 High KEV internal pc-0447 Privilege escalation in print service 8.8 High internal intra01 SQL injection in intranet app 5.3 Medium internet web01 Outdated TLS configuration 6.5 Medium internal fs01 Denial of service in file server 3.7 Low internet jump01 Weak SSH cipher allowed 0.0 None internet web01 Server version shown in HTTP header
Notice that the 7.8 privilege escalation ranks above the 8.8 SQL injection: one is known to be used by attackers right now, the other is not. That is the core idea of the next section.
Prioritizing beyond the score
A large organization easily has tens of thousands of open findings, far more than it can fix at once, and a large share of them are rated High or Critical. CVSS describes how bad a vulnerability could be; it does not say how likely it is to be used against you, or how much that system matters. Good prioritization combines several inputs:
- Known exploitation. The Known Exploited Vulnerabilities (KEV) catalog of CISA lists vulnerabilities with evidence of active exploitation. A KEV entry moves a finding to the top of the list, whatever its score. The KEV catalog is not complete; absence from it is no proof of safety.
- Likelihood of exploitation. The Exploit Prediction Scoring System (EPSS), also maintained by FIRST, estimates the probability that a vulnerability will be exploited in the coming 30 days. Most vulnerabilities are never exploited in practice; EPSS helps find the few that probably will be.
- Asset criticality. The same vulnerability matters more on the payment server or a system that controls a physical process than on a test machine. This is where the asset inventory pays off.
- Exposure. A system reachable from the internet can be attacked by anyone; one deep inside a segmented network first requires another foothold. Network segmentation and other controls change the real risk.
Zero-day vulnerabilities
A zero-day vulnerability is a vulnerability that attackers know about or exploit before the vendor has released a fix, so defenders have had "zero days" to patch. No scanner can find a vulnerability that is not yet in its database, and no patch exists. The defenses are the general ones: defense in depth, least privilege, segmentation, monitoring for unusual behavior, and the ability to apply the vendor's temporary mitigation quickly once it is announced. When a zero-day in a product you use makes the news, the first question is the asset inventory's: where do we run this?
Remediation, deadlines and exceptions
Remediation usually means applying a patch or upgrade; sometimes it means changing a configuration or removing software nobody needs. To make the work predictable, organizations set remediation deadlines (service level agreements, SLAs) per severity. The exact numbers are a policy decision; a typical example:
| Finding | Example deadline |
|---|---|
| Known exploited (KEV) on an internet-facing system | As soon as possible, within days; emergency change |
| Critical | 7–15 days |
| High | 30 days |
| Medium | 90 days |
| Low | Next regular maintenance cycle |
After the fix, the finding is verified by a rescan or a manual check. A ticket closed as "patched" while the old version still runs is one of the most common gaps in vulnerability management.
Compensating controls and exceptions
Sometimes a fix cannot be applied in time: the vendor has no patch yet, the system is certified in its current state (common in medical and industrial equipment), or the patch breaks a critical application. Then a compensating control reduces the risk another way: isolating the system in its own network segment, blocking the vulnerable service at the firewall, adding extra monitoring, or disabling the affected feature.
When the remaining risk is accepted, that is recorded as a formal exception: which finding, why it cannot be fixed, which compensating controls apply, who accepted the risk (a business owner with the authority to do so, not the administrator) and an expiry date for review. Risk acceptance is one of the risk treatment options described in threats, vulnerabilities and risk. An exception without an expiry date tends to become permanent.
Penetration testing and red teaming
Scanning finds known weaknesses one by one. A penetration test is an authorized, simulated attack on a defined set of systems by skilled testers, to find vulnerabilities and show what an attacker could actually achieve by exploiting and combining them. Its report lists findings with evidence and advice for fixing them. A red team exercise goes further: a longer, goal-oriented simulation of a real adversary, often unannounced to the defenders, to test detection and response as much as the systems.
| Vulnerability scan | Penetration test | Red team exercise | |
|---|---|---|---|
| Goal | Find known weaknesses broadly | Find and prove exploitable weaknesses in a scope | Test whether the organization detects and stops a realistic attack |
| Method | Automated | Mostly manual, with tools | Manual, stealthy, may include social engineering and physical access |
| Frequency | Continuous or weekly | Yearly, and after major changes | Occasionally, for mature organizations |
| Defenders informed? | Yes | Usually | Often only a small control group |
Every test is bounded by rules of engagement: the scope (which systems, addresses and applications are in, and which are explicitly out), the allowed techniques, the time windows, how to handle sensitive data found along the way, emergency contacts and a stop procedure if something breaks. When a development team should call one in, and what to prepare: Security Testing › Penetration testing.
Disclosure, bug bounties and security.txt
Vulnerabilities are also found by outsiders: researchers, students, customers. Responsible disclosure, now usually called coordinated vulnerability disclosure (CVD), is the practice in which the finder reports a vulnerability privately to the owner, the owner fixes it within a reasonable time, and details are published only afterward, ideally in agreement. The finder acts in good faith and does no more than needed to demonstrate the problem; the owner promises not to report finders who follow its policy to the police or take legal action against them.
In the Netherlands the public prosecutor still decides independently whether to prosecute, but the country has a long tradition here. The NCSC published a guideline for responsible disclosure in 2013 and later an updated guideline under the name coordinated vulnerability disclosure, and many Dutch organizations, from ministries to small companies, publish a CVD policy. Volunteer researchers, for instance in the Dutch Institute for Vulnerability Disclosure (DIVD), scan for known vulnerabilities and notify affected organizations.
An owner's promise does not bind prosecutors. The Justice
Department announced in 2022 that federal prosecutors should not
charge good-faith security research under the Computer Fraud and
Abuse Act; that is a charging policy, not a legal defense, so
check that it still applies, and state laws and civil lawsuits
remain possible. Federal civilian agencies must publish a
vulnerability disclosure policy at
/vulnerability-disclosure-policy on their main
website (CISA's Binding Operational Directive 20-01, 2020),
including a commitment not to pursue legal action against
good-faith reporters. For critical infrastructure and widely
used technology, CISA runs a coordinated disclosure program and
may publish a vulnerability as early as 45 days after first
trying to reach the vendor, whether or not a fix exists.
An owner's promise does not bind prosecutors, and the Computer Misuse Act 1990 has no defense for security research. In May 2026 the government announced a National Security Bill that will update the act, partly to make it easier for cybersecurity professionals to secure systems; as of October 2026 that bill has not been introduced in Parliament. The NCSC's Vulnerability Disclosure Toolkit describes what every organization needs: a way to receive reports, a disclosure policy and a security.txt file. Under the PSTI Act, manufacturers of consumer connectable products have had to publish how to report security issues since 29 April 2024.
A bug bounty program adds a reward, often run through a specialized platform, with its own scope and rules.
security.txt
Finders often fail to reach the right person: the general inbox
ignores the report, or it lands with marketing. RFC 9116 defines a
small text file at /.well-known/security.txt on a
website, which tells researchers where to send reports.
Contact and Expires are required; the
other fields are optional:
Contact: mailto:security@example.com Expires: 2027-09-30T22:00:00.000Z Preferred-Languages: nl, en Policy: https://www.example.com/coordinated-vulnerability-disclosure Canonical: https://www.example.com/.well-known/security.txt