CodeMender 查找模式

CodeMender 通过 cm find 命令提供三种不同的扫描模式。 每种模式都专为软件开发生命周期的特定阶段而设计,可平衡速度、范围和深度。

比较查找模式

下表比较了三种 cm find 扫描模式:

模式 命令 目标范围 典型运行时 适用场景
标准扫描 cm find PATH 指定目录 中等运行时 本地开发者发现、快速检查、探索性审核
差异扫描 cm find PATH --diff[=REF] 修改后的文件以及依赖文件(例如调用方和被调用方) 快速运行时 拉取请求 CI/CD 流水线(GitHub Actions、Cloud Build)、 预提交钩子
深度扫描 cm find PATH --deep 整个代码库 较长的运行时 安排的审核、发布准备情况、合规性认证 (SOC 2, ISO)

标准扫描(默认)

如果您在运行 cm find 时未提供其他扫描标志,则标准扫描是默认模式。它会对指定的目标目录运行单会话自主扫描。在扫描期间,CodeMender 会发现源文件,根据漏洞模式确定其优先级,执行初始安全分析,并报告按严重程度和类型分组的潜在漏洞。

以下示例演示了如何对目标目录运行标准扫描:

# Scan a directory using the default model
cm find ./src

# Scan with a specific Gemini model
cm find ./src --model gemini-3.8-flash

优势

标准扫描无需任何配置,也不需要额外的标志或参数。 它以中等运行时平衡了速度和覆盖范围,并使用最少的令牌和计算资源,因此对于日常开发来说经济实惠。

权衡取舍和限制

标准扫描在大型代码库上的召回率较低,并且可能不会探索大型多软件包企业代码库中的每个文件,因为它在单个会话上下文中运行。它还主要关注单个文件中的本地模式,这限制了跨软件包分析,并且可能会遗漏跨不同软件包的漏洞。

何时使用

在以下情况下使用标准扫描:

  • 在提交更改之前,在本地计算机上运行扫描,以便在本地开发期间获得快速反馈。
  • 检查新克隆的代码库或小型项目,以便初步评估其安全状况。
  • 调查潜在问题时,检查特定子目录或模块。

差异扫描

差异扫描通过检查修改和添加的文件,对拉取请求工作流和 CI/CD 流水线执行 Git 差异分析,重点关注更改的确切行范围(差异块)。除了检查更改的行之外,它还会执行影响分析,以发现代码库中调用、导入或依赖于修改后的函数和符号的未触及文件。这有助于确保在一个文件中更改合同或函数签名不会在依赖文件中引入漏洞。

在扫描期间,CodeMender 会自动隔离未触及代码中预先存在的漏洞,以便旧问题不会导致扫描失败或阻止拉取请求。然后,它会根据您的 --fail-on 政策评估结果,并以表格、JSON 或 SARIF v2.1.0 格式输出结果。

以下示例演示了如何针对工作副本更改、暂存的更改或目标分支运行差异扫描:

# Scan working copy changes versus HEAD
cm find . --diff

# Scan staged changes only (pre-commit)
cm find . --diff --staged

# Scan a pull request branch against the main branch in CI/CD
cm find . --diff=origin/main --format=sarif --output=results.sarif \
    --fail-on=CRITICAL,HIGH

如需了解端到端流水线配置,请参阅与 CI/CD集成。

优势

差异扫描速度快且具有确定性,通常在 2 分钟内完成,以缩短 CI/CD 流水线运行时。与仅检查更改的行的差异扫描器不同,--diff 会检查调用方和被调用方关系,以捕获跨文件安全回归和合同违规行为。由于它会抑制未触及代码中的结果,因此扫描只会阻止因更改而引入或受更改影响的问题的拉取请求,从而避免产生大量报告和不必要的构建失败。差异扫描还会发出 SARIF v2.1.0,以便直接集成到 GitHub 代码扫描注释和 Cloud Build 信息中心。

权衡取舍和限制

差异扫描仅分析拉取请求受影响区域内的代码,不会在代码库中未触及的部分查找预先存在的漏洞。 它还需要一个可以访问目标基本参考的 Git 代码库。

何时使用

在以下情况下使用差异扫描:

  • 在 CI/CD 流水线(例如 GitHub Actions、Cloud Build、GitLab CI 或 Jenkins)中对每个拉取请求运行自动检查。
  • 在将代码推送到远程仓库之前,验证预提交或预推送钩子中的本地更改是否干净。
  • 验证发布分支之间的合并不会引入回归。

深度扫描

深度扫描是一种详尽的扫描模式,专为全面的代码库级安全审核而设计。它使用并行工作器(使用 --deep-workers配置,默认值为8,支持的范围为1到16)同时审核整个 代码库中的源文件。在 发现候选发现结果时,它会根据 周围的代码上下文对其进行验证和证实,以过滤掉假正例,然后再报告结果。

以下示例演示了如何在代码库中运行深度扫描:

# Run an exhaustive deep scan across the entire repository
cm find . --deep

# Tune concurrency and use the cyber-specialized security model
cm find . --deep --deep-workers=8 --model=gemini-3.8-flash-cyber

优势

深度扫描可在大型企业代码库中提供高召回率和全面的漏洞发现,优于单会话扫描,并使用自动验证来保持高精度。它支持多种语言,并且与平台无关,可在 Gemini 支持的所有语言中使用,而无需特定于语言的编译器、构建设置或语法文件。它还通过将分析重点放在生产代码上,并最大限度地减少非生产文件上的计算和令牌消耗,来优化资源使用情况。

权衡取舍和限制

请勿将深度扫描用作阻止拉取请求的同步检查。深度扫描会执行彻底的代码库级分析。因此,与标准扫描或差异扫描相比,它需要更长的运行时和更高的令牌支出。

何时使用

在以下情况下使用深度扫描:

  • 在所有生产代码库中,按夜间或每周计划运行安排的安全审核。
  • 在主要版本发布或生产部署之前,执行完整的预发布安全审核。
  • 为 SOC 2、ISO 27001、FedRAMP 或 PCI-DSS 合规性和认证审核生成审核证据。
  • 将新代码库加入 CodeMender 时,建立初始安全基准。

选择查找模式

使用以下参考表为您的工作流选择合适的扫描模式:

工作流或环境 用例和目标 推荐模式 示例命令
本地终端 快速发现或对特定模块进行置信度检查 标准扫描 cm find ./src
本地终端 在推送之前对暂存的更改进行预提交检查 差异扫描 cm find . --diff --staged
CI/CD 流水线 对更改的代码和调用方进行自动拉取请求门控 差异扫描 cm find . --diff=origin/main --fail-on=CRITICAL,HIGH
安排的流水线或审核 夜间审核、预发布门控、SOC 2 合规性 深度扫描 cm find . --deep --deep-workers=8

按模式划分的命令标志参考

下表介绍了每种扫描模式支持的命令行标志。

常用标志(所有模式)

以下标志适用于所有 cm find 扫描模式:

标志 默认 说明
-c, --context TEXT "" 用于指导扫描代理的其他上下文,例如架构备注。
--model MODEL_NAME gemini-3.8-flash 要使用的 Gemini 模型 (gemini-3.8-flash、 gemini-3.8-flash-cyber)。
-y, --yes false 跳过所有交互式确认提示。
--unrestricted false 关闭文件系统沙盒。

差异扫描标志

以下标志用于配置 cm find --diff 扫描:

标志 默认 说明
--diff[=REF] 关闭 针对目标参考(例如 origin/main 或 HEAD~1)启用差异模式。如果没有 REF,则与 HEAD 进行比较。不能与 --deep 一起使用。
--staged 关闭 将差异范围限定为仅暂存的索引 (git diff --cached)。 需要 --diff。
--diff-depth DEPTH 1 影响分析的遍历深度(1 到 3,默认值:1 跳)。
--diff-workers COUNT 4 拉取请求审核作业的并发工作器数量(1 到 16)。
--diff-max-neighbors COUNT 10 要检查的依赖调用方或被调用方文件的数量上限。
--fail-on SEVERITIES CRITICAL,HIGH 导致 cm find 以 代码 1 退出的严重程度(以逗号分隔)。
--fail-on-truncation 关闭 如果邻居发现超出上限,则以代码 1 退出。
--format FORMAT table 输出格式:table、json 或 sarif。
--output FILE 标准输出 将报告写入文件,而不是标准输出。

深度扫描标志

以下标志用于配置 cm find --deep 扫描:

标志 默认 说明
--deep false 启用详尽的代码库级深度扫描。不能与 --diff一起使用。
--deep-workers COUNT 8 深度扫描的并发工作器数量(1 到 16)。