building-vulnerability-aging-and-sla-tracking

实施漏洞老化仪表盘和 SLA 跟踪系统,根据基于严重性的时间线衡量修复绩效,并推动问责制落地。

9 stars

Best use case

building-vulnerability-aging-and-sla-tracking is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

实施漏洞老化仪表盘和 SLA 跟踪系统,根据基于严重性的时间线衡量修复绩效,并推动问责制落地。

Teams using building-vulnerability-aging-and-sla-tracking should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/building-vulnerability-aging-and-sla-tracking/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/building-vulnerability-aging-and-sla-tracking/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/building-vulnerability-aging-and-sla-tracking/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How building-vulnerability-aging-and-sla-tracking Compares

Feature / Agentbuilding-vulnerability-aging-and-sla-trackingStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

实施漏洞老化仪表盘和 SLA 跟踪系统,根据基于严重性的时间线衡量修复绩效,并推动问责制落地。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 构建漏洞老化与 SLA 跟踪

## 概述

2024 年新发现的漏洞超过 30,000 个(比上年增加 17%),组织必须跟踪漏洞未修复的时间以及修复是否在规定的服务级别协议(SLA)内完成。漏洞老化衡量从发现到修复之间的时间,而 SLA 跟踪则强制执行基于严重性的截止时限。行业基准标准 SLA 为:关键漏洞 14 天、高危漏洞 30 天、中危漏洞 60 天、低危漏洞 90 天,但对于被主动利用的关键 CVE,更激进的时间线(24-48 小时)正越来越普遍。本技能涵盖 SLA 策略设计、老化仪表盘构建、自动化升级实施和合规指标生成。

## 前置条件

- 具有历史扫描数据的漏洞管理平台
- 具有关键性评级的资产清单
- 用于修复跟踪的 ITSM/工单系统
- 报告平台(Splunk、Elastic、Power BI、Grafana)
- 与利益相关方就 SLA 时间线和升级流程达成一致

## 核心概念

### 标准漏洞 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 | 尽力而为 | 尽力而为 | 不适用 |

### 自适应 SLA 调节系数

| 因素 | 调节系数 | 理由 |
|--------|----------|-----------|
| 互联网暴露资产 | -50% SLA | 更高的暴露风险 |
| 列入 CISA KEV | 覆盖为 48 小时 | 已确认主动利用 |
| EPSS > 0.7 | -50% SLA | 高利用概率 |
| 一级(核心)资产 | -25% SLA | 最大业务影响 |
| 补偿控制已到位 | +25% SLA | 风险已部分降低 |
| 供应商补丁尚不可用 | 例外处理并设置审查日期 | 暂时无法修复 |

### 关键绩效指标(KPI)

| KPI | 计算公式 | 目标 |
|-----|---------|--------|
| 平均修复时间(MTTR) | 平均值(修复日期 - 发现日期) | 整体 < 30 天 |
| SLA 合规率 | (在 SLA 内修复的漏洞数 / 总漏洞数)* 100 | >= 90% |
| 超期漏洞数量 | 计数(年龄 > SLA)条目 | 持续下降趋势 |
| 漏洞老化分布 | 按年龄段计数(0-14 天、15-30 天、31-60 天、60+ 天) | 大多数在 0-30 天 |
| 修复速度 | 每周关闭的漏洞数 | 持续上升趋势 |
| 例外率 | (例外数 / 总漏洞数)* 100 | < 5% |

## 实施步骤

### 步骤 1:制定 SLA 策略文件

```
漏洞修复 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. 指标报告:每月向安全委员会报告
```

### 步骤 2:构建老化计算引擎

```python
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)
```

### 步骤 3:仪表盘可视化

```python
# 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"
                    }}
                }
            }
        }
    }
}
```

## 最佳实践

1. 从可实现的 SLA 目标开始,随着流程成熟逐步收紧
2. 根据资产关键性和威胁背景调整 SLA,而不仅仅依赖 CVSS 评分
3. 自动化升级通知以减少手动跟踪开销
4. 按月跟踪 MTTR 趋势以展示改进成果
5. 构建需要记录补偿控制的例外工作流
6. 每月向高管层报告 SLA 合规情况以确保问责制
7. 在安全委员会和董事会级别报告中包含老化指标
8. 将 SLA 跟踪与 ITSM 工单系统集成,实现端到端修复可视化

## 常见陷阱

- 设置团队无法完成的不切实际 SLA 目标,导致 SLA 疲劳
- 未根据资产关键性调整 SLA,对所有系统一视同仁
- 缺少例外流程,迫使团队要么忽略 SLA 要么申请一揽子豁免
- 仅测量未修复漏洞数量,而不考虑年龄和 SLA 合规情况
- 未从发现日期开始计算 SLA 时钟(而使用报告日期)
- 随着团队成熟度提升未重新校准 SLA

## 相关技能

- implementing-vulnerability-remediation-sla
- building-executive-vulnerability-risk-report
- implementing-security-metrics-and-kpis
- performing-remediation-validation-scanning

Related Skills

triaging-vulnerabilities-with-ssvc-framework

9
from killvxk/cybersecurity-skills-zh

使用 CISA 的利益相关方特定漏洞分类(SSVC)决策树框架对漏洞进行分类和优先排序,产出可操作的修复优先级:Track、Track*、Attend 或 Act。

triaging-security-incident

9
from killvxk/cybersecurity-skills-zh

使用 NIST SP 800-61r3 和 SANS PICERL 框架对安全事件进行初始分类,确定严重性、范围和所需响应行动。 按类型对事件分类,根据业务影响分配优先级,并路由到相应的响应团队。适用于事件分类、 安全告警分类、严重性评估、事件优先级排序或初始事件分析等请求场景。

triaging-security-incident-with-ir-playbook

9
from killvxk/cybersecurity-skills-zh

使用结构化 IR Playbook 对安全事件进行分类和优先排序,确定严重性、分配响应团队并启动适当的响应程序。

triaging-security-alerts-in-splunk

9
from killvxk/cybersecurity-skills-zh

在 Splunk Enterprise Security 中对安全告警进行分类,通过 SPL 查询和事件审查(Incident Review) 仪表板对重要事件进行严重性分类、调查、关联相关遥测并做出升级或关闭决策。 适用于 SOC 分析师需要处理关联搜索产生的告警队列、确定调查优先级, 或需要为交接给二/三级分析师记录分类决策时。

tracking-threat-actor-infrastructure

9
from killvxk/cybersecurity-skills-zh

威胁行为者基础设施追踪涉及使用被动 DNS、证书透明度日志、Shodan/Censys 扫描、WHOIS 分析和网络指纹技术,对对手控制的 C2 服务器、钓鱼域名和暂存服务器等资产进行监控、映射和持续追踪

testing-api-for-mass-assignment-vulnerability

9
from killvxk/cybersecurity-skills-zh

测试 API 是否存在批量赋值(mass assignment,自动绑定)漏洞——攻击者可在 API 请求中附加额外参数,从而修改本不应被访问的对象属性。测试人员识别可写端点,向请求体注入未公开字段(role、isAdmin、price、balance),验证服务器是否在未过滤的情况下将这些字段绑定到数据模型。属于 OWASP API3:2023 Broken Object Property Level Authorization 范畴。适用于批量赋值测试、参数绑定滥用、自动绑定漏洞或 API 过度发布(over-posting)相关请求。

performing-web-application-vulnerability-triage

9
from killvxk/cybersecurity-skills-zh

使用 OWASP 风险评级方法论对 DAST/SAST 扫描器的 Web 应用程序漏洞发现进行分类,区分真阳性和假阳性,并确定修复优先级。

performing-vulnerability-scanning-with-nessus

9
from killvxk/cybersecurity-skills-zh

使用 Tenable Nessus 执行认证和未认证漏洞扫描,识别网络基础设施、服务器和应用程序中的已知漏洞、 错误配置、默认凭据和缺失补丁。扫描器将发现与 CVE 数据库和 CVSS 评分关联,生成优先级修复指导。 适用于漏洞扫描、Nessus 评估、补丁合规检查或自动化漏洞检测等请求场景。

performing-ssrf-vulnerability-exploitation

9
from killvxk/cybersecurity-skills-zh

通过探测云元数据端点、内网服务和协议处理器,检测用户可控 URL 参数中的 服务端请求伪造(SSRF)漏洞。测试 AWS/GCP/Azure 元数据 API(169.254.169.254)、 通过 HTTP 进行内网端口扫描、URL 协议绕过技术以及 DNS 重绑定检测。

performing-ot-vulnerability-scanning-safely

9
from killvxk/cybersecurity-skills-zh

使用被动监控、原生协议查询和经过精心控制的Tenable OT Security主动扫描,在OT/ICS环境中安全执行漏洞扫描,在不破坏工业过程或导致旧版控制器崩溃的情况下识别漏洞。

performing-ot-vulnerability-assessment-with-claroty

9
from killvxk/cybersecurity-skills-zh

本技能涵盖使用Claroty xDome平台在OT环境中执行漏洞评估,实现全面资产发现、风险评分、漏洞关联和修复优先级排序。内容涉及通过流量分析进行被动漏洞识别、OT设备安全主动查询、与CVE数据库和ICS-CERT公告集成,以及考虑运营影响和补偿控制措施的基于风险的优先级排序。

performing-endpoint-vulnerability-remediation

9
from killvxk/cybersecurity-skills-zh

通过基于风险评分对 CVE 进行优先级排序、部署补丁、应用配置变更和验证修复 来执行端点漏洞修复。适用于修复漏洞扫描发现的问题、响应严重 CVE 公告 或维护端点合规性与补丁管理 SLA 的场景。适用于涉及漏洞修复、CVE 补丁、 端点漏洞管理或安全修复部署的请求。