skills/building-vulnerability-aging-and-sla-tracking/SKILL.md
实施漏洞老化仪表盘和 SLA 跟踪系统,根据基于严重性的时间线衡量修复绩效,并推动问责制落地。
npx skillsauth add killvxk/cybersecurity-skills-zh building-vulnerability-aging-and-sla-trackingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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"
}}
}
}
}
}
}
testing
设计并执行社会工程学渗透测试,包括钓鱼、语音钓鱼、短信钓鱼和物理借口活动,以衡量人员安全韧性并识别培训差距。
testing
主持结构化的事件后审查,以识别根本原因、记录有效和无效的措施,并提出可操作的改进建议以提升未来的事件响应能力。
testing
通过分析举报的邮件、提取指标、评估凭据受攻陷情况、在全组织范围隔离恶意邮件并修复受影响账号来响应网络钓鱼事件。涵盖邮件头分析、URL/附件沙箱检测和邮箱范围清除操作。适用于网络钓鱼响应、邮件事件、凭据钓鱼、鱼叉式网络钓鱼调查或钓鱼修复相关请求。
tools
票据传递(Pass-the-Ticket,PtT)是一种横向移动技术,使用窃取的 Kerberos 票据(TGT 或 TGS)在不知道用户密码的情况下向服务进行认证。通过从已控制的主机内存中提取 Kerberos 票据,攻击者可以将这些票据注入自己的会话以模拟票据所有者。