首页
/ Trivy 对 Echo Linux(滚动发布、apt/dpkg)的 OS 软件包扫描支持:SBOM、漏洞与许可证全面解析

Trivy 对 Echo Linux(滚动发布、apt/dpkg)的 OS 软件包扫描支持:SBOM、漏洞与许可证全面解析

2026-09-08 11:51:11作者:盛欣凯Ernestine

Echo 是一款基于 apt/dpkg 生态、采用滚动发布(rolling release)模式的操作系统发行版,其 OS 级软件包会被 Trivy 以三类扫描器覆盖:SBOM、Vulnerability 与 License。本文以 docs/guide/coverage/os/echo.md 为骨架,结合 pkg/detector/ospkg/echo/echo.go 及其单测,深入讲解 Echo 的漏洞数据源与比对机制、第三方软件包的特殊处理策略、以及与 Debian 完全一致的 SBOM/License 识别行为,帮助你在容器镜像或文件系统扫描中正确理解 Echo 场景下的扫描结果边界。

Trivy 眼中的 Echo:一个“无版本号”的 apt/dpkg 滚动发行版

在 Trivy 的 OS 覆盖清单中,Echo 被登记为一种可被 OS 包检测与漏洞扫描的发行版。docs/guide/coverage/os/index.md 的 “Supported OS” 表给出了它的三个关键属性:

OS Supported Versions Package Managers
Echo (n/a) apt/dpkg

其中 Supported Versions 为 (n/a) 正是“滚动发布”的体现:Echo 不维护带编号的版本发行线,因此 Trivy 无需按版本号判断“该 OS 是否仍在支持期”。这一设计直接映射到实现中:echo.goIsSupportedVersion 方法无条件返回 true,源码注释也写得非常直白——“Echo is a rolling distro, meaning there are no versions, and therefor no need to check the version”(pkg/detector/ospkg/echo/echo.go)。

OS 识别侧,Trivy 通过解析目标镜像/文件系统中的 /etc/os-release 来完成发行版判定。OS release 分析器在 ID=echo 时将其映射为 OSType("echo")(见 pkg/fanal/analyzer/os/release/release.gocase "echo" 分支),对应测试夹具 pkg/fanal/analyzer/os/release/testdata/echo 仅含两行内容:ID=echoVERSION_ID=1。而 echo 作为一等 OSType 常量定义于 pkg/fanal/types/const.go,并被纳入全局 OSTypes 列表。

支持能力总览:扫描器与功能矩阵

原文档给出了两张能力矩阵。第一张说明 Trivy 为 Echo 的 OS 软件包启用的扫描器

Scanner Supported
SBOM
Vulnerability
License

第二张矩阵则罗列了 Trivy 在 Echo 上提供的功能特性

Feature Supported
Unfixed vulnerabilities
Dependency graph
End of life awareness -

逐项解读这些术语,有助于准确理解表格含义:

  • Unfixed vulnerabilities(未修复漏洞):指“尚无修复版本(fixed version)可用”的 CVE 仍然会被正常上报,而不会被静默丢弃。这一行为下文会结合源码与测试数据给出实证。
  • Dependency graph(依赖图):允许在报告中展示漏洞与“其来源依赖包”的溯源关系,与 OS 包是否由 Echo 官方通告覆盖无关。详细机制参见 docs/guide/configuration/reporting.md#show-origins-of-vulnerable-dependencies
  • End of life awareness(EOL 感知):表格中为 “-”,即 Echo 不支持 EOL 提醒——这与 Debian 列(标记 ✓)形成对照。结合 Echo 滚动发布、没有固定 EOL 时间点的性质,可以推断该特性对它并不适用。

SBOM:与 Debian 相同的 OS 包识别逻辑

原文档直接声明“Same as Debian”(与 Debian 相同),因此 Echo 的 SBOM 行为以 docs/guide/coverage/os/debian.md#sbom 为准:

  • Trivy 通过 aptdpkg 记录识别“已由包管理器安装”的软件包,这与 Echo 使用 apt/dpkg 的包管理方式完全吻合;
  • 存在例外情形:Go 二进制、JAR 等通过非包管理器方式分发的文件通常不会被当作 OS 包检出;
  • make 自编译、或通过 curl 等工具直接安装的程序,一般也不在检测范围内。

因此,对 Echo 类镜像做 SBOM 导出(例如 trivy image --format cyclonedx--format spdx)时,结果中 OS 包部分来自 dpkg 数据库,与 Debian/Ubuntu 的探测口径一致。

Vulnerability:依赖 Echo 自有安全通告进行检测

与 Debian、Ubuntu 依赖各自发行方通告不同,Echo 场景下 Trivy 使用 Echo 官方自己发布的安全通告(Echo offers its own security advisories)来判定漏洞,而非上游 Debian Security Tracker。

Data Source(数据源)

文档将数据源细节统一指引到 docs/guide/scanner/vulnerability.md#data-sources,其中 OS 包数据源表中登记了 Echo 一行。仓库测试夹具进一步印证了该数据源在结果中的呈现方式:pkg/detector/ospkg/echo/echo_test.go 期望输出中每条漏洞都携带如下 DataSource 元数据:

字段
DataSource.ID echo
DataSource.Name Echo
DataSource.URL Echo 官方通告 JSON feed(记录于 fixture,即原文档链接所指的 advisory.echohq.com/data.json

该通告数据经 trivy-db 加工后以 bucket: echo 的结构存储,单元测试使用的 YAML 夹具 pkg/detector/ospkg/echo/testdata/fixtures/echo.yaml 展示了它的层级:echo bucket → 包名(如 apache2python3)→ CVE key → 元数据(FixedVersionSeverity 数值等)。

源码级检测流程

漏洞检测由 pkg/detector/ospkg/echo/echo.goDetect 完成,其核心调用链可以归纳为:

  1. 按源码包名取通告:对每个已检出软件包,使用 pkg.SrcName(源码包名)向 trivy-db 的 Echo VulnSrc 查询 advisories
  2. 拼接并解析版本:调用 utils.FormatSrcVersion(pkg) 将“版本号 + release 号”拼成完整版本串,再交给 go-deb-version 解析。之所以采用 Debian 版本语义,是因为 Echo 采用 apt/dpkg 包格式——测试用例 “package with release” 展示了拼接效果:apache2 2.4.24、release 2 组合为安装版本 2.4.24-2
  3. 逐条通告过滤:对每条 advisory,若带 FixedVersion已安装版本不小于修复版本!installedVersion.LessThan(fixedVersion)),说明该漏洞已被修复,直接 continue 跳过;否则记录为一条漏洞;
  4. 组装输出:将 VulnerabilityIDFixedVersionStatusDataSourceCustom 等从通告拷贝进 DetectedVulnerability;若通告自带严重级别(非 Unknown),则将 SeveritySource 标记为 Echo,即“严重级别以 Echo 官方通告为准”。

“Unfixed vulnerabilities = ✓” 的实证

结合 echo_test.go 与其 fixture,可以清楚看到“未修复漏洞”在代码中的具体含义:

  • fixture 中 CVE-2021-11113(apache2)没有 FixedVersion,测试期望结果里它依然被正常输出——即通告未提供修复版本时,漏洞不会被丢弃,这正是 “Unfixed vulnerabilities ✓” 的体现;
  • 作为反例,fixture 中 CVE-2021-11112FixedVersion 被写成 "0",由于任何已安装版本都“不小于 0”,该条目在比较阶段被过滤,因此不出现在测试期望结果中;
  • 测试同时覆盖了“happy path - no matching packages”(查询不到通告时返回空)与“sad path - invalid”(数据库异常时报 failed to get echo advisories)等分支,均可在 pkg/detector/ospkg/echo/echo_test.goTestScanner_Detect 表中查阅。

第三方包的特殊处理:为何 Echo 不丢弃任何包

这是 Echo 支持中“最不直观”也最值得注意的一点。常规规则下,Trivy 会跳过来自第三方仓库(如 EPEL、Remi、Docker、NVIDIA 等)的软件包,因为这些包不在官方 OS 安全通告覆盖范围内,强行比对会产生误报(参见 docs/guide/scanner/vulnerability.md 的 “Third-Party Packages” 一节)。

但 Echo 属于特例。同样在该节文档的 note 中明确写明:凡是自身通告会描述其重建(rebuild)软件包的发行版,如 Echo 与 RapidFort,即便软件包被归类为第三方仓库来源,依然会被扫描

其实现证据就在 echo.goFilterPackages 方法里——该方法原样返回传入的全部软件包,不做任何丢弃。源码注释解释了个中缘由:

Echo builds and patches software Debian does not ship at all, such as docker-compose-plugin, gitlab-runner and gh. Dropping packages by repository class here risks losing detections the feed does cover.

即:Echo 会构建并修复 Debian 根本不分发的软件(如 docker-compose-plugingitlab-runnergh),这些软件通常由厂商自有仓库安装,若按“仓库类别”一刀切过滤,就会漏掉通告实际覆盖的检测项。pkg/detector/ospkg/detect.go 的注释同样把 Echo、Seal、RapidFort 归为“实现 PackageFilter 以保留第三方包”的发行版。

配套的 TestScanner_FilterPackagesecho_test.go)通过三个用例锁定该行为:第三方仓库包被保留、官方仓库包被保留、混合输入下“没有任何包被丢弃”。

版本无关性的工程实现

由于 Echo 是滚动发行版,检测器不再校验“Echo 的某个具体版本是否仍受支持”,IsSupportedVersion 无条件返回 true。这与驱动注册逻辑相互印证:在 pkg/detector/ospkg/detect.go 的 OS 驱动表中,ftypes.Echo 映射到 echo.NewScanner(),一旦目标被识别为 Echo,漏洞检测即由该 Scanner 全权负责,不会再因版本问题退避。

License:与 Debian 相同的 copyright 文件识别法

Echo 页面对 License 扫描同样采用 “Same as Debian” 的写法,具体语义继承自 docs/guide/coverage/os/debian.md#license

  • Trivy 通过检查包内的 /usr/share/doc/*/copyright 文件来识别许可证;
  • 该文件并非机器可读格式,因此存在“识别不出许可证”的局限;
  • 当出现识别失败时,可传入 --license-full 标志:它会将已知许可证的内容与 copyright 文件逐字比对来推断许可证。需要注意,该标志会显著增加内存占用,因此默认处于关闭状态

对 Echo 而言,这套机制同样适用——由于 OS 包同样由 apt/dpkg 管理,/usr/share/doc/ 下的版权文件布局与 Debian 一致。许可证扫描的通用能力与完整文本扫描模式还可进一步参考 docs/guide/scanner/license.md

小结:阅读与使用 Echo 覆盖页的实用要点

  • 覆盖语义:Echo 的 OS 包覆盖被定位为“与 Debian 相同 + 独有通告”,因此理解 Debian 页面的 SBOM/License 细节是读懂 Echo 页面的前提;
  • 漏洞口径:漏洞结果完全来自 Echo 自有通告(独立于 Debian Security Tracker),修复版本号遵循 Debian 版本语法(如 2.4.24-2),严重级别优先采用 Echo 通告值;
  • 不丢第三方包:在 Echo 镜像中,即使软件来自厂商自有仓库(docker-compose-plugin 等),也会被扫描,这与 Debian/Ubuntu 的默认过滤策略不同,解读结果时切勿套用“第三方包必被跳过”的惯性思维;
  • EOL 提醒不可用:Echo 不支持 EOL awareness 特性,报告中不应期待出现发行版 EOL 相关提示;
  • 滚动发布无需版本校验IsSupportedVersion 恒真,意味着 Echo 镜像不存在“版本过旧被跳过检测”的情形。

如需在真实场景中验证以上行为,可分别阅读仓库中的实现与测试:echo.go(检测逻辑)、echo_test.go(行为契约)、fixtures/echo.yaml(通告数据样例),以及覆盖索引页 docs/guide/coverage/os/index.md 中的 Echo 行。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
898
5.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
921
1.84 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.8 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
531
596
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.02 K
519
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.36 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
391