SAST 分析器
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
静态应用安全测试(SAST)使用分析器来检测源代码中的漏洞。每个分析器都是一个包装器,围绕着一个扫描器,即第三方代码分析工具。
分析器以 Docker 镜像的形式发布,SAST 使用这些镜像为每次分析启动专用容器。我们建议至少使用 4 GB RAM 来确保分析器的稳定性能。
SAST 默认镜像由 GitLab 维护,但您也可以集成自己的自定义镜像。
对于每个扫描器,分析器会:
- 暴露其检测逻辑
- 处理其执行过程
- 将其输出转换为标准格式
官方分析器
SAST 支持以下官方分析器:
gitlab-advanced-sast,提供跨文件和跨函数的污点分析以及改进的检测准确性。仅限 Ultimate 版本。kubesec,基于 Kubesec。默认关闭;请参阅启用 KubeSec 分析器。pmd-apex,基于 PMD,包含 Apex 语言的规则。semgrep,基于 Semgrep OSS 引擎配合 GitLab 管理的规则。sobelow,基于 Sobelow。spotbugs,基于 SpotBugs,包含 Find Sec Bugs 插件(支持 Ant、Gradle 及其包装器、Grails、Maven 及其包装器、SBT)。
支持的版本
官方分析器作为容器镜像发布,与 GitLab 平台分离。每个分析器版本都与有限的 GitLab 版本集兼容。
当某个分析器版本在未来 GitLab 版本中不再被支持时,此变更会提前公告。例如,请参阅针对 GitLab 17.0 的公告。
每个官方分析器支持的主要版本反映在 SAST CI/CD 模板的作业定义中。要查看在早期 GitLab 版本中支持的分析器版本,请选择 SAST 模板文件的历史版本,例如 GitLab 16.11.0 的 v16.11.0-ee。
已停止支持的分析器
以下 GitLab 分析器已达到停止支持状态,不再接收更新。它们被基于 Semgrep 的分析器配合 GitLab 管理的规则所取代。
当您升级到 GitLab 17.3.1 或更高版本后,一次性数据迁移会自动解决来自已停止支持分析器的发现结果。这包括下面列出的所有分析器,但 SpotBugs 除外,因为 SpotBugs 仍然扫描 Groovy 代码。此迁移仅解决您尚未确认或忽略的漏洞,不影响那些已自动转换为基于 Semgrep 扫描的漏洞。详情请参阅问题 444926。
| 分析器 | 扫描的语言 | 停止支持的 GitLab 版本 |
|---|---|---|
| Bandit | Python | 15.4 |
| Brakeman | Ruby,包括 Ruby on Rails | 17.0 |
| ESLint with React and Security plugins | JavaScript 和 TypeScript,包括 React | 15.4 |
| Flawfinder | C、C++ | 17.0 |
| gosec | Go | 15.4 |
| MobSF | Java 和 Kotlin(仅限 Android 应用程序);Objective-C(仅限 iOS 应用程序) | 17.0 |
| NodeJsScan | JavaScript(仅限 Node.js) | 17.0 |
| phpcs-security-audit | PHP | 17.0 |
| Security Code Scan | .NET(包括 C#、Visual Basic) | 16.0 |
| SpotBugs | 仅限 Java1 | 15.4 |
| SpotBugs | 仅限 Kotlin 和 Scala1 | 17.0 |
脚注:
- SpotBugs 仍然是 Groovy 的支持分析器。仅当检测到 Groovy 代码时才会激活。
SAST 分析器功能
要使分析器被视为正式可用,它至少应支持以下功能:
后处理分析器
- Tier: Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
后处理分析器通过分析器丰富报告输出。后处理分析器不直接修改报告内容,而是通过添加额外属性来增强结果,包括:
- CWE(通用缺陷枚举)
- 位置跟踪字段
转换为基于 Semgrep 的扫描
除了GitLab Advanced SAST 分析器外,GitLab 还提供了一个基于 Semgrep 的分析器,它支持多种语言。GitLab 维护该分析器并为其编写检测规则。这些规则取代了在早期版本中使用的特定语言分析器。
漏洞转换
漏洞管理系统在可能的情况下自动将漏洞从旧分析器移动到新的基于 Semgrep 的发现结果。要转换为 GitLab Advanced SAST 分析器,请参阅GitLab Advanced SAST 文档。
发生这种情况时,系统会将每个分析器的漏洞合并为单个记录。
但是,如果出现以下情况,漏洞可能无法匹配:
- 新的基于 Semgrep 的规则在不同的位置或以不同的方式检测到漏洞,与旧分析器不同。
- 您之前禁用了 SAST 分析器。这会干扰自动转换,因为无法为每个漏洞记录必要的标识符。
如果漏洞不匹配:
- 原始漏洞在漏洞报告中标记为"不再检测到"
- 然后会基于基于 Semgrep 的发现创建新漏洞
自定义分析器
在您的 .gitlab-ci.yml 文件中使用CI/CD 变量来自定义分析器的行为。
使用自定义 Docker 镜像
您可以使用自定义 Docker 注册表(而非 GitLab 注册表)来托管分析器的镜像。
先决条件:
- 自定义 Docker 注册表必须为所有官方分析器提供镜像。
此变量影响所有 Secure 分析器,而不仅仅是 SAST 分析器。
要使 GitLab 从自定义 Docker 注册表下载分析器镜像,请使用 SECURE_ANALYZERS_PREFIX CI/CD 变量定义前缀。
例如,以下配置指示 SAST 拉取 my-docker-registry/gitlab-images/semgrep 而不是 registry.gitlab.com/security-products/semgrep:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SECURE_ANALYZERS_PREFIX: my-docker-registry/gitlab-images禁用所有默认分析器
您可以禁用所有默认的 SAST 分析器,只启用自定义分析器。
要在 .gitlab-ci.yml 文件中禁用所有默认分析器,将 CI/CD 变量 SAST_DISABLED 设置为 "true"。
示例:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SAST_DISABLED: "true"禁用特定默认分析器
分析器根据检测到的源代码语言自动运行。但是,您可以禁用特定的分析器。
要禁用特定的分析器,将 CI/CD 变量 SAST_EXCLUDED_ANALYZERS 设置为您要阻止运行的分析器的逗号分隔字符串。
例如,要禁用 spotbugs 分析器:
include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SAST_EXCLUDED_ANALYZERS: "spotbugs"自定义分析器
您可以通过在 CI/CD 配置中定义作业来提供自己的分析器。为了与默认分析器保持一致,您应该为自定义 SAST 作业添加后缀 -sast。
自定义分析器示例
此示例展示了如何添加一个基于 Docker 镜像 my-docker-registry/analyzers/csharp 的扫描作业。它运行脚本 /analyzer run 并输出 SAST 报告 gl-sast-report.json。
在您的 .gitlab-ci.yml 文件中定义以下内容:
csharp-sast:
image:
name: "my-docker-registry/analyzers/csharp"
script:
- /analyzer run
artifacts:
reports:
sast: gl-sast-report.json