分支扫描看起来覆盖不全,常见有两类情况:一类是分支确实没有把该扫的分支触发起来,或文件被过滤规则排掉了;另一类是你在拉取请求也称为Pull Request的视图里只看到New Issues,以为老问题没扫到。先把现象归类,再去改触发分支与文件过滤,会比反复重跑扫描更快。
一、Checkmarx分支扫描覆盖不全怎么办
分支覆盖不全先别从引擎参数下手,先把触发、分支基线、文件过滤三条线核清楚。很多团队的分支扫描用的是增量思路,结果页天然强调变化项,你需要先确认是显示口径问题还是扫描输入真的缺了。
1、先确认你看的是否是Pull Request差异视图
在代码仓库集成场景里,平台会把源分支的扫描结果与目标分支的最近一次扫描做对比,并在结果里突出New Issues与Fixed Issues,开发同事常因此误判为只扫了部分内容。你先在Checkmarx One里切到完整结果列表或对应分支的扫描记录,再判断是否真的缺文件缺目录。
2、核对目标分支有没有定期跑完整扫描当作基线
分支增量扫描依赖目标分支的基线结果,官方也建议目标分支保持高频全量扫描,同时开发分支在提交前从目标分支同步最新变更,避免对比基线过旧导致你看到的覆盖与差异都不可信。
3、检查分支是否真的触发了扫描
到项目配置里确认【Scan Trigger】是否开启Push与Pull request触发,如果触发关闭或权限未刷新,某些分支提交不会自动起扫,表现就是某些分支长期没有扫描记录。
4、确认你要扫的分支是否在允许扫描的分支范围内
项目创建或迁移时通常要选受保护分支,也支持用通配符分支模式来决定哪些分支会触发扫描,比如feature/*这类规则。分支不在清单里时再怎么提交也不会起扫,先把分支纳入范围再看覆盖。
5、排查是否被gitignore或过滤器排除了文件
如果你启用了--use-gitignore,Checkmarx One会按仓库的gitignore规则排除目录与文件,这很容易造成某些路径在分支扫描里完全不出现。先确认是否启用该开关,再决定是调整gitignore还是改用更精确的扫描过滤。
6、遇到提示找不到文件或克隆后无文件时先查过滤参数是否写错
有些环境里错误使用--file-include或--file-filter会导致扫描输入为空,官方建议改用--sast-filter与对应的扫描器过滤参数。出现这类现象不要硬跑扫描,先把过滤参数恢复到可产生输入集的状态。
二、Checkmarx分支扫描范围怎么设定
分支扫描范围要分两层设定,第一层是扫哪些分支,第二层是每次扫描把哪些文件与目录纳入。分支层解决起扫与覆盖面,文件层解决代码量、噪声与性能。
1、在项目接入仓库时选定受保护分支作为扫描范围
创建项目或调整仓库设置时,在【Select Branches】界面选择要扫描的受保护分支,保存后这些分支发生触发事件才会起扫。多仓库项目要分别在仓库级设置里确认分支选择是否一致。
2、需要覆盖大量功能分支时用通配符分支模式
当你们的分支命名有固定前缀,比如feature/或release/,可以用feature/*这类通配符模式把同前缀分支纳入扫描触发范围,避免每开一个新分支都要手动加一次。
3、用扫描触发开关决定哪些事件会启动分支扫描
在项目配置里打开【Scan Trigger】并分别启用Push与Pull request触发,确保开发分支提交与拉取请求创建时都能触发扫描。改完权限相关项后记得点【Refresh repository permission】再保存。
4、用SAST过滤参数定义分支扫描的文件范围
在Checkmarx One里可用scan.config.sast.filter或命令行参数--sast-filter设定包含与排除规则,支持写文件类型与文件夹规则,包含示例为*.java,*.js,排除示例为!*.min.js,也支持用逗号串起来,且不支持正则表达式。把这一层设定清楚,分支扫描就不会被无关文件拖慢。
5、SCA扫描范围用对应的文件夹与文件过滤项单独设定
如果你同时跑SCA,SCA也有Folder or file filter能力,写法同样支持包含与排除通配符。不要把SAST的过滤当成全局过滤,分别在对应扫描器配置里设置,避免你以为只影响分支扫描结果,实际把依赖分析也过滤空了。
6、使用老版本CxSAST时用排除列表与通配符规则控制范围
如果你们还在用CxSAST 9.x体系,可在扫描配置里填写排除列表,按文档的语法用逗号分隔条目,支持通配符与正斜杠反斜杠路径写法。分支覆盖不全时也要反查这里是否把关键目录排除了。
三、Checkmarx分支覆盖校验与基线维护怎么做
把范围设好了,还需要一套校验办法确认分支扫描真的扫到了你关心的目录与语言,否则一旦过滤过度或分支触发失效,很容易过几周才被发现。下面这套做法更偏日常运维,能把覆盖问题提前暴露出来。
1、为目标分支建立固定节奏的全量扫描基线
把主干或目标分支设置为固定频率跑完整扫描,结果用作分支对比基线,避免分支扫描只呈现差异而你又缺少可对照的全量结果。
2、每次改分支范围后做一次触发验证
改完分支选择或通配符后,立即在一个符合规则的分支上做一次Push事件与一次Pull request事件,确认Checkmarx One能看到扫描开始与完成的提示,再把变更推广到全团队。
3、用小范围过滤做冒烟校验再放大范围
先把--sast-filter设成只包含一两类源代码后缀与一个关键目录,跑通并确认命中与路径覆盖正常,再逐步放开到全仓库,能减少一次性配置过猛导致无文件可扫的风险。
4、把gitignore参与扫描的决定写进团队约定
如果你们启用了--use-gitignore,就要明确哪些目录必须在gitignore里保持可见,哪些构建产物应当排除,避免某个团队为了本地体验改了gitignore,结果把安全扫描输入集也一并改没了。
5、出现覆盖争议时用同一分支同一提交点复现对比
让研发提供具体分支名与提交哈希,在平台里找到对应扫描记录,对照过滤规则与分支对比口径,再判断是显示差异导致误会还是扫描输入真的缺失。这样沟通成本最低,也避免大家各说各的。
总结
Checkmarx分支扫描覆盖不全,优先按三步排查:先确认你看的是否是Pull Request差异口径,再确认目标分支是否有稳定全量基线与分支触发是否开启,最后回到分支选择与文件过滤规则看是否把关键分支或关键目录排掉。分支范围用受保护分支与通配符分支模式控制,文件范围用--sast-filter与对应扫描器过滤项控制,必要时注意gitignore参与过滤会直接影响扫描输入集。