mcpField
V
vulnerability-deduplication

vulnerability-deduplication

github.com/happy-technologies-llc安全4141 次安装2 天前更新
代码仓库

关于 vulnerability-deduplication

用于查找并合并 ServiceNow 重复漏洞记录的技能,重点处理多个扫描器针对同一 CVE 和配置项上报的发现。它帮助漏洞管理团队减少记录噪声,同时保留风险背景和审计轨迹。

主要功能

  1. 01按 CVE 和配置项匹配发现
  2. 02比较不同扫描器的报告
  3. 03合并重复的修复任务
  4. 04按风险和业务重要性排序
  5. 05记录决策并生成暴露报告

适用场景

  1. 01扫描导入后去重记录
  2. 02新增扫描器时检查重叠项
  3. 03定期开展漏洞数据清理
  4. 04生成排序后的唯一暴露清单

MCP 相关

说明如何使用 ServiceNow MCP 工具查询漏洞和资产表、运行聚合脚本、更新重复记录并记录合并决策。

安装

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

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill vulnerability-deduplication

安装后在 Claude Code 中输入/vulnerability-deduplication确认已加载。

详细介绍

漏洞去重

概述

此技能可帮助漏洞管理团队识别并合并重复的漏洞记录。当多个扫描器针对同一资产报告同一个 CVE 时,可能会产生此类重复记录。去重能够减少干扰、提高修复效率,并准确统计组织实际面临的漏洞风险。

主要功能:

  • 通过匹配 CVE ID 和配置项,识别重复的易受攻击项
  • 检测不同扫描器来源报告同一问题时产生的近似重复项
  • 将冗余的修复任务合并为一个可执行任务
  • 使用 CVSS 评分和业务关键性对去重后的漏洞进行优先级排序
  • 生成报告,展示重复项减少情况和实际风险数量
  • 保留去重决策的审计跟踪记录

适用场景: 导入漏洞扫描结果后、定期开展漏洞清理审查时、接入新的扫描器时,或因多个扫描器覆盖范围重叠而导致漏洞数量看似虚高时。

前提条件

  • 角色: sn_vul.manager、sn_vul.admin
  • 访问权限: 对 sn_vul_vulnerable_item、sn_vul_entry、sn_vul_third_party_entry、sn_vul_remediation_task 表具有读写权限
  • 插件: Vulnerability Response(sn_vul)
  • 数据: 已将一个或多个扫描器的漏洞扫描数据导入 ServiceNow

操作步骤

步骤 1:按 CVE 和 CI 识别潜在重复项

查询共享同一 CVE 和配置项的易受攻击项,这表明多个扫描器来源可能报告了重复项。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var ga = new GlideAggregate('sn_vul_vulnerable_item');
    ga.addQuery('state', 'IN', 'Open,Under Investigation');
    ga.addAggregate('COUNT');
    ga.groupBy('vulnerability');
    ga.groupBy('cmdb_ci');
    ga.addHaving('COUNT', '>', 1);
    ga.query();
    var dupCount = 0;
    while (ga.next()) {
      dupCount++;
      gs.info('Duplicate: Vuln=' + ga.vulnerability.getDisplayValue() +
              ' CI=' + ga.cmdb_ci.getDisplayValue() +
              ' Count=' + ga.getAggregate('COUNT'));
    }
    gs.info('Total duplicate groups found: ' + dupCount);

使用 REST:

GET /api/now/stats/sn_vul_vulnerable_item?sysparm_query=stateINOpen,Under Investigation&sysparm_count=true&sysparm_group_by=vulnerability,cmdb_ci&sysparm_having=COUNT>1
步骤 2:检索特定 CVE 的重复记录

针对每组重复项,提取完整记录,以比较扫描器来源和检测详情。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_vul_vulnerable_item
  query: vulnerability=[VULNERABILITY_SYS_ID]^cmdb_ci=[CI_SYS_ID]^stateINOpen,Under Investigation
  fields: sys_id,vulnerability,cmdb_ci,state,risk_score,cvss_score,first_found,last_found,source,scanner,assignment_group,assigned_to,remediation_task
  limit: 20

使用 REST:

GET /api/now/table/sn_vul_vulnerable_item?sysparm_query=vulnerability=[VULNERABILITY_SYS_ID]^cmdb_ci=[CI_SYS_ID]^stateINOpen,Under Investigation&sysparm_fields=sys_id,vulnerability,cmdb_ci,state,risk_score,cvss_score,first_found,last_found,source,scanner,assignment_group,assigned_to,remediation_task&sysparm_limit=20&sysparm_display_value=true
步骤 3:从漏洞条目检索 CVE 详情

查找权威漏洞条目,以获取准确的 CVE 信息。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_vul_entry
  query: sys_id=[VULNERABILITY_SYS_ID]
  fields: sys_id,cve_id,description,cvss_score,severity,exploit_available,vendor_advisory,published_date,solution
  limit: 1

使用 REST:

GET /api/now/table/sn_vul_entry?sysparm_query=sys_id=[VULNERABILITY_SYS_ID]&sysparm_fields=sys_id,cve_id,description,cvss_score,severity,exploit_available,vendor_advisory,published_date,solution&sysparm_limit=1
步骤 4:检查第三方扫描器条目

查看扫描器专属条目,了解哪些扫描器报告了同一漏洞。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_vul_third_party_entry
  query: vulnerability_entry=[VULNERABILITY_SYS_ID]
  fields: sys_id,source,scanner_id,vulnerability_entry,severity,first_found,last_found,status,plugin_id
  limit: 20

使用 REST:

GET /api/now/table/sn_vul_third_party_entry?sysparm_query=vulnerability_entry=[VULNERABILITY_SYS_ID]&sysparm_fields=sys_id,source,scanner_id,vulnerability_entry,severity,first_found,last_found,status,plugin_id&sysparm_limit=20&sysparm_display_value=true
步骤 5:获取受影响 CI 的业务背景

检索资产详情,将业务关键性纳入优先级排序的考量。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: cmdb_ci
  query: sys_id=[CI_SYS_ID]
  fields: sys_id,name,sys_class_name,ip_address,os,environment,business_criticality,support_group,department,operational_status
  limit: 1

使用 REST:

GET /api/now/table/cmdb_ci?sysparm_query=sys_id=[CI_SYS_ID]&sysparm_fields=sys_id,name,sys_class_name,ip_address,os,environment,business_criticality,support_group,department,operational_status&sysparm_limit=1&sysparm_display_value=true
步骤 6:合并重复记录

保留 first_found 日期最早且数据最完整的记录。关闭重复项,并注明主记录以供参考。

使用 MCP:

Tool: SN-Update-Record
Parameters:
  table_name: sn_vul_vulnerable_item
  sys_id: [DUPLICATE_SYS_ID]
  fields:
    state: Closed
    close_notes: "Duplicate of [PRIMARY_SYS_ID]. Same CVE ([CVE_ID]) on same CI ([CI_NAME]) reported by different scanner ([SCANNER_NAME]). Consolidated into primary record."
Tool: SN-Add-Work-Notes
Parameters:
  table_name: sn_vul_vulnerable_item
  sys_id: [PRIMARY_SYS_ID]
  work_notes: "Deduplication: Consolidated [N] duplicate records from scanners [SCANNER_LIST]. This record retained as primary. Earliest first_found: [DATE]. Highest risk_score: [SCORE]."

使用 REST:

PATCH /api/now/table/sn_vul_vulnerable_item/[DUPLICATE_SYS_ID]
Content-Type: application/json

{
  "state": "Closed",
  "close_notes": "Duplicate of [PRIMARY_SYS_ID]. Same CVE on same CI from different scanner. Consolidated."
}
步骤 7:合并修复任务

找出为重复易受攻击项创建的冗余修复任务,并将其合并。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_vul_remediation_task
  query: vulnerable_item=[PRIMARY_SYS_ID]^ORvulnerable_item=[DUPLICATE_SYS_ID]^stateINOpen,In Progress
  fields: sys_id,number,short_description,state,assigned_to,assignment_group,vulnerable_item,opened_at,due_date
  limit: 20

关闭重复修复任务:

Tool: SN-Update-Record
Parameters:
  table_name: sn_vul_remediation_task
  sys_id: [DUPLICATE_TASK_SYS_ID]
  fields:
    state: Closed
    close_notes: "Consolidated with [PRIMARY_TASK_NUMBER]. Duplicate vulnerability record closed during deduplication."

使用 REST:

GET /api/now/table/sn_vul_remediation_task?sysparm_query=vulnerable_itemIN[PRIMARY_SYS_ID],[DUPLICATE_SYS_ID]^stateINOpen,In Progress&sysparm_fields=sys_id,number,short_description,state,assigned_to,assignment_group,vulnerable_item,opened_at,due_date&sysparm_limit=20&sysparm_display_value=true

PATCH /api/now/table/sn_vul_remediation_task/[DUPLICATE_TASK_SYS_ID]
Content-Type: application/json

{
  "state": "Closed",
  "close_notes": "Consolidated with primary remediation task during deduplication."
}
步骤 8:生成去重报告和按优先级排序的风险清单

完成去重后,生成按风险优先级排序的唯一漏洞清单。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var gr = new GlideRecord('sn_vul_vulnerable_item');
    gr.addQuery('state', 'IN', 'Open,Under Investigation');
    gr.orderByDesc('risk_score');
    gr.query();
    var results = [];
    while (gr.next()) {
      results.push({
        vuln: gr.vulnerability.getDisplayValue(),
        ci: gr.cmdb_ci.getDisplayValue(),
        cvss: gr.cvss_score + '',
        risk: gr.risk_score + '',
        first_found: gr.first_found + '',
        source: gr.source + ''
      });
    }
    gs.info('Unique open vulnerabilities after dedup: ' + results.length);
    // Output top 20 by risk score
    for (var i = 0; i < Math.min(20, results.length); i++) {
      gs.info((i+1) + '. ' + results[i].vuln + ' on ' + results[i].ci +
              ' (CVSS: ' + results[i].cvss + ', Risk: ' + results[i].risk + ')');
    }

去重摘要模板:

=== VULNERABILITY DEDUPLICATION REPORT ===
Date: 2026-03-19 | Analyst: J. Smith

BEFORE DEDUPLICATION:
Total Open Vulnerable Items: 2,847
Unique CVE+CI Combinations: 1,923

DUPLICATES IDENTIFIED: 924 (32.5% duplication rate)

BY SCANNER SOURCE:
| Scanner | Records | Unique | Duplicates | Dup Rate |
|---------|---------|--------|------------|----------|
| Qualys | 1,450 | 1,200 | 250 | 17.2% |
| Tenable | 1,100 | 950 | 150 | 13.6% |
| Rapid7 | 297 | 273 | 24 | 8.1% |
| Cross-scanner overlap | - | - | 500 | - |

ACTIONS TAKEN:
- Closed 924 duplicate vulnerable item records
- Consolidated 312 redundant remediation tasks
- Updated 1,923 primary records with consolidated scanner data

TOP 10 CRITICAL UNIQUE VULNERABILITIES:
| Rank | CVE | CVSS | CI | Environment | Exploit |
|------|-----|------|----|-------------|---------|
| 1 | CVE-2025-44123 | 9.8 | WEBSVR-01 | Production | Yes |
| 2 | CVE-2025-33456 | 9.1 | DB-PROD-02 | Production | Yes |
| 3 | CVE-2025-22789 | 8.8 | APPSVR-05 | Production | No |
| 4 | CVE-2025-11234 | 8.5 | FILESVR-03 | Production | Yes |
| 5 | CVE-2025-99876 | 8.1 | MAIL-01 | Production | No |
...

RECOMMENDATIONS:
1. Schedule recurring deduplication job (weekly recommended)
2. Configure scanner import rules to prevent duplicate creation
3. Prioritize patching for top 10 critical vulnerabilities with exploits
4. Review Qualys/Tenable overlap rules to reduce cross-scanner duplicates

工具用法

工具用途
SN-Query-Table检索易受攻击项、CVE 条目、扫描器数据和 CI
SN-Execute-Background-Script运行聚合查询和批量去重脚本
SN-Update-Record关闭重复记录并更新主记录
SN-Add-Work-Notes在漏洞记录中记录去重决策

最佳实践

  • 合并重复记录时,始终保留最早的 first_found 日期,以准确记录暴露时长
  • 在主记录中保留最高的 risk_score 和 cvss_score,避免低估风险
  • 通过工作备注记录合并决策,并引用已关闭的重复记录,以便审计追踪
  • 每次扫描导入后都执行去重,防止重复记录不断累积
  • 考虑扫描器专属的插件 ID,因为不同扫描器报告同一 CVE 时可能使用不同的插件标识符
  • 批量关闭前先进行验证,抽查一部分已识别的重复记录以确保准确性
  • 使用计划脚本或扫描导入业务规则自动执行定期去重
  • 在主记录中保留扫描器来源元数据,以便修复团队了解哪些扫描器确认了该发现

故障排除

聚合查询未返回重复记录

原因: 如果由不同扫描器导入,同一 CVE 的 vulnerability 字段可能引用不同的 sn_vul_entry 记录。 解决方案: 使用 sn_vul_entry 中的 cve_id 而非 vulnerability sys_id 进行联接。先查询 sn_vul_entry,找出重复的 CVE ID。

扫描器来源字段为空

原因: 扫描器集成可能不会填充易受攻击项目上的 source 或 scanner 字段。 解决方案: 检查 sn_vul_third_party_entry 表中的扫描器来源数据。检查扫描器集成配置,确保已配置来源映射。

去重后修复任务成为孤立任务

原因: 关闭重复的易受攻击项目不会自动关闭其修复任务。 解决方案: 去重时务必查询并关闭关联的修复任务(步骤 7)。可考虑创建业务规则来自动处理。

去重关闭了实际并非重复的记录

原因: 同一 CI 上的两个不同易受攻击项目可能因共享一个 CVE 而被误判为重复,但它们影响的是不同的软件组件(例如,同一 CVE 影响两个不同的已安装应用程序)。 解决方案: 将 port、protocol 或 software 字段添加到匹配条件中。检查 sn_vul_third_party_entry 中的扫描器插件详情,以确认是否确为重复记录。

示例

示例 1:扫描导入后去重

  1. Tenable 扫描导入 500 个新的易受攻击项目
  2. 运行重复项检测:其中 78 个与现有 Qualys 发现匹配(相同 CVE + CI)
  3. 抽查 10 个重复项,确认匹配准确
  4. 批量关闭 78 个重复项,保留 Qualys 记录(其 first_found 更早)
  5. 合并 23 个冗余修复任务
  6. 生成报告,显示实际新增发现:422 个(而非 500 个)

示例 2:季度漏洞卫生检查

  1. 查询所有未关闭的易受攻击项目:4,200 条记录
  2. 对 3 个扫描器来源执行全面的去重分析
  3. 识别出 1,100 个重复项(重复率为 26.2%)
  4. 找出 45 个 CVE,它们在同一资产上出现在所有 3 个扫描器中
  5. 关闭重复项、合并任务并更新主记录
  6. 生成按优先级排序的暴露清单:3,100 个独立漏洞
  7. 向 CISO 提交清理后的数据和准确的暴露指标

相关技能

  • secops/correlation-insights - 将去重后的漏洞与活跃安全事件关联起来
  • secops/metrics-analysis - 跟踪去重率和漏洞暴露趋势
  • secops/incident-summarization - 在事件摘要中引用去重后的漏洞数据
  • secops/post-incident-analysis - 在 PIR 期间检查漏洞去重的有效性
  • cmdb/data-quality - 确保 CI 记录准确,以便正确匹配漏洞

评论

支持 Markdown