HOW-TO GUIDE | ASSET MANAGEMENT
Updated 10 min read

How to Cross-Reference Your Asset Inventory Against the CISA KEV Catalog: Manual Method and Free Python Tool

1,607
CVEs in the CISA KEV catalog as of June 2026, spanning 300+ vendor products
20 min
Time to run a full cross-reference using the Python script in this guide
$0
Cost of the CISA KEV JSON feed and the Python matching approach
5%
Of all published CVEs are in KEV, meaning most scanner findings are lower priority

SponsoredRetool

Retool's new app builder is where AI-generated code ships safely

Building apps with AI is easy. Getting them to production safely is another story.

Start building for free today

Every organization has a gap between what their vulnerability scanner reports and what actually needs to be fixed first. The CISA KEV catalog closes that gap for the highest-risk subset: vulnerabilities with confirmed active exploitation.

The problem is matching. The KEV catalog uses Palo Alto Networks PAN-OS. Your CMDB says PA-5250 running PAN-OS 10.2. Your scanner says Palo Alto PAN-OS. None of these strings match exactly, which is why automated cross-referencing requires fuzzy matching rather than exact string comparison.

This guide provides both a manual approach (for environments with small asset counts) and a Python script (for environments with hundreds or thousands of assets) that handles the matching problem correctly.

Understanding the KEV Catalog Structure

Before matching, understand what the KEV catalog actually contains.

Each KEV entry includes:

  • cveID: the CVE identifier (e.g., CVE-2026-0257)
  • vendorProject: the vendor name as CISA writes it (e.g., "Palo Alto Networks")
  • product: the product name as CISA writes it (e.g., "PAN-OS")
  • dueDate: the remediation deadline for FCEB agencies
  • shortDescription: a plain-English description of the vulnerability

The challenge: KEV uses informal product names that do not always match how your CMDB, scanner, or software inventory records them. "Palo Alto Networks" in KEV might be "Palo Alto" or "PAN" in your records. "PAN-OS" might be recorded as "PAN-OS firewall" or just "Palo Alto firewall" in your asset database.

Download the current KEV catalog to inspect the vendor and product names for products you know you run:

curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json \
  | jq -r '.vulnerabilities[] | [.vendorProject, .product] | @tsv' | sort -u | head -50

This command shows all unique vendor-product combinations in the catalog. Run it before building your matching logic so you know exactly how CISA represents your vendors.

Option A: Manual Cross-Reference for Small Inventories

If you have fewer than 100 software products in your inventory, the manual approach is faster to set up than scripting.

Step 1: Export your software inventory to a spreadsheet. Your sources: CMDB export, vulnerability scanner software inventory report, MDM software inventory, or a manual audit. The key columns you need are Vendor and Product (or a combined Software Name column).

Step 2: Download the KEV catalog as CSV. Go to cisa.gov/known-exploited-vulnerabilities-catalog and download the CSV. Open it in your spreadsheet tool.

Step 3: Create a VLOOKUP or filter on vendorProject. In your spreadsheet, create a helper column that checks if each asset's vendor name appears in the KEV catalog's vendorProject column. Because the strings will not match exactly, this step requires manual review per vendor:

  1. Get the unique list of vendors in your inventory
  2. For each vendor, search the KEV CSV for matching entries (use Ctrl+F or a filter)
  3. Where you find a match, list the KEV product names associated with that vendor
  4. Check whether any of those product names appear in your inventory for that vendor

Step 4: For confirmed product matches, pull the KEV entries. For each matched product, record the CVE IDs, due dates, and required actions. This is your KEV exposure list.

This process takes 30 to 60 minutes for a 100-product inventory. For larger inventories, use the Python script below.

Free daily briefing

Briefings like this, every morning before 9am.

Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.

Option B: Python Script for Automated Fuzzy Matching

This script downloads the current KEV catalog, loads your asset inventory from a CSV, and performs fuzzy matching on vendor and product names to find likely matches. It outputs a report of your KEV-exposed assets.

Required format for your inventory CSV: A file named assets.csv with at minimum these columns: vendor, product. Example:

vendor,product,version,hostname
Palo Alto,PAN-OS,10.2.3,fw-01
Microsoft,Defender,4.18.26030.1,all-endpoints
Atlassian,Confluence,7.19.2,wiki-prod

The matching script (save as kev_match.py):

import json
import csv
import urllib.request
from difflib import SequenceMatcher

KEV_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"
ASSET_FILE = "assets.csv"
SCORE_THRESHOLD = 0.65  # adjust: higher = fewer false positives

def similarity(a, b):
    return SequenceMatcher(None, a.lower(), b.lower()).ratio()

# Fetch KEV catalog
with urllib.request.urlopen(KEV_URL) as r:
    kev_data = json.loads(r.read())
kev_vulns = kev_data["vulnerabilities"]

# Load asset inventory
with open(ASSET_FILE) as f:
    assets = list(csv.DictReader(f))

print(f"Checking {len(assets)} assets against {len(kev_vulns)} KEV entries...\n")
print(f"{'Asset Vendor':<25} {'Asset Product':<25} {'CVE':<18} {'KEV Vendor':<25} {'KEV Product':<25} {'Due Date':<12}")
print("-" * 130)

matches_found = 0
for asset in assets:
    av = asset.get("vendor", "").strip()
    ap = asset.get("product", "").strip()
    for vuln in kev_vulns:
        kv = vuln["vendorProject"]
        kp = vuln["product"]
        vendor_score = similarity(av, kv)
        product_score = similarity(ap, kp)
        # Both vendor and product must score above threshold
        if vendor_score >= SCORE_THRESHOLD and product_score >= SCORE_THRESHOLD:
            print(f"{av:<25} {ap:<25} {vuln['cveID']:<18} {kv:<25} {kp:<25} {vuln['dueDate']:<12}")
            matches_found += 1

print(f"\nTotal matches: {matches_found}")

Run it:

python3 kev_match.py > kev_exposure_report.txt
cat kev_exposure_report.txt

The SCORE_THRESHOLD parameter controls sensitivity. Start at 0.65. If you see obvious false positives (Microsoft matching against unrelated vendors), increase to 0.75. If you are missing known matches, decrease to 0.55. Review the output manually: fuzzy matching is not perfect, and human confirmation is required for ambiguous matches.

Improving Match Quality: Vendor Name Normalization

The biggest source of false negatives in automated KEV matching is inconsistent vendor naming. CISA writes "Palo Alto Networks"; your CMDB writes "Palo Alto"; your scanner writes "PAN". The fuzzy matcher handles moderate inconsistency, but explicit normalization produces better results.

Add a normalization dictionary to the script:

VENDOR_MAP = {
    "palo alto": "Palo Alto Networks",
    "pan": "Palo Alto Networks",
    "ms": "Microsoft",
    "msft": "Microsoft",
    "apache foundation": "Apache",
    "apache software foundation": "Apache",
    "jboss": "Red Hat",
    "confluence": "Atlassian",
    "jira": "Atlassian",
    "fortinet": "Fortinet",
    "fortigate": "Fortinet",
    "cisco systems": "Cisco",
    "vmware": "VMware",
    "broadcom vmware": "VMware",
}

def normalize_vendor(v):
    vl = v.lower().strip()
    for key, val in VENDOR_MAP.items():
        if key in vl:
            return val
    return v

Apply this function to both the asset vendor and the KEV vendor before the similarity comparison. Normalization reduces the threshold needed and dramatically cuts false negatives for the most common vendor naming variations.

Acting on the Results

Once you have your KEV exposure list, prioritize remediation using this framework:

Priority 1 (Patch within 48 hours): Asset is internet-facing or business-critical AND the KEV due date has passed or is within 7 days. This is confirmed exploitation of a product you own, with a past or imminent deadline.

Priority 2 (Patch within 7 days): Asset is internal AND the KEV due date is within 21 days. You have time, but the exploitation is confirmed and active.

Priority 3 (Patch within 30 days): Asset is internal AND the KEV due date is more than 21 days away. Schedule through your normal patch cycle but do not delay further.

For each matched asset, pull the full KEV entry for the required action text. CISA specifies the exact remediation (patch, apply mitigation, or disable feature) in the requiredAction field. This field is more operationally specific than the CVE description and often references vendor-specific guidance.

To get the full required action for all your matched CVEs:

for CVE in CVE-2026-0257 CVE-2025-34291; do
  curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json \
    | jq -r ".vulnerabilities[] | select(.cveID==\"$CVE\") | [.cveID, .dueDate, .requiredAction] | @tsv"
done

Run this cross-reference at least monthly. The KEV catalog grows continuously, and a product that was clean last month may have a new entry this week. Combine it with the automated KEV alert setup from How to Set Up CISA KEV Alerts Without a SIEM to receive same-day notification when a new KEV entry matches your environment.

The bottom line

Cross-referencing your asset inventory against the CISA KEV catalog takes 20 minutes with a Python script and a CSV export of your software inventory. The output is a list of every asset in your environment running confirmed-exploited software, ranked by due date. This is a more operationally useful prioritization signal than any CVSS-based patch queue. Run it monthly, automate the alert for new entries, and treat every match as a P1 remediation item regardless of the underlying CVSS score.

Frequently asked questions

Why does my vulnerability scanner not automatically flag KEV entries?

Most enterprise vulnerability scanners (Tenable, Qualys, Rapid7) do include CISA KEV status in their findings today, typically as a filter or risk tag on affected findings. However, the cross-reference in this guide is useful for three scenarios: you do not have an enterprise scanner, your scanner coverage is incomplete (cloud assets, BYOD devices, shadow IT), or you want to cross-reference a CMDB or software license inventory that is not connected to a scanner. It is also a useful verification step when you want to confirm what your scanner is flagging against the canonical CISA source.

What if my asset inventory only has IP addresses and not software names?

An IP address inventory alone is not sufficient for KEV cross-referencing. You need vendor and product names. To generate a software inventory from IP addresses, run a credentialed Nessus or OpenVAS scan (which enumerates installed software), use an agent-based inventory tool, or use the Windows Management Instrumentation (WMI) query `Get-WmiObject -Class Win32_Product` across your Windows estate. For Linux hosts, `dpkg -l` or `rpm -qa` provides installed package lists. You can then feed those outputs into the cross-reference script.

Does the KEV catalog include cloud services or only on-premises software?

The KEV catalog includes both on-premises software and hosted services where the vulnerability affects a customer-managed component. For example, a vulnerability in a self-hosted GitLab instance would appear in KEV. Vulnerabilities in fully managed SaaS services (where the vendor controls the patching) generally do not appear in KEV because customers have no remediation action to take. Check the `requiredAction` field in the KEV entry to understand whether the remediation is customer-actionable.

How accurate is the fuzzy matching approach?

Fuzzy matching at a threshold of 0.65 typically achieves 85 to 90 percent recall (finding most true matches) with a false positive rate of around 10 to 15 percent. The false positives are manageable with a one-time manual review of the output. The vendor normalization dictionary in this guide significantly improves accuracy for the most common enterprise vendors. For production use in a large organization, consider supplementing the approach with CPE (Common Platform Enumeration) matching, which uses a standardized software naming schema that both the NVD and some CMDB tools support.

What is the biggest obstacle to KEV-based patch prioritization in practice?

The most common obstacle is asset inventory accuracy. KEV matching requires knowing which software versions are deployed on which systems — if your asset inventory is maintained manually, it is typically 30-60% complete and 2-4 weeks stale. KEV entries often require a patch within 15-21 days for federal agencies (and comparable urgency for security-conscious private organizations), so stale inventory means some vulnerable systems get missed. Practical solution: use your vulnerability scanner (Tenable, Qualys, Rapid7) as the source of truth for KEV matching rather than a static CMDB — scanners maintain continuously updated software inventories per host. Most enterprise VM platforms now surface KEV entries directly in their dashboards without requiring the custom matching logic described in this guide.

How do you handle KEV matches where the affected product version is embedded in a vendor appliance you cannot patch on your own schedule?

Third-party appliances and embedded vendor products are the hardest KEV remediation cases because the patching dependency chain runs through the vendor's release and support cycle, not yours. The operational approach for unpatchable or slowly-patched KEV matches: first, formally document the asset as a known exception with the KEV CVE ID, the vendor's stated patch timeline, and compensating controls in place -- this record is required for any audit or insurance inquiry. Second, implement network-based compensating controls that reduce the exploitability of the specific vulnerability without patching: if the KEV entry describes a network-accessible authentication bypass, restrict source IP access to the appliance to only the hosts that legitimately require access. If it describes a web interface vulnerability, place the management interface on an isolated management VLAN with no general network reachability. Third, contact the vendor in writing requesting an expedited patch timeline and citing the CISA KEV entry -- vendor support organizations respond faster when the customer can point to a confirmed exploitation catalog entry rather than a theoretical CVSS score. Finally, escalate internally to business leadership if the vendor's patch timeline extends beyond 60 days for a confirmed-exploited vulnerability on a critical asset: the risk acceptance decision for running confirmed-exploited code on your network for months is a business decision, not a security team decision to make unilaterally.

Sources & references

  1. CISA KEV JSON Feed
  2. CISA Known Exploited Vulnerabilities Catalog
  3. NIST NVD CPE Dictionary

Free resources

25
Free download

Critical CVE Reference Card 2025–2026

25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.

No spam. Unsubscribe anytime.

Free download

Ransomware Incident Response Playbook

Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.

No spam. Unsubscribe anytime.

Free newsletter

Get threat intel before your inbox does.

50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.

Unsubscribe anytime. We never sell your data.

Eric Bang
Author

Founder & Cybersecurity Evangelist, Decryption Digest

Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.

Black Hat Giveaway

Win a $2,495 Black Hat pass.

Full-access to Black Hat USA 2026 in Las Vegas. Subscribe free to enter.

Joins Decryption Digest daily briefing. Unsubscribe anytime.

Giveaway: Black Hat USA 2026 Full-Access Pass ($2,495 value)

Details →
Daily Briefing

Subscribe to enter the giveaway

Every subscriber is automatically entered. You also get daily threat intel every morning: zero-days, ransomware, and nation-state campaigns. Free. No spam.

Already subscribed? You're already entered.

Giveaway

Win a $2,495 Black Hat USA 2026 pass.