静态分析的演进:从模式匹配到数据流分析在sa-tests-db中的应用
静态分析器通过使用sa-tests-db语料库对六种语言(C、C#、Go、Java、JavaScript、Python)进行分析,符合GOST R 71207-2024标准。这得益于从基于模式的搜索转向数据流分析,该方法考虑了过程间调用、控制流和结构中的字段敏感性,从而最小化各类错误类型的误报和漏报。
基于模式搜索的局限性
基于模式的分析在几行代码的上下文中查找危险调用,如sprintf、system或SPI_execute。它适用于快速初步扫描,但存在局限性:
- 不考虑数据在定义点和使用点之间的流动。
- 误报源于可疑代码的偶然邻近,而无实际关联。
- 会遗漏通过函数或文件传递的长链。
在外部sa-tests-db语料库上,这些局限性迅速显现,促使转向数据流分析。
数据流分析
转向数据流分析回答了这个问题:来自源(如getenv、recv、fgets)的数据能否到达危险接收点?这构建了值定义和使用之间连接的关系图。
优势:
- 通过验证实际路径减少误报。
- 发现函数间路径。
在实现中,分析器跟踪污点传播,排除无关值。
过程间分析
函数内数据流不足以应对通过调用链传递的真实漏洞。过程间层连接参数与参数:
- 跟踪返回值。
- 分析调用中的参数。
- 构建跨文件路径的调用图。
没有这一层,模式仅能看到局部块,失去系统上下文。
考虑控制流
数据路径的存在并不保证漏洞。路径可能被以下因素阻断:
- 验证。
- 错误处理。
- 权限检查。
- 逻辑上不可达的分支。
集成控制流分析对路径进行分类:
- 无条件(高优先级)。
- 有条件(需要手动审查)。
这过滤了噪声,提高了报告准确性。
结构中的字段敏感性
在结构中,一个字段的污点不应传播到整个结构。区分字段可减少误报:
- 为每个字段单独跟踪
污点。 - 在到达接收点时排除安全字段。
这些细节对于具有复杂数据的生产代码至关重要。
混合分析器架构
最优方法结合了多个阶段:
- 基于模式的预扫描以筛选候选。
- 过滤明显安全的情况。
- 对剩余部分进行完整数据流分析。
- 基于确认路径进行优先级排序。
- 降低未确认路径的等级。
这平衡了速度和准确性。
sa-tests-db在开发中的作用
sa-tests-db集合作为外部基准,用于检测符合GOST R 71207-2024的错误类型。它在变更期间检测回归:
- 指标:按语言划分的误报和漏报。
- 不是聚合平均值,而是按类别细分。
2026年3月23日的一次运行确认了C、C#、Go、Java、JS、Python的资格。
关键要点
- 模式仅适用于快速过滤;数据流对于准确性至关重要。
- 过程间+控制流分析可发现80%的真实路径。
- 字段敏感性在结构中减少30–50%的噪声。
- sa-tests-db是回归测试,而非一次性演示。
- GOST要求按错误类型提供指标,而非总体数据。
— Editorial Team
暂无评论。