跳转到内容
免费试用 Gitea Cloud ☁️ 30 天,加速你的开发与部署!
技术支持

代码扫描

代码扫描用于发现你自己源码中的安全弱点,例如注入、不安全的加密或对文件系统的不安全使用,并把它们作为发现列在仓库的安全页签中,与依赖告警和机密发现放在一起。它从 Gitea Enterprise v27.3.8 开始提供。

代码扫描的发现有四个来源:

来源 说明
gosec Go 语言的静态分析器,由 Gitea 对被扫描提交中的每个 Go 包运行。
Semgrep semgrep 引擎,在 Gitea 服务器上使用你提供的规则集运行。凡是 semgrep 规则覆盖的语言都可以扫描。
SARIF 导入 不在 Gitea 中运行引擎,而是导入你的 CI 已经用任意工具(CodeQL、Trivy、SonarQube 等)生成的 SARIF 报告。
安全 Agent 安全扫描 Agent 报告它判断为真实的发现。

所有来源共用同一套生命周期、过滤、API 和 SARIF 导出,每个来源只会对账并关闭它自己报告的发现。

打开 站点管理 > 安全 的**代码扫描(Code scanning)**部分:

设置 说明
允许在整个站点使用代码扫描 站点级总开关(默认开启)。
默认启用代码扫描(SARIF 导入) 从未保存过自己设置的仓库会跟随该开关(默认关闭)。
默认读取仓库中提交的 SARIF 报告 仓库级“读取仓库中提交的报告”开关的默认值(默认关闭)。
  1. 打开 仓库 > 设置 > 安全扫描,并通过分支模式确保想要的分支已启用安全扫描。
  2. 在代码扫描部分启用需要的扫描器。每个扫描器都有自己的路径、规则和允许列表选项。
  3. 保存。保存会触发重新扫描。

在提交上运行的扫描器会在推送到匹配分支时以及按固定计划扫描。设置页面会列出每次扫描运行的提交、状态以及发现、新增和已修复的数量,并为失败的运行提供重试。

Gitea Enterprise 不提供 semgrep 规则。管理员需要在 Gitea 服务器上安装 semgrep,并在 站点管理 > 安全 的 semgrep 部分提供规则集:

设置 说明
运行 semgrep 引擎 在站点上启用该引擎。只有启用后仓库才能使用该扫描器。
semgrep 可执行文件 服务器 PATH 中的名称或可执行文件路径,默认 semgrep。
规则集下载地址 规则文件的 tar.gz,每个版本只下载一次并保留。{version} 代表下面的版本。只使用其中的 yaml 文件。
规则集版本 规则集的版本,缓存以它为键。
规则集 sha256 压缩包的 sha256。必填:规则决定了扫描会报告什么,因此不匹配的压缩包会被拒绝。
允许仓库添加自己的规则 允许仓库添加自己的规则,见下文。

页面会显示引擎的状态:正在使用的规则集及其规则文件数量、semgrep 是否接受该规则集(在接受之前每次扫描都会失败),或者扫描器不可用的原因(引擎已关闭、没有可用的规则集、无法运行可执行文件)。

允许仓库规则时,仓库可以在 .gitea/sast-ruleset.toml 中列出自己的 semgrep 规则,该文件从被扫描的提交中读取:

[semgrep]
rules = [".gitea/rules/semgrep", "tools/no-eval.yaml"]

条目是相对于仓库根目录的 yaml 文件或目录,最多 200 个文件,每个不超过 1 MiB。它们会与站点规则集一起加载,其发现的规则 ID 以 repo. 开头。规则只匹配代码,不会执行任何东西。如果仓库只应使用站点规则集检查,请关闭该开关。

已经在 CI 中运行分析器的仓库可以把结果交给 Gitea,而无需在服务器上安装任何东西。Gitea 从两个地方读取 SARIF 2.1 文档:

  • 上传的报告。 对安全单元具有写权限的用户在 仓库 > 设置 > 安全扫描 的上传报告中上传:选择分支、可选的提交以及 SARIF 文件。系统会保留每个分支和每个工具最近一次分析的报告,该分支的扫描会把发现与它对账。报告可以再次删除,设置页面会显示工具、发现数量、大小和上传者。关闭允许上传报告可以拒绝上传。
  • 提交的报告。 开启读取仓库中提交的 SARIF 报告后,被扫描提交中名称以 .sarif 或 .sarif.json 结尾的文件也会被导入。流水线会把报告提交到仓库时请使用它。路径选项指定的是报告所在位置,而不是发现所在位置。

提交的报告文件最大 1 MiB,每份报告最多 5000 条结果,其余会被丢弃。同一条结果既来自上传又来自提交的副本时,只算一个发现。严重级别优先取规则的 security-severity 分数,没有时取 SARIF 的 level。

在安全页签选择代码扫描。每个发现会显示规则、级别、带代码的文件和行号、消息、CWE、置信度、报告它的工具,以及工具提供时的描述、利用场景、修复建议和帮助链接。可以按状态、严重级别、分支、规则和文件路径过滤。

对安全单元具有写权限的用户可以带原因驳回发现(已经开始修复、没有精力修复、风险可以接受、发现不准确、代码未被使用或仅在测试中使用),也可以重新打开。后续扫描不再发现时,发现会被关闭。

把例外放在代码旁边,随代码一起评审。.gitea/code-scanning-ignore 每行一个条目:扫描器不报告的路径(文件、目录或通配符,例如 third_party 或 **/*.generated.go),或发现的 64 位指纹。以 # 开头的行是注释。该文件最多 1000 个条目、64 KiB。设置页面也为每个扫描器提供同样的允许的路径和允许的发现。

安全页签中的 Export SARIF,或 GET /api/v1/repos/{owner}/{repo}/security/findings/sarif,会以 SARIF 格式导出发现,方便其他工具使用。其他类型发现所用的 API 同样适用(/repos/{owner}/{repo}/security/findings、dismiss 和 reopen),需要带有 security 范围的令牌。

在发现页面上,Triage with agent 会请求 Agent 判断该发现是否为真实漏洞(结论为真实漏洞、误报或不确定,并带有置信度),Fix with agent 会请求 Agent 创建修复它的 PR。两者都需要启用了对应选项的 Agent,且请求者需要对安全单元具有写权限。也可以针对新发现自动启动 Agent。具体选项请参阅 Agents 文档。