Builds vulnerability aging dashboards and SLA tracking to measure remediation performance by severity timelines, track KPIs, and enforce accountability in vulnerability management.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
2024 年新发现的漏洞超过 30,000 个(比上年增加 17%),组织必须跟踪漏洞未修复的时间以及修复是否在规定的服务级别协议(SLA)内完成。漏洞老化衡量从发现到修复之间的时间,而 SLA 跟踪则强制执行基于严重性的截止时限。行业基准标准 SLA 为:关键漏洞 14 天、高危漏洞 30 天、中危漏洞 60 天、低危漏洞 90 天,但对于被主动利用的关键 CVE,更激进的时间线(24-48 小时)正越来越普遍。本技能涵盖 SLA 策略设计、老化仪表盘构建、自动化升级实施和合规指标生成。
Builds vulnerability aging dashboard and SLA tracking system to measure remediation performance against severity-based timelines.
Builds vulnerability aging dashboards and SLA tracking systems to monitor remediation against severity-based timelines, with KPIs for compliance and accountability.
Builds automated alerts for vulnerability remediation SLA breaches with severity-based timelines, escalation workflows, and compliance reporting dashboards using Python and databases.
Share bugs, ideas, or general feedback.
2024 年新发现的漏洞超过 30,000 个(比上年增加 17%),组织必须跟踪漏洞未修复的时间以及修复是否在规定的服务级别协议(SLA)内完成。漏洞老化衡量从发现到修复之间的时间,而 SLA 跟踪则强制执行基于严重性的截止时限。行业基准标准 SLA 为:关键漏洞 14 天、高危漏洞 30 天、中危漏洞 60 天、低危漏洞 90 天,但对于被主动利用的关键 CVE,更激进的时间线(24-48 小时)正越来越普遍。本技能涵盖 SLA 策略设计、老化仪表盘构建、自动化升级实施和合规指标生成。
| 严重性 | CVSS 范围 | 标准 SLA | 激进 SLA | CISA KEV SLA |
|---|---|---|---|---|
| 关键 | 9.0-10.0 | 14 天 | 48 小时 | BOD 22-01 截止日期 |
| 高 | 7.0-8.9 | 30 天 | 7 天 | 14 天 |
| 中 | 4.0-6.9 | 60 天 | 30 天 | 不适用 |
| 低 | 0.1-3.9 | 90 天 | 60 天 | 不适用 |
| 信息 | 0.0 | 尽力而为 | 尽力而为 | 不适用 |
| 因素 | 调节系数 | 理由 |
|---|---|---|
| 互联网暴露资产 | -50% SLA | 更高的暴露风险 |
| 列入 CISA KEV | 覆盖为 48 小时 | 已确认主动利用 |
| EPSS > 0.7 | -50% SLA | 高利用概率 |
| 一级(核心)资产 | -25% SLA | 最大业务影响 |
| 补偿控制已到位 | +25% SLA | 风险已部分降低 |
| 供应商补丁尚不可用 | 例外处理并设置审查日期 | 暂时无法修复 |
| KPI | 计算公式 | 目标 |
|---|---|---|
| 平均修复时间(MTTR) | 平均值(修复日期 - 发现日期) | 整体 < 30 天 |
| SLA 合规率 | (在 SLA 内修复的漏洞数 / 总漏洞数)* 100 | >= 90% |
| 超期漏洞数量 | 计数(年龄 > SLA)条目 | 持续下降趋势 |
| 漏洞老化分布 | 按年龄段计数(0-14 天、15-30 天、31-60 天、60+ 天) | 大多数在 0-30 天 |
| 修复速度 | 每周关闭的漏洞数 | 持续上升趋势 |
| 例外率 | (例外数 / 总漏洞数)* 100 | < 5% |
漏洞修复 SLA 策略 v1.0
1. 范围:所有信息系统和应用程序
2. 严重性分类:基于 CVSS v4.0/v3.1 基础评分
3. SLA 时间线:参见标准 SLA 框架表
4. 自适应调节系数:根据资产背景应用
5. 例外流程:
- 必须记录业务理由
- 需要补偿控制描述
- 最长延期:90 天(可续期一次)
- 关键/高危例外需要 CISO 批准
6. 升级路径:
- SLA 已过 50%:向资产负责人发送自动提醒
- SLA 已过 75%:升级至经理
- SLA 已过 100%(超期):CISO 通知
- SLA 已过 120%:VP/CTO 升级
7. 指标报告:每月向安全委员会报告
import pandas as pd
from datetime import datetime, timedelta
class VulnerabilityAgingTracker:
"""跟踪漏洞老化和 SLA 合规情况。"""
SLA_DAYS = {
"Critical": 14,
"High": 30,
"Medium": 60,
"Low": 90,
}
def __init__(self, sla_overrides=None):
if sla_overrides:
self.SLA_DAYS.update(sla_overrides)
def calculate_aging(self, vulns_df):
"""计算每个漏洞的老化指标。"""
today = datetime.now()
vulns_df["discovery_date"] = pd.to_datetime(vulns_df["discovery_date"])
vulns_df["remediation_date"] = pd.to_datetime(
vulns_df["remediation_date"], errors="coerce"
)
vulns_df["age_days"] = vulns_df.apply(
lambda row: (row["remediation_date"] - row["discovery_date"]).days
if pd.notna(row["remediation_date"])
else (today - row["discovery_date"]).days,
axis=1
)
vulns_df["sla_days"] = vulns_df["severity"].map(self.SLA_DAYS)
vulns_df["sla_deadline"] = vulns_df["discovery_date"] + \
pd.to_timedelta(vulns_df["sla_days"], unit="D")
vulns_df["is_overdue"] = vulns_df.apply(
lambda row: row["age_days"] > row["sla_days"]
if pd.isna(row["remediation_date"]) else False,
axis=1
)
vulns_df["sla_compliance"] = vulns_df.apply(
lambda row: row["age_days"] <= row["sla_days"]
if pd.notna(row["remediation_date"]) else None,
axis=1
)
vulns_df["days_overdue"] = vulns_df.apply(
lambda row: max(0, row["age_days"] - row["sla_days"])
if row["is_overdue"] else 0,
axis=1
)
vulns_df["sla_pct_elapsed"] = (
vulns_df["age_days"] / vulns_df["sla_days"] * 100
).round(1)
return vulns_df
def generate_kpis(self, vulns_df):
"""从老化数据生成 KPI 摘要。"""
open_vulns = vulns_df[vulns_df["remediation_date"].isna()]
closed_vulns = vulns_df[vulns_df["remediation_date"].notna()]
kpis = {
"total_vulnerabilities": len(vulns_df),
"open_vulnerabilities": len(open_vulns),
"closed_vulnerabilities": len(closed_vulns),
"overdue_count": open_vulns["is_overdue"].sum(),
"mttr_days": closed_vulns["age_days"].mean() if len(closed_vulns) > 0 else 0,
"sla_compliance_rate": (
closed_vulns["sla_compliance"].mean() * 100
if len(closed_vulns) > 0 else 0
),
}
kpis["overdue_by_severity"] = (
open_vulns[open_vulns["is_overdue"]]
.groupby("severity")
.size()
.to_dict()
)
return kpis
def get_escalation_list(self, vulns_df):
"""获取需要升级的漏洞列表。"""
open_vulns = vulns_df[vulns_df["remediation_date"].isna()].copy()
escalations = []
for _, vuln in open_vulns.iterrows():
pct = vuln["sla_pct_elapsed"]
if pct >= 120:
level = "VP/CTO 升级"
elif pct >= 100:
level = "CISO 通知"
elif pct >= 75:
level = "经理升级"
elif pct >= 50:
level = "负责人提醒"
else:
continue
escalations.append({
"cve_id": vuln.get("cve_id", ""),
"severity": vuln["severity"],
"age_days": vuln["age_days"],
"sla_days": vuln["sla_days"],
"days_overdue": vuln["days_overdue"],
"sla_pct": pct,
"escalation_level": level,
"asset": vuln.get("asset", ""),
"owner": vuln.get("owner", ""),
})
return pd.DataFrame(escalations)
# Grafana/Kibana 漏洞老化查询示例
# 老化分布直方图(Elasticsearch)
age_distribution_query = {
"aggs": {
"age_buckets": {
"range": {
"field": "age_days",
"ranges": [
{"key": "0-7 天", "to": 8},
{"key": "8-14 天", "from": 8, "to": 15},
{"key": "15-30 天", "from": 15, "to": 31},
{"key": "31-60 天", "from": 31, "to": 61},
{"key": "61-90 天", "from": 61, "to": 91},
{"key": "90+ 天", "from": 91},
]
}
}
}
}
# SLA 合规趋势(按月)
sla_trend_query = {
"aggs": {
"monthly": {
"date_histogram": {"field": "remediation_date", "interval": "month"},
"aggs": {
"within_sla": {
"filter": {"script": {
"source": "doc['age_days'].value <= doc['sla_days'].value"
}}
}
}
}
}
}