在日常容器安全运维中,漏洞扫描是不可或缺的一环。本文记录了一次在 麒麟 V10 系统上使用 Trivy 扫描 镜像的完整过程,包括工具安装、网络问题解决、常见报错处理以及最终漏洞分析与修复建议。

1. 环境准备:麒麟系统安装 Trivy

麒麟系统通常分为基于 Debian/Ubuntu 或基于 CentOS 两类。我们使用的环境为 Kylin Linux Advanced Server(yum 系),采用二进制包安装:

bash

# 下载最新版 Trivy 二进制包(以 amd64 为例)
wget https://github.com/aquasecurity/trivy/releases/download/v0.69.2/trivy_0.69.2_Linux-64bit.tar.gz
tar -xzf trivy_0.69.2_Linux-64bit.tar.gz
sudo mv trivy /usr/local/bin/
trivy --version

若系统支持 apt,可添加官方仓库安装;离线环境推荐二进制方式。

2. 首次扫描:数据库下载超时

执行基础扫描命令:

bash

trivy image tomcat:9.0.110-jdk11

出现典型错误:

text

FATAL failed to download vulnerability DB: OCI artifact error: 
Get "https://mirror.gcr.io/v2/": dial tcp 173.194.202.82:443: connect: connection timed out

原因:默认数据库源 mirror.gcr.io 在国内访问不稳定。解决方案:改用国内镜像源。

3. 使用国内镜像源下载数据库

Trivy 支持通过参数指定漏洞库和 Java 库的镜像地址:

bash

trivy image \
  --db-repository ghcr.nju.edu.cn/aquasecurity/trivy-db:2 \
  --java-db-repository ghcr.nju.edu.cn/aquasecurity/trivy-java-db:1 \
  tomcat:9.0.110-jdk11

南京大学 GHCR 镜像源速度较快,成功下载了约 90 MB 的漏洞库和 840 MB 的 Java 库。

4. 遇到的两个常见报错及解决方法

4.1 缓存锁错误

text

FATAL run error: ... cache may be in use by another process: timeout

原因:同时运行了多个 Trivy 进程,或上次扫描未正常释放锁。
解决:使用 --cache-backend memory 临时避开文件锁,或手动删除缓存锁文件 rm -rf ~/.cache/trivy/*.lock

我们采用内存缓存模式:

bash

trivy image ... --cache-backend memory

4.2 扫描超时

text

FATAL ... context deadline exceeded

原因:Tomcat 镜像较大(含完整 JDK),默认超时(约 5 分钟)不足。
解决:增加超时时间至 30 分钟或更长。

最终完整可用的扫描命令:

bash

trivy image \
  --db-repository ghcr.nju.edu.cn/aquasecurity/trivy-db:2 \
  --java-db-repository ghcr.nju.edu.cn/aquasecurity/trivy-java-db:1 \
  --cache-backend memory \
  --timeout 30m \
  tomcat:9.0.110-jdk11

5. 扫描结果解读

扫描完成后,Trivy 输出了汇总表和详细漏洞列表。

5.1 总览

目标类型漏洞数
tomcat:9.0.110-jdk11 (Ubuntu 24.04)操作系统86
各类 Tomcat JAR 包Java 依赖3
  • 系统漏洞:LOW 36 / MEDIUM 41 / HIGH 9 / CRITICAL 0

  • Java 漏洞:LOW 1 / MEDIUM 1 / HIGH 1

5.2 高危漏洞(需优先修复)

Java 组件
组件CVE严重度当前版本修复版本
tomcat-coyote.jarCVE-2026-24734HIGH9.0.1109.0.115

说明:该漏洞与 OCSP 证书撤销检查绕过有关,可被中间人攻击利用。建议立即升级 Tomcat 至 9.0.115+。

系统包
软件包CVE严重度修复版本
dirmngr / gnupgCVE-2025-68973HIGH2.4.4-2ubuntu17.4

其他中风险漏洞涉及 curlopenssllibsshlibpng 等,均可通过系统包更新修复。

5.3 暂无补丁的漏洞

  • libexpat1 CVE-2025-66382(MEDIUM,仍为 affected)

  • tar CVE-2025-45582(MEDIUM)

  • wget CVE-2021-31879(MEDIUM,很老的漏洞)

对于此类漏洞,需关注官方更新或考虑移除不必要的组件。

6. 漏洞修复建议

6.1 立即修复高危漏洞

① 升级 Tomcat 版本
修改 Dockerfile:

dockerfile

FROM tomcat:9.0.115-jdk11   # 或更高版本

② 更新系统所有可升级的包
在 Dockerfile 中添加:

dockerfile

RUN apt-get update && apt-get upgrade -y && apt-get clean

重建镜像后重新扫描验证。

6.2 长期措施

  • 集成 CI/CD:在构建流水线中加入 Trivy 扫描步骤,设置 --exit-code 1 --severity HIGH,CRITICAL 阻断高危漏洞发布。

  • 定期更新基础镜像:每周或每月重新拉取上游 Tomcat 镜像并扫描。

  • 离线环境维护:使用 trivy --download-db-only 和 --download-java-db-only 预先下载数据库,配合 --skip-db-update 在内网扫描。

7. 总结

本次实战覆盖了 Trivy 在国产操作系统上的安装、国内网络环境下的数据库源配置、典型错误(锁、超时)的排查,以及对一份真实扫描报告的分析与修复。最终结论:

  • ✅ 镜像无 CRITICAL 漏洞,安全状况尚可;

  • ⚠️ 存在 1 个 Tomcat 高危漏洞和 9 个系统高危漏洞,建议尽快升级;

  • 📌 建立自动化扫描流程,将安全左移。

希望这篇记录能帮助你在自己的容器环境中顺利落地 Trivy 扫描。如果有更多问题,欢迎交流讨论。


附录:常用 Trivy 命令速查

bash

# 国内镜像 + 内存缓存 + 长超时
trivy image --db-repository ghcr.nju.edu.cn/aquasecurity/trivy-db:2 \
            --java-db-repository ghcr.nju.edu.cn/aquasecurity/trivy-java-db:1 \
            --cache-backend memory --timeout 30m <image>

# 仅扫描高危及以上漏洞,并返回非零退出码(用于 CI)
trivy image --severity HIGH,CRITICAL --exit-code 1 <image>

# 跳过数据库更新(离线使用)
trivy image --skip-db-update --skip-java-db-update <image>

更多推荐