问题检出率提升
在代码分析中,问题的检出率是指:(被正确识别出的真实问题数量 / 项目中实际存在的真实问题总数)× 100%。
问题的检出率会受到诸多因素影响,如规则配置、项目依赖、新披露漏洞等,高的检出率也可能导致高误报率的出现,而何为误报不同的业务团队其理解会有所偏差。因此,提高问题检出率的同时,也需要理性的看待误报,综合而言需要从工具、流程、规则配置和团队协作等多方面采取优化手段。
TCA 运用词法分析、语法分析、控制流、数据流分析等技术自研增强分析工具,并集成众多知名开源工具,可覆盖业内三十多门语言,结合内部多年问题检出率提升经验,可以采用包括且不限于以下的提升策略:
分析规则方案设计。
自定义工具和规则。
工具规则升级与同步。
问题无需修复处理策略。
1. 分析规则方案设计
TCA 覆盖了业内 30 多门语言,具有丰富的工具库、规则库,并根据一些特定关注点,或不同用途设计了丰富的规则包,如代码规范规则包、敏感信息规则包等。
业务团队可以根据项目需求、团队规范、安全要求等,灵活地选择、搭配不同的规则包,或者从规则库中挑选规则,例如使用编译型工具规则,运用多种分析技术对项目进行更加深入、准确的分析。
通过多工具规则互补,以及选用合适的规则,可以有效提升项目问题的检出率。
2. 自定义工具和规则
TCA 具有丰富的规则库,虽然能够覆盖大量常见问题,但业务相关性较弱,对于特定业务逻辑下的问题,或特定项目、框架、技术栈的个性化问题仍存在其局限性。
为此,TCA 提供了自定义工具和规则、框架适配,以及规则参数配置等能力,使其更精准、更全面地识别出真实存在的问题,提升项目问题的检出率。
规则参数调配:部分规则具有默认配置,支持规则参数调整,以调整规则的检测广度和深度。
默认配置不一定符合业务需求,可能导致问题的漏报或误报,需要业务团队根据实际需求调整参数。例如针对行长度检测规则调配行长度,针对同名变量隐藏检测规则配置开启严格模式等。
自定义规则:部分工具支持自定义规则、框架适配等,可根据业务需求编写,例如针对某些关键字或函数、配置项检查等自定义规则,或定义污点、清洗函数等以适配内部框架。
自定义工具:有些团队内部自研了一些工具,或使用了一些开源/商业工具,TCA 支持自主接入工具,可以自行接入从而扩展工具规则库,达到提升检出的效果。
TCA 团队定制:对于现有规则或自定义工具规则无法满足的场景,例如一些更为复杂的业务逻辑问题,TCA 提供规则定制服务,可向 TCA 团队提出相关需求。
3. 工具规则升级与同步
TCA 会持续迭代升级工具规则,通过不断优化误报与漏洞、适配语言与框架的新变化、提升增强分析能力等,来不断丰富规则库、提高问题检出率。
业务团队可以通过工具的功能升级、版本更新、规则增强、高级分析能力启用以及工具链的优化组合,提升代码分析的深度、广度和精准。
通常 TCA 会通过以下渠道来迭代升级工具规则:
业界新披露漏洞:随着时间发展,业界可能会出现一些新披露的漏洞,例如 Log4j 漏洞,TCA 团队会根据一些业界新披露漏洞研发实现一些工具规则来进行覆盖。
团队工具规划:TCA 团队会根据内部工具发展规划,进行相关工具规则的迭代,在内部灰度迭代后准备开放使用,例如 CodeLingo 等 AI 辅助检查工具。
客户规则需求定制:TCA 团队会根据内外客户需求,运用词法分析、语法分析、控制流、数据流分析等技术,定制一些规则来覆盖这些需求,并评估其安全性、合规性、通用性后开放使用。
4. 问题无需修复处理策略
业务研发通常更关心检出问题是否需要进行修复,而那些业务视为无需修复的问题往往会导致业务团队吐槽,甚至全都归咎于工具误报。
正确理解误报
误报是应用时为了便于理解而口语化的表达,在静态分析里,实际上不存在误报。只有静态信息链路不完整,分析链路断裂时,会以推测的形式发现并展示问题,工具会优先暴露代码问题,再由业务对应的研发人员来确认是否需要标记忽略(下次就不会再报了)。从而驱动研发人员精准 CodeReview,减少了泛 Review 的成本。
对于业务视为无需修复的场景通常有:
测试/无用代码,业务实际未使用漏洞所在代码;
重复问题,问题已经在其他分支中解决;
无需修复,工具分析无误,但该代码设计如此,或因历史问题暂时无需处理;
工具误报,工具分析不准确。
当出现上述场景,需要分析原因,并结合工具规则设计和业务实际场景理性的处理问题。可以采用包括且不限于以下的处理策略:
项目仓库中可能含包含了测试代码,自动生成代码,第三方代码,这些代码可能带来大量问题干扰,也降低了分析效率。可通过指定分析目录、路径过滤、过滤 Git 子模块等配置,集中分析资源于业务核心代码,提升分析效率、提升问题检出率和修复率。
项目仓库可能历史悠久,有些问题需要标记无需处理,可以通过代码注释忽略、平台标记忽略等方法进行处理。通常建议使用代码注释忽略来处理,不仅可以从源头记录问题处理原因,还能避免在不同分支上发现相同问题。
同一代码库不同的分支下发现了相同问题,已经在一个分支下进行了问题忽略处理,可以通过配置代码注释忽略、问题全局忽略等方法避免重复问题上报。
对于工具误报:部分工具规则为尽可能发现问题避免漏报,会采用较为“严格”的策略,辅助人工全面 review 代码,或者规则在特定业务场景下并不适用,如一些安全性规则。针对工具误报场景,也可以通过代码注释忽略、平台标记忽略等方法来处理;与此同时,可以向 TCA 团队进行反馈此场景,帮助代码分析工具不断迭代优化其检测规则或配置,从而降低误报率。
当业务团队无需修复处理的问题得到有效控制,业务团队内才能够更加聚焦于工具真正发现的问题,间接地提高对真实缺陷与安全漏洞的关注度与处理效率,最终实现在保持低误报的同时提升问题检出率。