Trivy 对 Echo Linux(滚动发布、apt/dpkg)的 OS 软件包扫描支持:SBOM、漏洞与许可证全面解析
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.go 的 IsSupportedVersion 方法无条件返回 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.go 的 case "echo" 分支),对应测试夹具 pkg/fanal/analyzer/os/release/testdata/echo 仅含两行内容:ID=echo 与 VERSION_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 通过
apt、dpkg记录识别“已由包管理器安装”的软件包,这与 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 → 包名(如 apache2、python3)→ CVE key → 元数据(FixedVersion、Severity 数值等)。
源码级检测流程
漏洞检测由 pkg/detector/ospkg/echo/echo.go 的 Detect 完成,其核心调用链可以归纳为:
- 按源码包名取通告:对每个已检出软件包,使用
pkg.SrcName(源码包名)向 trivy-db 的 Echo VulnSrc 查询advisories; - 拼接并解析版本:调用
utils.FormatSrcVersion(pkg)将“版本号 + release 号”拼成完整版本串,再交给go-deb-version解析。之所以采用 Debian 版本语义,是因为 Echo 采用 apt/dpkg 包格式——测试用例 “package with release” 展示了拼接效果:apache2 2.4.24、release2组合为安装版本2.4.24-2; - 逐条通告过滤:对每条 advisory,若带
FixedVersion且 已安装版本不小于修复版本(!installedVersion.LessThan(fixedVersion)),说明该漏洞已被修复,直接continue跳过;否则记录为一条漏洞; - 组装输出:将
VulnerabilityID、FixedVersion、Status、DataSource、Custom等从通告拷贝进DetectedVulnerability;若通告自带严重级别(非 Unknown),则将SeveritySource标记为Echo,即“严重级别以 Echo 官方通告为准”。
“Unfixed vulnerabilities = ✓” 的实证
结合 echo_test.go 与其 fixture,可以清楚看到“未修复漏洞”在代码中的具体含义:
- fixture 中
CVE-2021-11113(apache2)没有FixedVersion,测试期望结果里它依然被正常输出——即通告未提供修复版本时,漏洞不会被丢弃,这正是 “Unfixed vulnerabilities ✓” 的体现; - 作为反例,fixture 中
CVE-2021-11112的FixedVersion被写成"0",由于任何已安装版本都“不小于 0”,该条目在比较阶段被过滤,因此不出现在测试期望结果中; - 测试同时覆盖了“happy path - no matching packages”(查询不到通告时返回空)与“sad path - invalid”(数据库异常时报
failed to get echo advisories)等分支,均可在 pkg/detector/ospkg/echo/echo_test.go 的TestScanner_Detect表中查阅。
第三方包的特殊处理:为何 Echo 不丢弃任何包
这是 Echo 支持中“最不直观”也最值得注意的一点。常规规则下,Trivy 会跳过来自第三方仓库(如 EPEL、Remi、Docker、NVIDIA 等)的软件包,因为这些包不在官方 OS 安全通告覆盖范围内,强行比对会产生误报(参见 docs/guide/scanner/vulnerability.md 的 “Third-Party Packages” 一节)。
但 Echo 属于特例。同样在该节文档的 note 中明确写明:凡是自身通告会描述其重建(rebuild)软件包的发行版,如 Echo 与 RapidFort,即便软件包被归类为第三方仓库来源,依然会被扫描。
其实现证据就在 echo.go 的 FilterPackages 方法里——该方法原样返回传入的全部软件包,不做任何丢弃。源码注释解释了个中缘由:
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-plugin、gitlab-runner、gh),这些软件通常由厂商自有仓库安装,若按“仓库类别”一刀切过滤,就会漏掉通告实际覆盖的检测项。pkg/detector/ospkg/detect.go 的注释同样把 Echo、Seal、RapidFort 归为“实现 PackageFilter 以保留第三方包”的发行版。
配套的 TestScanner_FilterPackages(echo_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 行。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00