mcpField
P
performing-cve-prioritization-with-kev-catalog

performing-cve-prioritization-with-kev-catalog

github.com/mukul975安全35.2k94 次安装8 周前更新
代码仓库

关于 performing-cve-prioritization-with-kev-catalog

面向漏洞管理团队的 CVE 优先级评估技能,将 CISA KEV、EPSS、CVSS 与资产和网络因素结合,帮助按风险排序并生成报告。

主要功能

  1. 01解析 CISA KEV 目录
  2. 02补充 EPSS 与 CVSS 数据
  3. 03结合资产重要性和网络暴露度评分
  4. 04按优先级和时限分类
  5. 05生成优先级报告

适用场景

  1. 01将漏洞扫描结果与 KEV 目录比对
  2. 02制定基于风险的修复顺序
  3. 03跟踪 KEV 漏洞的修复时限
  4. 04在 CI/CD 流程中自动化漏洞评估

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill performing-cve-prioritization-with-kev-catalog

安装后在 Claude Code 中输入/performing-cve-prioritization-with-kev-catalog确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

使用 KEV 目录执行 CVE 优先级排序

概述

CISA 已知被利用漏洞(KEV)目录依据约束性操作指令(BOD)22-01 建立,是一个持续更新的 CVE 列表,其中的 CVE 已在真实环境中被积极利用,并带来重大风险。截至 2026 年初,该目录包含超过 1,484 个条目,仅在 2025 年就新增 245 个条目,增长 20%。本技能涵盖如何将 KEV 目录与 EPSS(漏洞利用预测评分系统)和 CVSS 一起集成到漏洞优先级排序工作流中,以创建基于风险的方法,优先处理已确认存在利用活动的漏洞,而非仅依据理论严重性。

何时使用

  • 在执行涉及使用 KEV 目录进行 CVE 优先级排序的安全评估时
  • 在针对相关安全事件遵循事件响应流程时
  • 在执行计划内的安全测试或审计活动时
  • 在通过动手测试验证安全控制措施时

先决条件

  • 可访问漏洞扫描结果(Qualys、Nessus、Rapid7 等)
  • 熟悉 CVE 标识符和 NVD
  • 理解 CVSS 评分(v3.1 和 v4.0)
  • 可访问 CISA KEV、EPSS 和 NVD 端点的 API
  • Python 3.8+,并安装 requests 和 pandas 库

核心概念

CISA KEV 目录结构

每个 KEV 条目包含:

  • CVE ID:CVE 标识符(例如 CVE-2024-3094)
  • 供应商/项目:受影响的供应商和产品名称
  • 漏洞名称:漏洞的简短描述
  • 添加日期:CISA 将其添加到目录的时间
  • 简短描述:简要技术描述
  • 所需操作:建议的修复操作
  • 截止日期:联邦机构(FCEB)完成修复的截止期限
  • 已知勒索软件活动使用:勒索软件组织是否利用该漏洞
BOD 22-01 修复时间线
CVE 发布日期修复截止期限
2021 或之后自列入 KEV 起 2 周
2021 之前自列入 KEV 起 6 个月
多因素优先级排序模型
因素权重数据源理由
已列入 CISA KEV30%CISA KEV JSON feed已确认存在积极利用
EPSS 评分25%FIRST EPSS API预测的利用概率
CVSS 基础评分20%NVD API v2.0漏洞的固有严重性
资产关键性15%CMDB/资产清单业务影响背景
网络暴露10%网络架构攻击面可访问性
KEV + EPSS 决策矩阵
已列入 KEVEPSS > 0.5CVSS >= 9.0优先级SLA
是任意任意P1-紧急48 小时
否是是P1-紧急48 小时
否是否P2-严重7 天
否否是P2-严重7 天
否否否(>= 7.0)P3-高14 天
否否否(>= 4.0)P4-中30 天
否否否(< 4.0)P5-低90 天

工作流

步骤 1:获取并解析 KEV 目录
import requests
import json
from datetime import datetime

KEV_URL = "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json"

def fetch_kev_catalog():
    """Download and parse the CISA KEV catalog."""
    response = requests.get(KEV_URL, timeout=30)
    response.raise_for_status()
    data = response.json()

    catalog = {}
    for vuln in data.get("vulnerabilities", []):
        cve_id = vuln["cveID"]
        catalog[cve_id] = {
            "vendor": vuln.get("vendorProject", ""),
            "product": vuln.get("product", ""),
            "name": vuln.get("vulnerabilityName", ""),
            "date_added": vuln.get("dateAdded", ""),
            "description": vuln.get("shortDescription", ""),
            "action": vuln.get("requiredAction", ""),
            "due_date": vuln.get("dueDate", ""),
            "ransomware_use": vuln.get("knownRansomwareCampaignUse", "Unknown"),
        }

    print(f"[+] Loaded {len(catalog)} CVEs from CISA KEV catalog")
    print(f"    Catalog version: {data.get('catalogVersion', 'N/A')}")
    print(f"    Last updated: {data.get('dateReleased', 'N/A')}")
    return catalog

kev = fetch_kev_catalog()
步骤 2:使用 EPSS 评分进行丰富
EPSS_API = "https://api.first.org/data/v1/epss"

def get_epss_scores(cve_list):
    """Fetch EPSS scores for a batch of CVEs."""
    scores = {}
    batch_size = 100
    for i in range(0, len(cve_list), batch_size):
        batch = cve_list[i:i + batch_size]
        cve_param = ",".join(batch)
        response = requests.get(EPSS_API, params={"cve": cve_param}, timeout=30)
        if response.status_code == 200:
            for entry in response.json().get("data", []):
                scores[entry["cve"]] = {
                    "epss": float(entry.get("epss", 0)),
                    "percentile": float(entry.get("percentile", 0)),
                }
    return scores
步骤 3:构建优先级排序引擎
import pandas as pd

def prioritize_vulnerabilities(scan_results, kev_catalog, epss_scores):
    """Apply multi-factor prioritization to scan results."""
    prioritized = []

    for vuln in scan_results:
        cve_id = vuln.get("cve_id", "")
        cvss_score = float(vuln.get("cvss_score", 0))
        asset_criticality = float(vuln.get("asset_criticality", 3))
        exposure = float(vuln.get("network_exposure", 3))

        in_kev = cve_id in kev_catalog
        kev_data = kev_catalog.get(cve_id, {})
        epss_data = epss_scores.get(cve_id, {"epss": 0, "percentile": 0})
        epss_score = epss_data["epss"]

        # Composite risk score calculation
        risk_score = (
            (1.0 if in_kev else 0.0) * 10 * 0.30 +
            epss_score * 10 * 0.25 +
            cvss_score * 0.20 +
            (asset_criticality / 5.0) * 10 * 0.15 +
            (exposure / 5.0) * 10 * 0.10
        )

        # Assign priority level
        if in_kev or (epss_score > 0.5 and cvss_score >= 9.0):
            priority = "P1-Emergency"
            sla_days = 2
        elif epss_score > 0.5 or cvss_score >= 9.0:
            priority = "P2-Critical"
            sla_days = 7
        elif cvss_score >= 7.0:
            priority = "P3-High"
            sla_days = 14
        elif cvss_score >= 4.0:
            priority = "P4-Medium"
            sla_days = 30
        else:
            priority = "P5-Low"
            sla_days = 90

        prioritized.append({
            "cve_id": cve_id,
            "cvss_score": cvss_score,
            "epss_score": round(epss_score, 4),
            "epss_percentile": round(epss_data["percentile"], 4),
            "in_cisa_kev": in_kev,
            "ransomware_use": kev_data.get("ransomware_use", "N/A"),
            "kev_due_date": kev_data.get("due_date", "N/A"),
            "risk_score": round(risk_score, 2),
            "priority": priority,
            "sla_days": sla_days,
            "asset": vuln.get("asset", ""),
            "asset_criticality": asset_criticality,
        })

    df = pd.DataFrame(prioritized)
    df = df.sort_values("risk_score", ascending=False)
    return df
步骤 4:生成优先级排序报告
def generate_report(df, output_file="kev_prioritized_report.csv"):
    """Generate summary report from prioritized vulnerabilities."""
    print("\n" + "=" * 70)
    print("VULNERABILITY PRIORITIZATION REPORT - KEV + EPSS + CVSS")
    print("=" * 70)

    print(f"\nTotal vulnerabilities analyzed: {len(df)}")
    print(f"KEV-listed vulnerabilities:    {df['in_cisa_kev'].sum()}")
    print(f"Ransomware-associated:         {(df['ransomware_use'] == 'Known').sum()}")

    print("\nPriority Distribution:")
    print(df["priority"].value_counts().to_string())

    print("\nTop 15 Highest Risk Vulnerabilities:")
    top = df.head(15)[["cve_id", "cvss_score", "epss_score", "in_cisa_kev",
                        "risk_score", "priority"]]
    print(top.to_string(index=False))

    df.to_csv(output_file, index=False)
    print(f"\n[+] Full report saved to: {output_file}")

最佳实践

  1. 每天更新 KEV 目录,因为 CISA 每周会多次添加新条目
  2. 始终将 KEV 与 EPSS 交叉参考;某个 CVE 可能具有较高的 EPSS 但尚未被列入 KEV
  3. 无论 CVSS 评分如何,将所有列入 KEV 的 CVE 视为 P1-紧急
  4. 特别关注标记为“已知勒索软件活动使用”的 KEV 条目
  5. 在 CI/CD 流水线中自动将 KEV 与您的漏洞扫描结果进行比较
  6. 针对 FCEB 合规要求单独跟踪 KEV 截止日期
  7. 将 KEV 用作威胁狩猎的领先指标;如果某个 CVE 被添加,请检查您的环境中是否存在先前的利用情况

常见陷阱

  • 仅依赖 CVSS 评分,而不检查 KEV 或 EPSS 数据
  • 未足够频繁地更新 KEV 目录(CISA 每周多次更新)
  • 将非 KEV CVE 视为安全;它们可能已被利用但尚未被编目
  • 忽略「勒索软件使用」字段,该字段表示最高紧迫性的威胁
  • 仅将 KEV 用于合规,而未将其纳入整体风险管理

相关技能

  • prioritizing-vulnerabilities-with-cvss-scoring
  • building-vulnerability-data-pipeline-with-api
  • implementing-threat-intelligence-scoring
  • implementing-vulnerability-remediation-sla

评论

支持 Markdown