漏洞优先级排序是一个关键阶段,在此阶段,将评估漏洞的相对风险和修复顺序,并按优先级从高到低进行排序。 在我之前的文章中,我讨论了 。在本文中,我将指导您了解我评估修复优先级的自定义方法,并演示如何将此功能集成到 Budibase 平台中。 如何使用 Budibase 管理安全漏洞 修复过程中经常会出现几个挑战: 不同资产存在大量且风险级别各异的漏洞。 渗透测试经常表明,仅仅依靠 CVSS 风险评分来确定优先级并不总是有效的。 由于应用程序开发流程设计不良,或者在某些情况下缺乏供应商支持,某些漏洞无法快速修复。 理论和优先级指标 扫描漏洞后,必须分析结果并设定修复优先级。定期应用补丁可以以最小的努力解决大多数漏洞。 然而,在某些情况下,有必要仔细检查特定漏洞并评估相关风险。如果无法立即修复,请考虑实施补偿控制措施。例如,如果您发现 Web 应用程序中存在无法快速修补的 SQL 注入漏洞,则可以使用 Web 应用程序防火墙 (WAF) 作为补偿控制措施,并针对该漏洞设置相应的签名。 为了评估目的,我在 Budibase 中创建了一个界面,允许我定量评估优先级漏洞并以 .csv 格式导出列表供我们的同事使用。 我将概述构建过滤器的主要指标: :漏洞未修复的时间越长,未来再次出现漏洞利用的可能性就越大。然而,随着时间的推移,通常会有更多补偿控制措施和补丁可用。相反,如果漏洞是最近才披露的,那么指望您的团队立即修复是不现实的。因此,我添加了一个过滤器,用于排除漏洞存在时间少于 X 天的漏洞。 漏洞披露以来的时间 :此指标评估资产在受到损害时的重要性。 资产关键性 :此因素有助于确定资产在不受控制的网络段中的暴露程度,以及根据其位置适用哪些补偿控制措施。我将此指标与关键性相结合;位于边界的资产被标记为高优先级。 资产位置 :这表示漏洞当前是否正在被利用。如果供应商或威胁情报提供商提供了趋势评分,则可以在过滤器中使用此参数。 漏洞趋势 :这源自 CVSS 指标,例如本地与远程可利用性。 漏洞向量 :这表明该漏洞是否已经存在可用的漏洞利用。 漏洞利用可用性 :这反映了根据标准 CVSS 指标的基本严重性等级。 CVSS 严重性 :这表明是否存在供应商修复或更新来修复漏洞。 补丁可用性 这些指标共同帮助根据漏洞的潜在影响和响应策略的效率确定漏洞的优先顺序。 在 Budibase 中实现优先级过滤器 此实施的主要目标是确保每当任何筛选参数发生更改时,仪表板和相关数据都会自动更新。这使得负责修补的同事能够导出最相关的结果。 在 Budibase 中,过滤是通过 UI 过滤器元素完成的。所选值将作为变量通过绑定传递给 SQL 查询。这些变量在图表元素的设置中配置。绑定显示在下图中央,如示例所示。 在 SQL 查询中,使用双花括号 {{ var }} 在适当的位置插入变量。这确保了 SQL 查询功能的完整。 SQL 查询是在数据库连接部分下的数据选项卡中创建的。 您还可以在此处定义 SQL 查询的绑定并在过滤器为空或未选择任何内容的情况下设置默认值。 用于创建仪表板的优先级 SQL 查询示例 以下是可用于创建仪表板的几个 SQL 查询示例,每个示例都具有优先级过滤器。 仪表板 1:十大最脆弱资产 SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; 仪表板 2:十大易受攻击的服务 SELECT COUNT(hostname) AS total, hostname FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY hostname ORDER BY total DESC LIMIT 10; SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; 仪表板 3:排名前 10 的活跃 CVE SELECT COUNT(hostname) AS total, VulnerableEntity || ' ' || VulnerableEntityVersion AS VulnerableObject FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND VulnerableEntity IS NOT NULL AND status = 'new' AND VulnerabilityIssueTime < CURRENT_DATE - {{days}}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY VulnerableObject ORDER BY total DESC LIMIT 10; 这一切的成果 SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; SELECT COUNT(DISTINCT hostname) AS total, cve FROM mat_allassets WHERE osname ILIKE '%windows 20%' AND status = 'new' AND cve IS NOT NULL AND VulnerabilityIssueTime < CURRENT_DATE - {{ days }}::interval AND ( CASE WHEN {{ sev }}::text IS NULL THEN TRUE ELSE severity = {{ sev }}::text END ) AND ( CASE WHEN {{expltbl}}::bool IS NULL THEN TRUE ELSE metrics ILIKE 'Exploitable: {{expltbl}}%'::text END ) AND ( CASE WHEN {{netvector}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasNetworkAttackVector: {{netvector}}%'::text END ) AND ( CASE WHEN {{remedy}}::bool IS NULL THEN TRUE ELSE metrics ILIKE '%HasFix: {{remedy}}%'::text END ) AND ( CASE WHEN {{vulntrend}}::bool IS NULL THEN TRUE ELSE VulnerIsTrend = '{{vulntrend}}'::text END ) AND ( CASE WHEN {{hostimport}}::text IS NULL THEN TRUE ELSE HostImportance = '{{hostimport}}'::text END ) GROUP BY cve ORDER BY total DESC LIMIT 10; 最终,此设置成为一种简单而有效的工具,可根据最严重的漏洞突出显示最有问题的资产和服务。它还允许根据需要轻松导出这些信息。 没有预算购买昂贵的漏洞管理 (VM) 平台并不意味着您无法有效地确定漏洞的优先级。许多商业 VM 解决方案可能缺乏特定基础架构所需的优先级灵活性。 要点: 在下一篇文章中,我将探讨 ,演示如何在 Budibase 中实现它,并添加导出优先漏洞列表的功能。 漏洞预测评分系统 (EPSS) 我很乐意听取您的意见: 您在工作中使用漏洞优先级排序吗? 您如何追踪关键资产?