L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

building-vulnerability-exception-tracking-system

building-vulnerability-exception-tracking-system

构建具有审批工作流、补偿控制文档和到期管理功能的漏洞例外与风险接受跟踪系统。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: building-vulnerability-exception-tracking-system description: 构建具有审批工作流、补偿控制文档和到期管理功能的漏洞例外与风险接受跟踪系统。 domain: cybersecurity subdomain: vulnerability-management tags: [vulnerability-exception, risk-acceptance, compensating-controls, exception-tracking, vulnerability-management, governance] version: "1.0" author: mahipal license: Apache-2.0

构建漏洞例外跟踪系统

概述

漏洞例外跟踪系统管理无法在 SLA 时间线内完成修复的漏洞情况。它提供结构化的工作流用于申请例外、记录补偿控制、获取风险接受批准,并在有效期结束时自动使例外失效。这确保组织在符合 PCI DSS、SOC 2 和 NIST CSF 等框架的同时,保持对已接受风险的可见性。

前置条件

  • Python 3.9+,包含 flask、sqlalchemy、requests、jinja2
  • PostgreSQL 或 SQLite 数据库
  • 用于审批通知的邮件/Slack 集成
  • 漏洞管理平台 API(DefectDojo、Qualys、Tenable)

例外申请工作流

例外类别

类别描述最长有效期审批级别
修复延迟补丁可用但部署受阻30 天团队负责人 + 安全团队
无可用修复供应商尚未发布补丁90 天安全总监
业务关键系统修补将导致停机60 天VP 工程 + CISO
误报发现结果并非真实漏洞永久安全分析师
补偿控制已部署替代缓解措施180 天安全架构师

例外申请必填字段

exception_schema = {
    "cve_id": "CVE-2024-XXXX",
    "finding_id": "unique-finding-reference",
    "asset_hostname": "prod-db-01.corp.local",
    "severity": "high",
    "cvss_score": 8.1,
    "category": "remediation_delay",
    "justification": "数据库升级完成前无法应用补丁",
    "compensating_controls": [
        "已部署封锁利用模式的 WAF 规则",
        "网络分段仅允许受信任 VLAN 访问",
        "通过 Splunk 告警对利用指标进行增强监控"
    ],
    "requested_expiration": "2024-06-15",
    "requestor_email": "dbadmin@company.com",
    "approver_emails": ["security-lead@company.com", "ciso@company.com"],
    "risk_rating": "medium",
}

数据库模式

CREATE TABLE vulnerability_exceptions (
    id SERIAL PRIMARY KEY,
    cve_id VARCHAR(20) NOT NULL,
    finding_id VARCHAR(100) NOT NULL,
    asset_hostname VARCHAR(255),
    severity VARCHAR(20),
    cvss_score DECIMAL(3,1),
    category VARCHAR(50) NOT NULL,
    justification TEXT NOT NULL,
    compensating_controls TEXT,
    status VARCHAR(20) DEFAULT 'pending',
    requested_by VARCHAR(255) NOT NULL,
    approved_by VARCHAR(255),
    requested_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    approved_at TIMESTAMP,
    expires_at TIMESTAMP NOT NULL,
    expired BOOLEAN DEFAULT FALSE,
    risk_rating VARCHAR(20),
    review_notes TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE exception_audit_log (
    id SERIAL PRIMARY KEY,
    exception_id INTEGER REFERENCES vulnerability_exceptions(id),
    action VARCHAR(50) NOT NULL,
    actor VARCHAR(255) NOT NULL,
    details TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_exception_status ON vulnerability_exceptions(status);
CREATE INDEX idx_exception_expires ON vulnerability_exceptions(expires_at);
CREATE INDEX idx_exception_cve ON vulnerability_exceptions(cve_id);

实施

例外申请 API

from flask import Flask, request, jsonify
from datetime import datetime, timezone
import json

app = Flask(__name__)

@app.route("/api/exceptions", methods=["POST"])
def create_exception():
    data = request.json
    required = ["cve_id", "finding_id", "category", "justification", "expires_at", "requestor_email"]
    for field in required:
        if field not in data:
            return jsonify({"error": f"缺少必填字段:{field}"}), 400

    # 验证到期时间未超过类别最长有效期
    max_days = {"remediation_delay": 30, "no_fix": 90, "business_critical": 60,
                "false_positive": 365, "compensating_control": 180}
    # 插入数据库并通知审批人
    return jsonify({"status": "pending", "id": "exc-12345"})

@app.route("/api/exceptions/<exc_id>/approve", methods=["POST"])
def approve_exception(exc_id):
    approver = request.json.get("approver_email")
    notes = request.json.get("notes", "")
    # 更新状态为已批准,记录审批人和时间戳
    return jsonify({"status": "approved"})

@app.route("/api/exceptions/<exc_id>/reject", methods=["POST"])
def reject_exception(exc_id):
    reviewer = request.json.get("reviewer_email")
    reason = request.json.get("reason")
    # 更新状态为已拒绝,记录审核人和拒绝原因
    return jsonify({"status": "rejected"})

到期检查器(每日定时任务)

# 每日检查已过期的例外
python3 scripts/process.py --check-expirations

# 生成每月例外报告
python3 scripts/process.py --report --output exception_report.json

补偿控制文档

每项例外的补偿控制必须覆盖以下方面:

  1. 检测:如何检测利用尝试?
  2. 预防:哪些屏障降低了被利用的可能性?
  3. 响应:已准备哪些事件响应流程?
  4. 监控:哪些持续监控确保控制措施仍然有效?

参考资料

Skills enregistrées