Static Application Security Testing (SAST)

Static Application Security Testing (SAST)

Introduced in 10.3.

注意:白皮书“应用程序安全性发生了说明了前 6 种攻击中有 4 种是基于应用程序的 . 下载它以了解如何保护您的组织.

如果您使用的是GitLab CI / CD ,则可以使用静态应用程序安全性测试(SAST)分析源代码中的已知漏洞.

您可以通过执行以下任一操作来利用 SAST:

  • 在现有的.gitlab-ci.yml文件中 .
  • 隐式使用Auto DevOps提供的 SAST .

GitLab 检查 SAST 报告,比较发现的源分支和目标分支之间的漏洞,并在合并请求中显示信息.

结果按漏洞的优先级排序:

  1. Critical
  2. High
  3. Medium
  4. Low
  5. Unknown
  6. 其他一切

注意:管道包含多个作业,包括 SAST 和 DAST 扫描. 如果任何作业由于任何原因未能完成,则安全信息中心将不会显示 SAST 扫描仪输出. 例如,如果 SAST 作业完成但 DAST 作业失败,则安全性仪表板将不会显示 SAST 结果. 分析器将在失败时输出退出代码 .

Use cases

  • 您的代码在类中具有潜在的危险属性,或者不安全的代码可能导致意外的代码执行.
  • 您的应用程序容易受到跨站点脚本(XSS)攻击的攻击,这些攻击可用于未经授权访问会话数据.

Requirements

要运行 SAST 工作,默认情况下,你需要 GitLab 亚军与或kubernetes执行. 如果您在 GitLab.com 上使用共享的 Runners,则默认启用该功能.

从 GitLab 13.0 开始,仅当您已需要 Docker 特权模式.

警告:目前,我们的 SAST 作业需要 Linux 容器类型. Windows 容器尚不支持.注意:如果使用自己的 Runners,请确保安装的 Docker 版本不是 19.03.0 . 有关详细信息 ,请参见 .

Supported languages and frameworks

下表显示了支持的语言,程序包管理器和框架以及使用了哪些工具.

注意: Java 分析器还可以用于 , Grails和等变体.

所有开放源代码(OSS)分析器都正在接受审核,并有可能移至 GitLab 核心层. 可以在相应的史诗中跟踪进度.

请注意,对支持不会扩展到 GitLab 核心层.

Summary of features per tier

下表列出了在不同的中可用的不同功能:

Capability 在核心 终极
Configure SAST Scanners
View JSON Report
Interaction with Vulnerabilities

安全扫描程序集成文档说明了如何将其他安全扫描到 GitLab 中.

Configuration

注意:如果您使用的是提供的Auto 按照本节中的说明手动配置 SAST.

对于 GitLab 11.9 和更高版本,要启用 SAST,您必须包括作为 GitLab 安装的一部分提供的 . 对于 11.9 之前的 GitLab 版本,您可以复制和使用该模板中定义的作业.

将以下内容添加到您的.gitlab-ci.yml文件中:

结果将保存为SAST 报告工件 ,您可以稍后下载和分析. 由于实施限制,我们始终采用最新的 SAST 工件.

Customizing the SAST settings

可以使用.gitlab-ci.ymlvariables参数通过更改 SAST 设置. 在下面的示例中,我们包括 SAST 模板,同时将SAST_GOSEC_LEVEL变量设置为2

  1. include:
  2. - template: SAST.gitlab-ci.yml
  3. variables:
  4. SAST_GOSEC_LEVEL: 2

因为模板是管道配置的,所以最后提到的变量优先.

Overriding SAST jobs

弃用:从 GitLab 13.0 开始,不再支持的使用. 覆盖模板时,必须使用rules .

要覆盖作业定义(例如,更改variablesdependencies类的属性),请声明与要覆盖的 SAST 作业同名的作业. 将此新作业放置在包含模板之后,并在其下指定其他任何键. 例如,这使得能够FAIL_NEVERspotbugs分析器:

  1. include:
  2. - template: SAST.gitlab-ci.yml
  3. spotbugs-sast:
  4. variables:
  5. FAIL_NEVER: 1

一些分析器需要下载项目的依赖项才能执行分析. 反过来,此类依赖项可能存在于私有 Git 存储库中,因此需要诸如用户名和密码之类的凭据才能下载它们. 根据分析器的不同,可以通过向其提供此类凭据.

Using a variable to pass username and password to a private Maven repository

如果您的私有 Maven 存储库需要登录凭据,则可以使用MAVEN_CLI_OPTS环境变量.

阅读有关更多信息 .

Enabling Docker-in-Docker

如果需要,您可以启用 Docker-in-Docker 来还原 GitLab 13.0 之前存在的 SAST 行为. 请按照以下步骤操作:

  1. 特权模式下使用 Docker-inDocker 配置 GitLab Runner.
  2. 将变量SAST_DISABLE_DIND设置为false

这将创建一个单一的sast在你的 CI / CD 管道,而不是多个作业<analyzer-name>-sast工作.

Enabling Kubesec analyzer

在 GitLab Ultimate 12.6 中引入 .

您需要将SCAN_KUBERNETES_MANIFESTS设置为"true"才能启用 Kubesec 分析器. 在.gitlab-ci.yml ,定义:

  1. include:
  2. - template: SAST.gitlab-ci.yml
  3. variables:
  4. SCAN_KUBERNETES_MANIFESTS: "true"

Pre-compilation

如果您的项目需要自定义构建配置,则最好避免在 SAST 执行期间进行编译,而应将管道中较早阶段的所有作业工件传递出去. 当需要执行before_script来准备扫描作业时,这是当前的策略.

要将项目的依赖项作为工件传递,这些依赖项必须包含在项目的工作目录中,并使用artifacts:path配置进行指定. 如果存在所有依赖项,则可以将COMPILE=false变量提供给分析器,并且将跳过编译:

  1. image: maven:3.6-jdk-8-alpine
  2. - build
  3. - test
  4. include:
  5. - template: SAST.gitlab-ci.yml
  6. build:
  7. stage: build
  8. script:
  9. - mvn package -Dmaven.repo.local=./.m2/repository
  10. artifacts:
  11. paths:
  12. - .m2/
  13. - target/
  14. spotbugs-sast:
  15. dependencies:
  16. - build
  17. variables:
  18. MAVEN_REPO_PATH: ./.m2/repository
  19. COMPILE: false
  20. artifacts:
  21. reports:
  22. sast: gl-sast-report.json

注意:必须显式指定供应商目录的路径,以允许分析器识别已编译的工件. 每个分析器的配置可能有所不同,但在上述 Java 的情况下,可以使用MAVEN_REPO_PATH . 有关可用选项的完整列表,请参见分析器设置 .

Available variables

可以使用环境变量配置 SAST.

Logging Level

您可以通过设置SECURE_LOG_LEVEL env var 来控制日志的详细程度. 默认设置为info ,您可以将其设置为以下任意级别:

  • error
  • warn
  • info
  • debug

Custom Certificate Authority

要信任自定义证书颁发机构,请将ADDITIONAL_CA_CERT_BUNDLE变量设置为要在 SAST 环境中信任的 CA 证书包.

Docker images

以下是与 Docker 映像相关的变量.

Vulnerability filters

环境变量 默认值 Description
SAST_EXCLUDED_PATHS spec, test, tests, tmp 根据路径从输出中排除漏洞. 这是逗号分隔的模式列表. 模式可以是全局变量,也可以是文件或文件夹路径(例如doc,spec ). 父目录也将匹配模式.
SAST_BANDIT_EXCLUDED_PATHS 逗号分隔的路径列表,可从扫描中排除. 使用 Python 的 ; 例如: '*/tests/*, */venv/*'
SAST_BRAKEMAN_LEVEL 1 在给定的置信度下忽略 Brakeman 漏洞. 整数,1 =低 3 =高.
SAST_DISABLE_BABEL false 禁用 NodeJsScan 扫描仪的 Babel 处理. 设置为true将禁用 Babel 处理. 在 GitLab 13.2 中引入 .
SAST_FLAWFINDER_LEVEL 1 在给定风险级别下忽略 Flawfinder 漏洞. 整数,0 =无风险,5 =高风险.
SAST_GITLEAKS_ENTROPY_LEVEL 8.0 秘密检测的最小熵. 浮动,0.0 =低,8.0 =高.
SAST_GOSEC_LEVEL 0 在给定的置信度下忽略 Gosec 漏洞. 整数,0 =未定义,1 =低,2 =中,3 =高.
SAST_GITLEAKS_COMMIT_FROM 提交 Gitleaks 扫描始于.
SAST_GITLEAKS_COMMIT_TO Gitleaks 扫描的提交结束于.
SAST_GITLEAKS_HISTORIC_SCAN false 标记以启用历史性的 Gitleaks 扫描.

Docker-in-Docker orchestrator

以下变量配置 Docker-in-Docker 协调器,因此仅在启用 Docker-in-Docker 模式时才使用.

Analyzer settings

某些分析仪可以使用环境变量进行自定义.

Environment variable Analyzer Description
SCAN_KUBERNETES_MANIFESTS Kubesec 设置为"true"以扫描 Kubernetes 清单.
KUBESEC_HELM_CHARTS_PATH Kubesec helm将用于生成kubesec将扫描的 Kubernetes 清单的舵图的可选路径. 如果定义了helm dependency build则应在before_script运行helm dependency build以获取必要的依赖关系.
KUBESEC_HELM_OPTIONS Kubesec helm可执行文件的其他参数.
SpotBugs 设置为false可禁用项目编译和依赖项获取. 在 GitLab 13.1 中引入 .
ANT_HOME SpotBugs ANT_HOME环境变量.
ANT_PATH SpotBugs ant可执行文件的路径.
GRADLE_PATH SpotBugs gradle可执行文件的路径.
JAVA_OPTS SpotBugs java可执行文件的附加参数.
JAVA_PATH SpotBugs java可执行文件的路径.
SAST_JAVA_VERSION SpotBugs 使用哪个 Java 版本. 支持的版本是811 . 默认为8 .
MAVEN_CLI_OPTS SpotBugs mvnmvnw可执行文件的其他参数.
MAVEN_PATH SpotBugs mvn可执行文件的路径.
MAVEN_REPO_PATH SpotBugs Maven 本地存储库的路径( maven.repo.local属性的快捷方式).
SBT_PATH SpotBugs sbt可执行文件的路径.
FAIL_NEVER SpotBugs 设置为1可忽略编译失败.
SAST_GOSEC_CONFIG Gosec Gosec 的配置路径(可选).
PHPCS_SECURITY_AUDIT_PHP_EXTENSIONS phpcs-security-audit 以逗号分隔的其他 PHP 扩展列表.
SEARCH_MAX_DEPTH any 搜索源代码文件时遍历的最大目录数. 默认值: 4 .

Custom environment variables

在 GitLab Ultimate 12.5 中引入 .

除上述 SAST 配置变量外,如果 ,则所有自定义环境变量都将传播到基础 SAST 分析器映像.

警告:名称以这些前缀开头的变量将不会传播到 SAST Docker 容器和/或分析器容器: DOCKER_CIGITLAB_FF_HOMEPWDOLDPWDPATHSHLVLHOSTNAME .

Reports JSON format

SAST 工具会发出 JSON 报告文件. 有关更多信息,请参见此报告的 .

这是一个示例 SAST 报告:

Secret detection

了解有关更多信息.

在”安全仪表板”中,您可以概览您的组,项目和管道中的所有安全漏洞. 阅读有关安全仪表板的更多 .

Interacting with the vulnerabilities

一旦发现漏洞,便可以与其进行交互. 阅读有关如何进行交互的更多信息.

Vulnerabilities database

Vulnerabilities contained within the vulnerability database can be searched and viewed at the GitLab vulnerability advisory database.

有关漏洞数据库更新的更多信息,请查看 .

Running SAST in an offline environment

对于在通过 Internet 限制,限制或间歇性访问外部资源的环境中进行自我管理的 GitLab 实例,需要进行一些调整才能使 SAST 作业成功运行. 有关更多信息,请参阅 .

Requirements for offline SAST

要在离线环境中使用 SAST,您需要:

  • 保持 Docker-In-Docker 禁用(默认).
  • GitLab 亚军与 .
  • Docker Container Registry,带有本地可用的 SAST 分析器映像副本.

注意: GitLab Runner 的 ,这意味着即使本地副本可用,Runner 也会尝试从 GitLab 容器注册表中拉取 Docker 映像. 如果您只喜欢使用本地可用的 Docker 映像,则可以在离线环境pull_policy GitLab Runner 的 . 但是,如果不在离线环境中,我们建议将拉取策略设置保持为always ,因为这样可以在 CI / CD 管道中使用更新的扫描仪.

Make GitLab SAST analyzer images available inside your Docker registry

对于具有所有 SAST,请将以下默认 SAST 分析器图像从registry.gitlab.com导入本地 Docker 容器注册表

  1. registry.gitlab.com/gitlab-org/security-products/analyzers/bandit:2
  2. registry.gitlab.com/gitlab-org/security-products/analyzers/brakeman:2
  3. registry.gitlab.com/gitlab-org/security-products/analyzers/eslint:2
  4. registry.gitlab.com/gitlab-org/security-products/analyzers/flawfinder:2
  5. registry.gitlab.com/gitlab-org/security-products/analyzers/gosec:2
  6. registry.gitlab.com/gitlab-org/security-products/analyzers/kubesec:2
  7. registry.gitlab.com/gitlab-org/security-products/analyzers/nodejs-scan:2
  8. registry.gitlab.com/gitlab-org/security-products/analyzers/phpcs-security-audit:2
  9. registry.gitlab.com/gitlab-org/security-products/analyzers/pmd-apex:2
  10. registry.gitlab.com/gitlab-org/security-products/analyzers/secrets:2
  11. registry.gitlab.com/gitlab-org/security-products/analyzers/security-code-scan:2
  12. registry.gitlab.com/gitlab-org/security-products/analyzers/sobelow:2
  13. registry.gitlab.com/gitlab-org/security-products/analyzers/spotbugs:2

将 Docker 映像导入本地脱机 Docker 注册表的过程取决于您的网络安全策略 . 请咨询您的 IT 员工,以找到可以导入或临时访问外部资源的已接受和批准的流程. 请注意,这些扫描程序会使用新定义进行更新 ,因此请考虑您是否能够自己进行定期更新.

有关将 Docker 映像保存和传输为文件的详细信息,请参阅 Docker 有关 , docker load , 和docker import的文档.

将以下配置添加到您的.gitlab-ci.yml文件. 您必须替换SECURE_ANALYZERS_PREFIX才能引用本地 Docker 容器注册表:

  1. include:
  2. - template: SAST.gitlab-ci.yml
  3. variables:
  4. SECURE_ANALYZERS_PREFIX: "localhost:5000/analyzers"

现在,SAST 作业应使用 SAST 分析器的本地副本来扫描您的代码并生成安全报告,而无需访问 Internet.

Error response from daemon: error processing tar file: docker-tar: relocation error