15 个月后 SBOM 将成为强制要求,而你的 SBOM 很可能是错的。
2027 年 12 月 11 日,《欧盟网络弹性法案》(EU Cyber Resilience Act)中的 SBOM 义务将开始生效。这意味着,如果你想在欧盟发行软件,很快就需要一份 SBOM。这不仅是欧盟的要求,更是一场以这种声明式方法强化供应链安全的全球性趋势:美国自 2021 年起就要求联邦软件供应商提供 SBOM,CISA/NSA/FBI 也在今年 7 月发布了更新版的 SBOM 最低要素。
把 SBOM 做对并不容易,而当你还需要为软件交付安装程序时,难度更会进一步加大。现在该怎么办?让我们一起来看一看。
SBOM 究竟是什么?
SBOM 是一份机器可读的清单,列出了某个软件由哪些组件构成。它有两种格式:CycloneDX,一个始于 2017 年、并于 2024 年成为 Ecma 标准的 OWASP 项目;以及来自 Linux 基金会的 SPDX,自 2021 年起已是 ISO 标准。监管机构对两者都予以认可。
SBOM 中主要包含三类信息:
- 以 Package URL 表示的组件标识,例如
pkg:maven/org.apache.commons/[email protected] - 哈希值和许可证
- 依赖图,展示哪个组件依赖于哪个组件
SBOM 无法靠手工合理编写,它是工具的输出产物。一个典型的 Spring Boot 应用已经会引入上百个传递依赖。你的构建工具已经掌握完整的传递依赖图,因此 SBOM 通常由插件生成。在 JVM 上,这主要是用于 Gradle 的 cyclonedx-gradle-plugin 和用于 Maven 的 cyclonedx-maven-plugin。
为什么是现在?
针对供应链的攻击正在不断增多。其中一些尤为恶劣的案例:2024 年 3 月 xz-utils 中的后门,这是一个几乎人人都会随软件分发的库;2025 年 9 月针对 npm 上 chalk/debug 维护者的钓鱼攻击;而仅仅一周之后,Shai-Hulud——首个自我复制的 npm 蠕虫——又跳到了 Maven Central 上。
Sonatype 仅在 2025 年一年间就记录了近 50 万个新的恶意软件包。LLM 日益增强的网络攻击能力将使形势进一步恶化,我们必须立即加强应对措施。
SBOM 并非灵丹妙药,但它能让你立即查清某个软件附带了哪些依赖,从而以最小的延迟应对外部威胁。
那么,为什么做好 SBOM 这么难?
生成 SBOM 的插件看到的是构建时的依赖图。然而,这通常并不是你实际交付的内容,而 SBOM 必须逐字节地描述你实际交付的内容。依赖解析之后发生的任何改变字节的转换,都会使这份 SBOM 失效。
这些改变字节的转换可能是什么呢?最简单的例子就是 fat JAR。当你把所有依赖打包进单个 JAR 之后,SBOM 为所有依赖提供的哈希值就全都错了。
但当你交付安装程序时,情况会更加棘手:Windows 上的 Authenticode 签名、macOS 上的 Mach-O 签名、JAR 的精简与打包,这些操作全都会改变哈希值。在“依赖解析时”生成的 SBOM 对于最终构建产物而言总是错误的。
更糟的是,还有一些由安装程序添加、而你可能完全不知道的隐形组件。例如,Windows 启动器中包含的原生 zlib 库,或安装程序运行时中的 shaded JAR,这些在你的 SBOM 中统统缺失。
zlib 这个例子绝非纸上谈兵,它来自我们自己的 install4j Windows 启动器。由于该库经过修改并被嵌入其中,因此不会以独立构件的形式分发 zlib。所以除了深入扫描之外,它实际上是不可见的,但它同样可能存在漏洞,并且必须包含在你的 SBOM 中。
“最后组装者”问题
对于以安装形式交付的软件而言,安装程序是把客户最终收到的东西组装起来的最后一个环节。如果 SBOM 是在该步骤之前编写、或者没有经过该步骤,它就无法描述这个产品,而你很可能已经违反了现行或即将生效的法规。
因此,“最后组装者”就是构建安装程序的工具,它需要能够对你的 SBOM 做些处理。它做不到的是自行生成 SBOM——只有掌握依赖图的构建工具才能做到这一点。它需要做的,是至少为自己的组件编写一份 SBOM。更好的做法是,它能够用自己的内容扩充现有的 SBOM,这样你就可以将 SBOM 放入安装程序内部交付。
install4j 中的 SBOM 功能
install4j 13.1 可以为每个媒体文件中附带的 install4j 运行时组件生成 JSON 和 XML 格式的 CycloneDX SBOM。这些文件既可以外置写入媒体文件旁边,路径为 <media file>.install4j_runtime.cdx.json / .xml,也可以嵌入到分发树中的某个路径。
如果嵌入路径处已经存在一份 SBOM(支持 CycloneDX 规范 1.2 至 1.7 版本),install4j 会把运行时组件及其依赖图合并进去,而不是将其替换。此外,install4j 会跟踪编译期间的每一次改变字节的转换(签名、精简和打包)并重写哈希值,从而使 SBOM 与最终签名的媒体文件保持一致。


当然,我们自己也在身体力行:install4j 在 lib/install4j.cdx.json 中包含了一份完整的 SBOM。如果分发内容中的任何一个 JAR 未被 SHA-256 哈希覆盖,install4j 的构建本身就会失败。
入门指南
SBOM 正在迅速成为一项必需的交付物。法规的脚步日益临近,把这件事做对的时间窗口十分紧迫。要做到正确无误,你需要能够代劳的工具。这其中也包括你的安装程序构建工具。
欢迎访问 https://www.ej-technologies.com/install4j/download 免费试用 install4j 90 天,无需注册。