软件供应链安全扫描实战,极狐GitLab依赖扫描与漏洞治理

极狐GitLab
2026年11月9日
11340
分享:

软件供应链安全扫描实战,极狐GitLab依赖扫描与漏洞治理

定义框:软件供应链安全扫描,指对应用依赖的第三方组件、容器镜像与构建产物进行自动化成分分析与漏洞比对,在漏洞进入生产环境前完成识别、分级与修复的过程。

你的代码可能只有几万行,但它跑起来依赖的第三方代码可能超过百万行。一个 npm 包、一个基础镜像、一个传递依赖,任何一个环节被投毒,攻击面就直接打进生产环境。近年多起供应链投毒事件反复验证同一件事:靠人工盯 CVE 公告,根本追不上披露速度。

更现实的问题是时效性。你在周一跑了扫描,一切正常;周三一个新漏洞披露,恰好命中你锁文件里的某个版本。如果扫描只在流水线里跑一次,这个漏洞要等到下次构建才会被看见。距离可能是一周,也可能是一个月。

这篇拆解极狐GitLab 在依赖扫描与漏洞治理上的官方做法:SBOM 为先的依赖扫描、容器镜像扫描,以及漏洞报告构成的治理闭环。所有功能名、参数、限制条件均出自极狐GitLab 官方文档中心。

一、依赖扫描:从"流水线扫一次"到"SBOM 为先"

极狐GitLab 的依赖扫描(Dependency Scanning)属于软件成分分析(SCA)范畴,可识别项目依赖中已知的安全漏洞,包括运行时、开发以及传递(嵌套)软件包。官方目前提供四种扫描方法,适用场景各不相同:

扫描方法

状态

触发方式

最适合

使用 SBOM 的依赖扫描

正式发布

流水线

新项目、以 SBOM 为先的工作流

持续依赖扫描

正式发布

安全公告数据库更新

无需重跑流水线即可捕获新披露漏洞

使用 Gemnasium 的依赖扫描

已弃用(17.9)

流水线

等待迁移的现有项目

分析依赖的行为(Libbehave)

实验

流水线

检测恶意软件包行为

两个关键时间点值得划重点:基于 Gemnasium 分析器的旧版依赖扫描在极狐GitLab 17.9 中已弃用,计划在 20.0 中移除。如果你们的流水线还在跑旧版模板,迁移要排上日程,官方提供了迁移指南。

新架构的思路是把"检测依赖"和"比对漏洞"拆开:

  1. 依赖检测:分析器解析锁文件或依赖关系图导出,生成 CycloneDX 格式的 SBOM(软件物料清单),作为作业产物保存;

  2. 漏洞比对:SBOM 通过依赖扫描 SBOM API 上传,扫描引擎将其与 GitLab 安全公告数据库和 GitLab 恶意软件公告比对,生成漏洞报告;

  3. 持续扫描:公告数据库一旦更新,默认分支最近一次成功流水线的 SBOM 会被重新扫描——新披露的漏洞无需重新运行流水线即可显现。

第三步就是前面那个时效性问题的官方答案。SBOM 存下来了,公告一更新就能回溯比对,不用等下次构建。

覆盖范围上,SBOM 依赖扫描支持的 PURL 类型包括 cargo、composer、conan、gem、golang、maven、npm、nuget、pypi、swift,主流语言基本全覆盖。以 Python 为例,支持 requirements.txt、Pipfile.lock、poetry.lock、uv.lock 等多种清单文件。

也有边界要知道:SBOM 扫描有每项目每小时 50 次的软性限流(不可配置);默认只扫描根目录及直接子目录(深度 2);恶意软件包发现仅在默认分支评估,严重性恒定为 Critical,标识符格式为 GLAM-<年份>-<月份>-<序号>——官方明确这类包的处置方式是移除软件包而非升级。

二、容器镜像扫描:基础镜像与操作系统包的兜底

依赖扫描管的是语言层依赖,容器镜像里的基础镜像和操作系统软件包由容器扫描(Container Scanning)负责,两者互补。官方将其归类为 SCA 的一部分,与 Trivy 集成执行容器漏洞静态分析(旧 Grype 分析器已不再维护,将于极狐GitLab 19.0 停止工作)。

启用只需一行模板引入,常用的几个 CS_ 变量如下:

变量

默认值

说明

CS_IMAGE

$CI_APPLICATION_REPOSITORY:$CI_APPLICATION_TAG

要扫描的镜像,可指向外部仓库

CS_SEVERITY_THRESHOLD

UNKNOWN

严重性阈值,可选 LOW/MEDIUM/HIGH/CRITICAL

CS_DISABLE_LANGUAGE_VULNERABILITY_SCAN

"true"

设为 "false" 可同时报告编程语言包发现

CS_IGNORE_UNFIXED

"false"

设为 "true" 忽略暂无修复方案的发现

TRIVY_TIMEOUT

5m0s

单次扫描超时

一个最小可用的组合配置:

include:
  - template: Jobs/Dependency-Scanning.v2.gitlab-ci.yml
  - template: Jobs/Container-Scanning.gitlab-ci.yml

container_scanning:
  variables:
    CS_IMAGE: registry.example.com/team/app:latest

前提条件:流水线需包含 test 阶段;私有化部署的 Runner 需使用 Linux/amd64 上的 docker 或 kubernetes 执行器。扫描完成后产出 gl-container-scanning-report.json 和 CycloneDX SBOM 产物 gl-sbom-report.cdx.json,漏洞详情包含 6 个严重性级别、CVSS 分数、EPSS 评分和 KEV(已知被利用漏洞)状态。

旗舰版还有一个容易被忽略的能力:容器镜像仓库的容器扫描。配置通知和软件包元数据数据库后,推送 latest 标签镜像会自动触发扫描,每个项目每天最多 50 次。也就是说,同一个镜像躺在仓库里,公告库更新后它也能被重新检出来。

三、漏洞治理闭环:报告、分诊与审计

扫出来只是第一步,堆在报告里的漏洞不会自己消失。极狐GitLab 的漏洞报告(旗舰版)提供项目或群组维度的汇总视图,治理动线大致是:

  1. 查看与筛选:按状态、严重程度(严重/高/中/低/信息/未知)、报告类型、扫描器筛选,支持按 OWASP Top 10 分组;CVE 类漏洞可直接查看 CVSS、EPSS、KEV 状态与可达性信息;

  2. 状态流转:漏洞状态在"需要分类、已确认、已忽略、已解决"之间流转,更改状态需安全管理员、维护者或所有者角色(极狐GitLab 17.0 起 admin_vulnerability 权限已从开发者角色移除);

  3. 忽略留痕:忽略漏洞时必须选择忽略原因并填写评论,审计日志会记录忽略者、时间与原因——漏洞记录无法删除,永久留存;

  4. 关联处置:可将漏洞附加到已有议题或创建新议题,跟踪修复进度;部分漏洞支持通过自动化合并请求修复;

  5. 导出归档:支持导出 CSV,字段含 CVE、CWE、CVSS 向量、检测时间、位置等,可直接进合规汇报。

值得一提的是极狐GitLab Duo 的介入:漏洞报告的活动列会标识"漏洞修复"(有可用 AI 修复方案)与"误报检测"(Duo 已分析该漏洞是否为误报,悬停可看置信度评分和说明),分诊阶段的体力活可以交给 AI 先过一遍。

几句劝退的话也要说清楚:扫描器解决的是"已知漏洞"问题——组件有已知 CVE、镜像里有可识别的恶意包。它防不住自研代码里的逻辑漏洞(那是 SAST 的活),也防不住清单回退模式下的漏报(官方文档明示该模式无传递依赖、可能无法确定确切版本)。把扫描结果当成唯一安全指标,和完全不扫一样危险。

常见问题

Q1:旧版依赖扫描还能用多久,迁移要改什么?

基于 Gemnasium 分析器的依赖扫描在极狐GitLab 17.9 已弃用,计划在极狐GitLab 20.0 移除。迁移核心是把旧模板换成 Jobs/Dependency-Scanning.v2.gitlab-ci.yml,产物从漏洞报告为主转为 CycloneDX SBOM 为主,官方提供迁移指南,建议在合并请求中先行验证自定义变量避免误报。

Q2:依赖扫描和 SAST 有什么区别,都要开吗?

职责不同。SAST 扫的是你自己写的代码里的缺陷模式,依赖扫描(SCA)扫的是第三方组件的已知漏洞。供应链攻击大多从第三方依赖进来,两者互补而非替代,同一套流水线可以并行启用。

Q3:扫描结果怎么进合规审计?

漏洞报告支持一键导出 CSV,包含状态、CVE/CWE、CVSS 向量、忽略原因、检测时间等完整字段;忽略操作强制填写原因并记入审计日志,漏洞记录不可删除。这套留痕机制可直接对接等保或 ISO 27001 的漏洞管理审计要求。


企业级依赖与镜像扫描能力(SBOM 依赖扫描、容器镜像扫描、漏洞报告)属于极狐GitLab 旗舰版功能,开箱即用,无需自建扫描器集群。想评估现有项目的依赖风险面,可以预约产品演示,或前往极狐GitLab 文档中心查阅完整配置说明。也欢迎在评论区聊聊:你们的上次全量依赖盘点,是什么时候?