本文作者:科大讯飞安全专家 张德军
静态应用安全测试(Static Application Security Testing,简称SAST)产品可以帮助企业在应用的开发过程中,自动化发现应用程序代码中的安全漏洞和风险,对于企业的应用安全发挥着重要作用。
我所在的企业近期计划选购一款SAST商业化产品,但业界同类型产品多达数十款,评价的维度也有很多,抛开商务层面的因素,考虑到安全漏洞和风险的检测能力是一款SAST产品最核心的能力,因此我们希望能够选择一款检测能力最强的产品。
我们首先筛选出了三款产品作为我们的候选,分别是:某国外知名SAST产品A、某国外知名SAST产品B和某国产SAST产品C。
我们调研了业界目前对应用安全测试产品检测能力的测评方法,主要还是依赖一些公开的测试样本集,如webgoat、SecuriBench、Owasp Benchmark和Juliet等Benchmark。经过进一步的分析,我们发现这些测试集会存在以下几个问题:
(1)测试集的完整度得不到保障。我们初期曾尝试在拥有2000多个样本的Owasp Benchmark上做了测试,测试结果显示这三款SAST产品的召回率均为100%,这个结果使我们无法做出区分,也显然不符合实际情况,也说明了这些测试集的完整度无法得到保障。
(2)测试结果不具有可解释性,对用户是「黑盒」。基于已有的这些测试样本集得到的测试结果一般只能得到召回率和误报率的数据,但我们更希望能够看到产品检测能力「本源」上的差异,做到心中有数。
(3)已有测试样本集2016年以后都未曾更新,但SAST技术在不断发展,拿这些「老古董」去测评这些最新的SAST产品,测试结果也很难客观反映现实。
面对这三款SAST产品,如何从中选出检测能力最强的一款成为我们面临的一个挑战。
就在我们为此感到困惑的时候,我们注意到蚂蚁集团安全团队和浙江大学网络空间安全学院2023年合作共建并开源了一个xAST评价体系项目【1】,该项目着眼于对SAST/IAST/DAST等各类应用安全测试产品的安全检测能力进行评价。
与传统测试样本集相比,xAST评价体系给我们印象最深的有两点:
(1)传统测试样本集都是基于漏洞视角设计的,不同类型的产品(如SAST/IAST/DAST)共用同一套测试样本集,但应用安全测试技术原理各异,同一个样本集在不同类型产品之间不可能都适用。xAST评价体系在业界首次面向工具视角,为不同类型的工具分别设计了评价维度和评价项,再根据评价项设计得到测试样本。
面向工具视角,基于评价项设计出的测试样本集会更加体系化,更有针对性,样本的分布更均匀,也使得评价结果不再「黑盒」。用户可将工具在每个样本上的实际检测结果映射到对应的评价项,得到「体检报告」式的测试结果,如下图所示。
传统Benchmark与xAST评价体系测评结果对比【2】
xAST评价体系的评价维度包括完整度、准确度、兼容性、性能、接入成本等,每个评价维度又可以细化分成若干评价项,每个评价项对应一个测试样本,详情可参考【1】。
(2)xAST评价体系根据产品的检测原理,在业界率先对评价项做了分层设计,包括引擎能力、规则能力和产品能力,目前已经开源的是引擎能力层面的评价体系。
本质上,应用安全测试产品的能力是分层的。有的能力比较底层,如污点数据跟踪能力,这类能力通常实现的难度较大,成本较高,是需要用户重点关注的;有的能力属于比较上层,如对某个sink点的支持,通过简单的配置就可以实现。传统漏洞样本集没有对这些能力做区分,测试结果无法区分究竟是规则没有配置导致还是引擎能力上不支持。
我们也通过开源社区联系了蚂蚁负责xAST评价体系项目的安全专家,了解到该项目自2023年开源以来,已有包括阿里和华为等二十余家企业用户用于各类商业化采购和开源应用安全测试产品的选型,并作为测评标准用于开放原子开源基金会对开源安全工具的测评。
基于以上原因,我们本次产品选型决定采用xAST评价体系,来对这三款SAST产品的检测能力进行测评。
基于xAST评价体系,我们对这三款SAST产品在Java语言上的检测能力进行了测试,本次测试主要关注的是检测完整度和准确度这两个维度,测试结果如下表所示。
产品 | 完整度 | 准确度 |
某国外SAST产品A | 84% | 44% |
某国外SAST产品B | 76% | 77% |
某国产SAST产品C | 98% | 77% |
除此之外,我们将测试结果和xAST评价体系的评价项进行了映射,得到了以下更为详细的测试结果,可以更细粒度的了解三款产品检测能力上的差异。
在检测完整度方面,评价体系主要分成污点对象跟踪的完整度和污点链路跟踪的完整度两个方面。污点对象跟踪的完整度主要考察的是SAST对各种对象或基础数据类型是否都能支持污点的跟踪;污点链路跟踪的完整度主要考察的是SAST对各种污点链路传播场景是否都能支持。
在检测准确度方面,评价体系主要分成污点跟踪流敏感、对象敏感、域敏感、路径敏感和上下文敏感这五个维度进行评价。
SAST准确度评价项说明表
准确度评价项 | 评价项说明 |
流敏感 | 可对程序的执行顺序进行分析 |
对象敏感 | 支持对不同路径中的同名对象、对象的状态和作用域的分析 |
域敏感 | 支持针对对象、容器等数据类型上字段或者元素的分析 |
路径敏感 | 支持对分支路径的分析 |
上下文敏感 | 结合函数调用的上下文信息,支持对一个函数在实际参数或全局变量不同的情况下,不同执行路径的分析 |
三款SAST产品Java语言检测能力测评结果(部分)对比表
评价维度 | 评价大类 | 评价项 | 某国外产品A | 某国外产品B | 某国产产品C |
完整度 | 污点对象跟踪完整度 | 数组对象跟踪 | 检出 | 检出 | 检出 |
Integer跟踪 | 检出 | 未检出 | 检出 | ||
Char跟踪 | 检出 | 检出 | 检出 | ||
数组中元素跟踪 | 检出 | 未检出 | 检出 | ||
... | ... | ... | ... | ||
污点链路跟踪完整度 | 函数嵌套调用传播 | 未检出 | 检出 | 检出 | |
反射调用传播 | 未检出 | 未检出 | 未检出 | ||
this调用传播 | 检出 | 未检出 | 检出 | ||
Lamda表达式传播 | 检出 | 未检出 | 检出 | ||
native方法传播 | 检出 | 未检出 | 检出 | ||
三元运算符传播 | 未检出 | 未检出 | 检出 | ||
强制类型转换传播 | 未检出 | 未检出 | 检出 | ||
..... | ... | ... | ... | ||
准确度 | 污点跟踪流敏感 | 污点被赋值为hardcode值 | 误报 | 误报 | 准确识别 |
污点跟踪对象敏感 | 同名对象混淆 | 误报 | 准确识别 | 准确识别 | |
污点跟踪域敏感 | map中部分元素为污点 | 误报 | 准确识别 | 准确识别 | |
queue中部分元素为污点 | 误报 | 误报 | 误报 | ||
字符串中部分字符为污点 | 误报 | 误报 | 误报 | ||
... | ... | ... | ... | ||
污点跟踪路径敏感 | ...... | ... | ... | ... | |
污点追踪上下文敏感 | ...... | ... | ... | ... |
通过详细的测评结果,我们可以得到以下结论:
(1)在检测完整度方面,某国产SAST产品C综合能力最强,某国外SAST产品A次之,某国外SAST产品B的能力表现相对较弱。
某国产SAST产品C支持了绝大部分的污点对象跟踪场景和污点链路传播场景,只是在反射调用污点传播场景未支持检出。
某国外SAST产品A也支持了绝大部分污点对象的跟踪;在污点链路跟踪场景中,针对较为常见的场景支持程度较好,但不支持函数嵌套调用、多种语法糖组合(如this调用+lambda表达式)、三元运算符和强制类型转换等共18个污点传播场景。
某国外SAST产品B在污点对象的跟踪方面有5种类型未能支持;在污点链路跟踪场景中,不支持Lambda表达式、native方法、数组特定元素的传参和this调用等共23个污点传播场景。
(2)在检测准确度方面,某国产SAST产品C综合能力最强,某国外SAST产品B次之,某国外SAST产品A的能力表现相对较弱。
某国产SAST产品C在流敏感和对象敏感方面都支持较好;在域敏感方面针对部分场景存在误报,如Queue对象中部分元素为污点等场景。
某国外SAST产品B对对象敏感场景支持较好,但是对于流敏感、以及部分的域敏感场景支持不足,如污点对象被重新赋值为安全的硬编码值(hardcode)、Queue对象中部分元素为污点等场景。
某国外SAST产品A在这几种场景的能力均不足,误报较为严重。
字符级污点跟踪(即一个字符串中仅部分字符为污点的传播场景)三款SAST都不能完全支持,这也是SAST产品的原理所导致的,属于SAST较难检测的场景。
通过本次测评,某国产SAST产品C的检测能力是超出我们预期的,在Java语言上的检测能力已经赶超了国外一流的同类产品,综合表现最优。
此外,通过xAST评价体系开源项目,确实能更完备、更细粒度的展现应用安全测试产品的检测能力,让这些应用安全测试产品对用户不再「黑盒」。目前xAST评价体系在SAST领域暂时只支持Java和Node语言,我们也期待可以支持更多的语言,更全面的体现SAST产品的检测能力,满足更多用户的测评需求。
【1】xAST评价体系社区首页:https://xastbenchmark.github.io
【2】xAST评价体系Github:https://github.com/alipay/ant-application-security-testing-benchmark