EveryInfra Blog · BL-15
漏洞情报怎么做成可执行产品:从告警列表到修复队列
漏洞情报 API 只能给出候选风险。本文讨论如何结合资产、依赖范围、可达性、在野利用与修复版本,把安全告警做成可关闭的工程任务。
把依赖清单提交给漏洞情报 API,获得一批 CVE 或安全公告,并不等于建立了漏洞管理产品。开发团队真正需要的是一条可执行队列:哪个服务受到影响,为什么现在处理,由谁修改,升级会破坏什么,怎样证明风险已经关闭。
Hacker News 关于“Turn Dependabot off”的讨论集中在告警噪声、调用可达性和安全任务转嫁给开发者等问题。评论不能代表行业共识,但它提醒产品设计者:如果每次扫描只增加红色数字,却不给出足以行动的上下文,用户迟早会忽略整个频道。
漏洞记录只是候选,资产上下文才决定任务
漏洞数据库描述某个包的某些版本受到影响。组织内部要回答的则是:这个版本是否真实存在于当前构建,部署在哪个环境,是否可被外部触达,脆弱功能是否进入执行路径,是否已有补丁或可行缓解措施。严重等级只是输入之一。
OSV API支持按包版本或 commit 查询,也提供批量查询和按 ID 读取漏洞记录。这适合把软件物料清单与公开漏洞记录连接起来,但查询结果不能单独证明生产暴露。锁文件、构建产物、容器镜像和运行实例之间可能已经漂移,扫描对象必须写清楚。
第一步应给每条候选建立资产关系:仓库、组件、解析到的版本、构建标识、部署环境和负责人。若只有仓库默认分支的依赖信息,就把结论限定为该分支;不要把它扩写成“生产系统存在漏洞”。如果无法确定部署状态,任务应是补齐资产证据,而不是虚构确定性。
多个情报源相遇时,先保留来源再做归并
OSV 的数据源说明列出了其覆盖的生态和上游数据库。一个漏洞可能由多个来源描述,也可能在后续被更正、撤回或补充影响范围。产品可以按别名与包坐标归并展示,但必须保留每个来源的 ID、更新时间、影响区间和原文链接。
多源出现不意味着可信度自动翻倍。几个网站可能转载同一份公告,多个数据库也可能沿用同一个上游记录。真正有用的交叉核对,是比较它们是否独立支持同一个关键字段:受影响版本、修复版本、利用前置条件或撤回状态。冲突字段要显式暴露,不能由模型静默选一个。
标准化对象可以包含以下部分:
- 漏洞主标识、别名、受影响包与版本区间。
- 来源记录、首次观察与最后核对时间、修订或撤回状态。
- 已知修复版本、厂商缓解措施及其适用条件。
- 组织内部命中的资产、环境、依赖关系与证据时间。
- 优先级信号、人工判断、负责人和处置状态。
这样,即使外部描述变化,团队也能知道旧判断基于什么,而不是只看到一条被覆盖后的当前记录。
优先级不是把 CVSS 从高到低排序
GitHub 的 Dependabot 文档说明其优先级会考虑 CVSS、依赖范围以及是否检测到脆弱函数调用等信号。这体现了一个重要方向:严重性、相关性和可行动性需要组合,而不是只展示一个分数。
CISA Known Exploited Vulnerabilities Catalog则用于标记已知在野利用的漏洞,并建议把它作为漏洞管理优先级框架的输入。命中 KEV 应提高关注度,但仍不能自动证明某个组织已遭攻击,也不能替代资产暴露判断。
一个可解释的优先级可以依次回答:
- 资产是否部署,处于生产、内部还是开发环境。
- 脆弱组件是直接依赖还是传递依赖,是否打进最终产物。
- 外部或低权限用户能否到达相关入口,脆弱代码是否可能执行。
- 是否存在已知在野利用、公开缓解措施与可用修复版本。
- 升级成本、兼容风险和业务窗口是什么。
产品不必把这些问题压成一个神秘的“AI 风险分”。显示证据和缺口往往更有用:例如“生产镜像已确认包含;外网暴露未确认;有修复版本;升级测试尚未开始”。负责人一眼就知道下一步要补哪项证据。
修复队列必须有关闭条件
很多安全看板只有 Open、Dismissed 和 Fixed 三个粗粒度状态,无法表达真实工程过程。更实用的队列可以包含:待确认资产、确认受影响、修复计划中、变更验证中、已缓解待升级、已关闭、误匹配和风险接受。每个状态都要有进入和退出条件。
“升级了版本”不一定等于关闭。验证至少要确认新的锁文件或构建产物不再命中受影响范围,相关测试通过,并且目标环境实际运行了新产物。若采用配置缓解措施,应记录来源、适用条件、有效期和最终升级负责人,防止临时方案永久化。
忽略告警也需要理由。测试夹具未进入产物、误识别包生态、仅存在于已下线分支,都可以是合理关闭原因;“目前没时间”不是同一种证据。产品要允许重新打开,因为资产和漏洞记录都可能变化。
站内的运行能力与文档漂移分析解释了声明、配置和实际运行不能混写;失败退款与对账指南虽然讨论的是计费,却提供了同样重要的事件账本思路:每次状态变化要能追溯原因、输入和后续动作。
告警应送到负责人的工作队列,而非所有人的收件箱
同一个漏洞可能命中几十个仓库,但真正的修复可能只需升级一个共享基础镜像,也可能每个服务都要单独验证。通知前先做归并:按共同根因建立主任务,再为受影响资产建立子项。否则重复消息会制造虚假的工作量。
发送内容应包含资产、版本、环境、优先级依据、修复或缓解入口、缺失证据和明确负责人。没有负责人时,系统应该暴露“无人接收”,而不是群发给整个工程组织。紧急频道只用于满足预先定义条件的事件,其余进入日常队列。
重新扫描失败也要单独提示。若情报源不可用或物料清单生成中断,绿色的“无新漏洞”会产生危险误导。参考站内的API 错误与自愈指南,扫描完成、部分完成和未运行必须是不同状态。
商业化可以围绕减少闭环成本,而不是出售更多告警
早期服务可以为一个工程团队接入有限数量的仓库和部署环境,人工参与误匹配清理、资产归属和升级验证。收费单位可以围绕受管理资产、工作流深度和响应协作设计,而不是按抓到多少条漏洞收费。告警越多不代表客户获得越多价值。
试点时记录从候选到确认的时间、无人负责比例、重复任务合并率、进入修复后的关闭时间、重新打开原因和过期风险接受项。不要只展示“发现漏洞数下降”,因为数字也可能因扫描失败、资产缺失或粗暴忽略而下降。
续费判断应回到工程结果:负责人是否更快理解风险,是否减少重复研究,修复是否留下可验证证据,覆盖中断是否被及时发现。本文讨论的是漏洞情报产品化方法,不代表 EveryInfra 已提供漏洞管理服务,也不构成针对具体系统的安全结论。
漏洞数据是公开信息层,真正的产品价值发生在组织内部:把外部记录和真实资产连接,把风险解释为可执行任务,再用构建、部署与运行证据关闭它。做不到这一点,最完整的漏洞库也只会生成更长的待办列表。