痛点引入:回看 Log4j 那漫长的 72 小时
2021 年 12 月,Log4Shell 爆发的那天晚上,全球安全圈几乎所有人都在做同一件事——翻箱倒柜。
当时最让人绝望的不是漏洞本身有多难修,而是各家老板都在问的同一句话:“我们到底用没用 Log4j?都在哪儿用到了?”
接下来的 72 小时,无数安全团队在成百上千个代码仓库、CI 构建产物和生产环境镜像里像无头苍蝇一样肉搏。后来一位安全团队负责人跟我复盘时说了一句大实话:“那一刻我才彻底脱掉底裤,原来我们根本不知道自己系统里每天跑的究竟是什么。”
这真不是个例。现代软件里 80% 以上的代码其实都来自第三方开源组件。你以为自己只写了几行业务逻辑,其实背后已经悄悄站了成百上千个你甚至没听过名字的传递依赖。
这就是为什么这几年 SBOM(软件物料清单) 会从一个冷门概念直接变成硬性合规要求。
简单来说,SBOM 就是软件的“成分表”。如果当年大家手头都有一份机器可读的 SBOM,安全团队只需要执行一行查询命令,几秒钟就能精准定位所有受影响的资产。
落地底层:别把标准读死,抓核心要素
很多人觉得 SBOM 标准复杂,其实拆解到工程落地层面,一份及格的清单无非解决三个核心问题:是什么、谁引入的、有没有法律风险。
在实际选型中,你不可避免地会遇到三大主流格式:
SPDX(Linux 基金会主导): 属于 ISO 国际标准,法务和合规团队最喜欢它,因为对许可证(License)的法律界定极其严谨。如果你要做客户交付或面临严格的合规审计,选它。
CycloneDX(OWASP 基金会维护): 专为现代 DevSecOps 自动化设计的轻量级标准。它的设计逻辑就是为了配合 CI/CD 流水线,安全上下文极强,也是目前技术团队最愿意用的格式。
SWID(ISO 标准): 偏向传统 IT 资产管理(ITAM),负责已安装软件的发现,在云原生和现代供应链里存在感正在变弱。
在这里多说一个在工程自动化时常踩的坑:组件的唯一标识符。很多人分不清 CPE 和 PURL。
简单来说,CPE 属于老牌标准(MITRE 维护),结构长得像 cpe:2.3:a:apache:log4j...,它跟 NVD 漏洞库匹配得很好,对操作系统和硬件支持极佳;而 PURL(包 URL)则是现代包管理器的亲儿子,长得像 pkg:npm/lodash@4.17.21,无歧义且自动化极度友好。
落地大原则:应用层的开源组件优先用 PURL 标识,底层的操作系统和硬件资产用 CPE 互补。
降噪关键:没有 VEX 的 SBOM 只是半成品
在工业级实战中,只生成 SBOM 是不够的,甚至可以说是灾难——因为扫描器会报出一万个漏洞,直接把业务研发搞崩溃。
这时候必须引入 VEX(漏洞可利用性交换)。
如果 SBOM 是体检报告,VEX 就是医生的确诊签字。它用结构化的语言回答了一个关键痛点:“扫描器虽然报了某个组件有已知漏洞,但在我们特有的运行上下文里,这个漏洞到底能不能被触发?”
通过 VEX,你可以明确声明某个 CVE 在你这里是“不受影响”或“已缓解”的,直接让自动化工具在流水线里放行,避免无效告警阻塞上线。
实战演练:开源“三剑客”与 CI/CD 集成
2026 年的今天,SBOM 工具生态已经大浪淘沙,基本形成了开源三剑客的局面:
Syft (Anchore): 顶级“盘点员”。它不查漏洞,专精于把容器镜像、文件系统里的深度依赖解析出来,生成的清单最干净。
Trivy (Aqua Security): 全能“安全官”。它不仅能查漏洞,还能直接消费 SBOM。最强的一点在于它对 Ubuntu 等发行版有专门的 OVAL 数据支持,能自动过滤掉发行版已经默默修复过的内核漏洞。
cdxgen (OWASP): 官方的多语言分析利器,如果你的项目里大量充斥着 Java、Node 等多语言传递依赖,用它解析最深、最准。
工业级流水线标配实践
一个标准且不污染环境的 CI/CD 集成通常只需要三步:
Bash
# 1. 用 Syft 精准盘点镜像,生成 CycloneDX 格式的 SBOM syft my-app:latest -o cyclonedx-json > sbom.json# 2. 让 Trivy 去读这份清单,跟漏洞库匹配(不重复扫描镜像本身,效率极高)trivy sbom sbom.json# 3. 使用 cosign 对 SBOM 进行签名发布,防止供应链上游被篡改cosign sign --key cosign.key sbom.json真实痛点:手动打补丁怎么降噪?
开发经常遇到这种情况:“我手动 cherry-pick 修复了代码,但版本号没变,扫描器天天卡流水线,烦死了。”
正解就是通过 VEX 文件进行手动降噪。你可以写一个简单的 my_patches.vex.json,把该漏洞标记为 not_affected,原因写上 code_not_present 或组件已被修复:
Bash
# 在流水线中带上 VEX 声明,自动勾掉那些已被肉眼核实或手动修复的告警trivy image --vex ./my_patches.vex.json my-app:latest合规大势:国内标准动真格了,全面进入倒计时
软件供应链安全早已不是“锦上添花”的技术情怀,而是实打实的监管高压。
在国际上,美国 EO 14028 行政令和 NIST SP 800-218 早把 SBOM 变成了入场券。而在国内,标准化进程也正式完成了从“行业共识”向“国家标准”的跨越:
GB/T 47020—2026《网络安全技术 软件物料清单数据格式》 预计将于 2026 年 8 月 1 日正式实施。同时,工信安全中心牵头起草的《软件物料清单构成和要求》也给出了非常具体的工程指导。
中国标准的核心特点很明确:兼容并包,强化追溯。它在字段上充分参考了 SPDX 和 CycloneDX 等主流格式,同时对自主可控、供应链路径的可追溯性提出了更接地气的要求。目前,金融、电信、能源等关键信息基础设施行业已经率先开始强制落地。
写在最后:这是一套企业级安全策略
如果这篇文章你只能记住一句话,请记住:SBOM 不仅仅是一份资产文档,它是一套软件治理的安全策略。
它重构的是企业四种核心能力:
漏洞响应速度: 发生未知漏洞时,从“手忙脚乱 72 小时”变成“数据库秒级搜索”。
开源合规控制: 提早拦截 GPL 等传染性许可证的法律违规使用。
供应链透明度: 向上游证明你交付的软件是“清洁且可追溯”的。
合规准入: 无论是出海还是做国内头部网安项目,这都是硬门槛。
给国内技术团队聊点务实的建议:
短期内: 参考工信安全中心的指南,把标准摸透。
中长期: 研发流程必须对照 GB/T 47020—2026 进行合规性改造。
至于今天: 马上在你的 CI/CD 流水线里把 Syft + Trivy 跑起来,先生成第一个 SBOM。
在 DevSecOps 时代,没有 SBOM 的软件就像没有配方表的食品,裸奔的代价越来越大。今天开始做,永远比明天安全。
夜雨聆风