为什么 GitLab CI SAST 不排除我要求其排除的目录?

loc*_*cka 8 gitlab-ci sast semgrep

我已在 GitLab CI(GitLab 社区版)14.5.2 中启用了 SAST 扫描。SAST 运行 semgrep 和 ESLint 等工具,在源代码上运行并扫描漏洞。这是有效的......除了它没有从我告诉它的结果中排除路径和文件,所以我的报告充满了来自第 3 方库的垃圾。

\n

由于我不想在报告中包含测试代码或第 3 方内容,因此我使用 GitLab 提供的变量来实现此目的,称为SAST_EXCLUDED_PATHS我用来排除某些目录的变量。我的价值观是这样的:

\n
    variables:\n        SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js\n
Run Code Online (Sandbox Code Playgroud)\n

所以基本上除了默认路径之外,我还告诉它不要扫描server/libsassetsvendor*.min.js

\n

因此,简化的 .gitlab-ci.yml 添加了该步骤,添加了排除项并设置SECURE_LOG_LEVEL"debug"。后者让我可以看到 sast-semgrep 等阶段的调试输出。

\n
include:\n    - template: Security/SAST.gitlab-ci.yml\n\nstages:\n    - test\n\n# Run a SAST scan & report on the sources\nsast:\n    stage: test\n    variables:\n        SAST_EXCLUDED_PATHS: spec, test, tests, tmp, server/libs, assets, vendor, *.min.js\n        SECURE_LOG_LEVEL: "debug"\n
Run Code Online (Sandbox Code Playgroud)\n

我可以从调试中看到 sast-semgrep 正在将我的排除项转换为--exclude参数。但无论如何它只是扫描路径。我什至尝试将全局规则附加到路径上,例如“server/libs/**”。我什至尝试使用绝对路径,例如“$CI_PROJECT_DIR/server/libs”,但这也不起作用。

\n

我已启用调试控制台输出,我什至可以看到 semgrep 等工具正在正确扩展排除项。但这不起作用!此示例包含一个$CI_PROJECT_DIR没有任何区别的扩展。

\n
[DEBU] [Semgrep] [2022-01-26T20:59:40Z] \xe2\x96\xb6 /usr/local/bin/semgrep -f /rules -o /builds/myprj/myprj/semgrep.sarif --sarif --no-rewrite-rule-ids --strict --disable-version-check --no-git-ignore --exclude spec --exclude  test --exclude  tests --exclude  tmp --exclude  "/builds/myprj/myprj/server/libs" --exclude  assets --exclude  vendor --exclude  *.min.js --enable-metrics /builds/myprj/myprj\n[DEBU] [Semgrep] [2022-01-26T21:01:34Z] \xe2\x96\xb6 METRICS: Using configs from the Registry (like --config=p/ci) reports pseudonymous rule metrics to semgrep.dev.\nTo disable Registry rule metrics, use "--metrics=off".\nUsing configs only from local files (like --config=xyz.yml) does not enable metrics.\nMore information: https://semgrep.dev/docs/metrics\nexcluding files:\n- spec\n-  test\n-  tests\n-  tmp\n-  "/builds/myprj/myprj/server/libs"\n-  assets\n-  vendor\n-  *.min.js\n
Run Code Online (Sandbox Code Playgroud)\n

据我所知,我正在使用最新的 GitLab 和 Gitlab 调用的 docker 镜像。有谁知道为什么排除不起作用?我是否遗漏了一些明显的东西?仅供参考,我还在 GitLab Ultimate 评估副本中尝试了相同的 CI/CD 脚本,并且是相同的交易。因此,这与社区版中功能较弱的 SAST 功能无关,社区版仍应生成 JSON 报告。有任何想法吗?

\n

小智 10

希望我还不算太晚。我遇到了同样的问题,解决方法是删除排除路径之间的空格。你的SAST_EXCLUDED_PATHS变量应该是这样的:

  variables:
        SAST_EXCLUDED_PATHS: spec,test,tests,tmp,server/libs,assets,vendor,*.min.js
Run Code Online (Sandbox Code Playgroud)