JFrog Xray SBOM为何出现容器未安装的多版本RPM包?
问题解答
一、SBOM出现未安装RPM版本的原因
- 镜像分层扫描的残留信息:Docker采用分层存储,你的构建过程(比如
microdnf update操作)会产生临时层,这些层中可能存在旧版本RPM的安装记录。Xray会扫描镜像的所有层,而非仅最终运行层,所以会把中间层的旧版本也纳入SBOM,而rpm -qa只读取最终层的当前安装状态。 - RPM数据库的历史记录:RPM的数据库(路径
/var/lib/rpm)默认会保留安装、更新的历史条目,哪怕旧版本已被替换。Xray扫描时直接读取这个数据库的完整内容,包括历史记录,而rpm -qa仅返回当前活跃的包版本。 - 依赖解析的范围扩展:Xray在解析包依赖时,会把满足依赖声明的所有兼容版本都列出。比如grafana.rpm可能声明依赖
audit-libs >= 3.0.7-2.el8.2,Xray就会把所有符合该条件的版本(3.0.7-2.el8.2、3.0.7-4.el8、3.0.7-5.el8)都加入SBOM,哪怕实际系统只安装了最新的那个版本。
二、Artifactory Xray构建SBOM的核心机制
- 分层遍历与提取:Xray会遍历Docker镜像的每一层文件系统,针对每层中的包管理器数据(如RPM的
/var/lib/rpm目录、DEB的/var/lib/dpkg目录)进行提取,汇总所有层的包信息。 - 包数据库深度解析:对于RPM,Xray直接解析RPM数据库的二进制文件,获取包的名称、版本、发布版、依赖关系等元数据,包括数据库中存储的历史操作记录(如果未被清理)。
- 依赖链递归展开:针对每个已提取的包,Xray会递归解析其依赖声明,将所有满足依赖条件的包版本纳入SBOM范围,而非仅实际安装的特定版本。
- 元数据整合与去重优化:最后将所有层的扫描结果、依赖解析结果进行整合,去除完全重复的条目,但保留不同版本的记录,最终生成包含完整包信息的SBOM。
内容的提问来源于stack exchange,提问作者Nick Yarn
相关产品推荐
相关产品推荐

