关于 vulnerability-deduplication
用于查找并合并 ServiceNow 重复漏洞记录的技能,重点处理多个扫描器针对同一 CVE 和配置项上报的发现。它帮助漏洞管理团队减少记录噪声,同时保留风险背景和审计轨迹。
主要功能
- 01按 CVE 和配置项匹配发现
- 02比较不同扫描器的报告
- 03合并重复的修复任务
- 04按风险和业务重要性排序
- 05记录决策并生成暴露报告
适用场景
- 01扫描导入后去重记录
- 02新增扫描器时检查重叠项
- 03定期开展漏洞数据清理
- 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:扫描导入后去重
- Tenable 扫描导入 500 个新的易受攻击项目
- 运行重复项检测:其中 78 个与现有 Qualys 发现匹配(相同 CVE + CI)
- 抽查 10 个重复项,确认匹配准确
- 批量关闭 78 个重复项,保留 Qualys 记录(其
first_found更早) - 合并 23 个冗余修复任务
- 生成报告,显示实际新增发现:422 个(而非 500 个)
示例 2:季度漏洞卫生检查
- 查询所有未关闭的易受攻击项目:4,200 条记录
- 对 3 个扫描器来源执行全面的去重分析
- 识别出 1,100 个重复项(重复率为 26.2%)
- 找出 45 个 CVE,它们在同一资产上出现在所有 3 个扫描器中
- 关闭重复项、合并任务并更新主记录
- 生成按优先级排序的暴露清单:3,100 个独立漏洞
- 向 CISO 提交清理后的数据和准确的暴露指标
相关技能
secops/correlation-insights- 将去重后的漏洞与活跃安全事件关联起来secops/metrics-analysis- 跟踪去重率和漏洞暴露趋势secops/incident-summarization- 在事件摘要中引用去重后的漏洞数据secops/post-incident-analysis- 在 PIR 期间检查漏洞去重的有效性cmdb/data-quality- 确保 CI 记录准确,以便正确匹配漏洞