3. Trivy 基础扫描:镜像扫描基础命令、扫描结果解读、常见漏洞类型(CVE、CWE)
Trivy 是一款轻量级、高准确率的开源安全扫描器,被广泛用于容器镜像、文件系统、Git 仓库和 Kubernetes 的漏洞与配置扫描。本章聚焦于 Trivy 最核心的使用场景——容器镜像扫描,涵盖基础命令、输出结果的结构化解读以及漏洞分类体系(CVE / CWE)。
3.1 镜像扫描基础命令
Trivy 的镜像扫描命令格式统一,核心参数包括指定镜像名称、输出格式、严重级别过滤等。以下为最常用的命令组合:
# 扫描本地已拉取的镜像(默认输出表格)
trivy image nginx:1.25
# 扫描远程镜像仓库中的镜像(自动拉取)
trivy image docker.io/library/alpine:3.19
# 指定输出格式为 JSON(便于程序解析)
trivy image --format json --output result.json nginx:1.25
# 仅显示指定严重级别及以上的漏洞(CRITICAL, HIGH)
trivy image --severity CRITICAL,HIGH nginx:1.25
# 跳过漏洞数据库更新(使用本地缓存)
trivy image --skip-db-update nginx:1.25
# 扫描并忽略已修复的漏洞(仅显示未修复项)
trivy image --ignore-unfixed nginx:1.25
提示:首次运行 Trivy 时会自动下载漏洞数据库(约 500MB),后续扫描使用本地缓存。建议在 CI/CD 流水线中定期执行
trivy image --download-db-only 以保持数据库最新。
3.2 扫描结果解读
Trivy 默认输出表格格式,包含以下关键字段。理解每个字段的含义是进行安全决策的基础。
| 字段 | 说明 | 示例值 |
|---|---|---|
| Library | 受影响的软件包名称及版本 | openssl 3.0.8-r4 |
| Vulnerability ID | CVE 编号,唯一标识漏洞 | CVE-2023-3817 |
| Severity | 严重级别:CRITICAL / HIGH / MEDIUM / LOW / UNKNOWN | HIGH |
| Installed Version | 镜像中当前安装的版本 | 3.0.8-r4 |
| Fixed Version | 修复该漏洞的版本(若为空则表示暂无修复) | 3.0.8-r5 |
| Title | 漏洞的简短描述 | openssl: denial of service via ... |
以下为实际扫描输出的示例片段:
+-------------------+------------------+----------+-------------------+--------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+-------------------+------------------+----------+-------------------+--------------+---------------------------------------+
| openssl | CVE-2023-3817 | HIGH | 3.0.8-r4 | 3.0.8-r5 | openssl: denial of service via ... |
| libcrypto3 | CVE-2023-4807 | MEDIUM | 3.0.8-r4 | 3.0.8-r5 | openssl: POLY1305 MAC ... |
| zlib | CVE-2023-45871 | CRITICAL | 1.2.13-r1 | 1.2.13-r2 | zlib: integer overflow ... |
+-------------------+------------------+----------+-------------------+--------------+---------------------------------------+
关键解读要点:
- Fixed Version 为空时,表示该漏洞尚无官方补丁,需通过临时缓解措施(如限制网络访问、移除高危功能)降低风险。
- Severity 基于 CVSS 评分,但 Trivy 会结合漏洞利用成熟度(EPSS)进行微调。
- 同一 CVE 可能影响多个 Library(如 openssl 和 libcrypto3),需逐一确认修复版本。
3.3 常见漏洞类型:CVE 与 CWE
Trivy 扫描结果中主要涉及两类标识:CVE(Common Vulnerabilities and Exposures) 和 CWE(Common Weakness Enumeration)。两者在安全体系中扮演不同角色。
| 维度 | CVE | CWE |
|---|---|---|
| 定义 | 具体漏洞实例的唯一编号 | 漏洞类型的分类编号 |
| 粒度 | 细粒度,对应一个具体的软件缺陷 | 粗粒度,对应一类缺陷模式 |
| 示例 | CVE-2023-3817(openssl 拒绝服务) | CWE-400(资源耗尽) |
| 用途 | 追踪、修复、通报具体漏洞 | 分类、统计、培训、安全设计 |
| Trivy 输出 | 直接显示在 Vulnerability ID 列 | 在 JSON 输出的 cwe_ids 字段中 |
在 Trivy 的 JSON 输出中,CWE 信息位于每个漏洞对象的 cwe_ids 数组中:
{
"VulnerabilityID": "CVE-2023-3817",
"PkgName": "openssl",
"Severity": "HIGH",
"CweIDs": ["CWE-400"],
"Title": "openssl: denial of service via ..."
}
注意:并非所有 CVE 都关联了 CWE。Trivy 从 NVD 数据源获取 CWE 映射,部分历史漏洞或低质量数据可能缺失 CWE 信息。在安全审计报告中,建议同时标注 CVE 和 CWE 以提供完整上下文。
3.4 镜像扫描流程与数据流
下图展示了 Trivy 镜像扫描的完整数据流,从镜像层解析到漏洞匹配的全过程:
3.5 常见 CWE 类型与对应缓解措施
在 Trivy 扫描结果中,以下 CWE 类型出现频率最高,了解它们有助于制定针对性的修复策略:
| CWE 编号 | 类型名称 | 典型场景 | 缓解措施 |
|---|---|---|---|
| CWE-400 | 资源耗尽 | openssl 拒绝服务、zlib 内存耗尽 | 升级到修复版本;限制并发连接数 |
| CWE-787 | 越界写入 | libcurl 缓冲区溢出 | 升级到修复版本;启用地址空间布局随机化(ASLR) |
| CWE-79 | 跨站脚本(XSS) | 前端依赖库中的反射型 XSS | 升级前端库;实施内容安全策略(CSP) |
| CWE-20 | 输入验证不当 | XML 解析器外部实体注入 | 禁用外部实体解析;升级解析库 |
| CWE-200 | 信息泄露 | 日志中暴露敏感路径或版本号 | 配置日志脱敏;移除调试信息 |
实践建议:在 CI/CD 流水线中,建议将 Trivy 扫描结果中的 CWE 分布作为安全质量门禁的辅助指标。例如,若某次构建新增了 CWE-787(越界写入)类漏洞,应视为高风险并阻止合并,因为此类漏洞通常可被利用实现远程代码执行。
3.6 扫描结果优先级排序
面对大量漏洞时,建议按以下优先级顺序处理:
- CRITICAL 级别 + 有修复版本:立即升级,阻断最高风险。
- CRITICAL 级别 + 无修复版本:评估缓解措施(如网络隔离、功能禁用),并持续监控。
- HIGH 级别 + 有修复版本:纳入当前迭代修复计划。
- HIGH 级别 + 无修复版本:记录风险,定期复查。
- MEDIUM / LOW 级别:根据业务影响决定是否修复,或纳入定期维护窗口。
注意:切勿仅根据严重级别排序。部分 MEDIUM 级别的漏洞(如 CWE-200 信息泄露)在特定业务场景下可能造成严重合规风险。建议结合 CVSS 向量、EPSS 利用概率和业务上下文综合判断。