敏感性在静态代码分析中的作用

敏感性作为代码分析精度的重要指标,在学术界经常被研究人员提及。但工业界或者工具使用者对这些概念可能是不清楚的,导致在选择静态分析工具或者评价静态分析工具的优劣仅从功能、效率、是否支持CI/CD等角度,我们不否认这些功能对于易用性很重要,但是静态分析工具最有价值的地方在于其分析引擎的能力,就像评价汽车的发动机引擎的能力是衡量一辆车价值的重要指标。代码分析引擎的优劣的评价标准是其检测缺陷时,支持的各种敏感分析的能力本文就一些基本概念进行一下简单介绍,以供代码分析工具使用者们参考。

敏感性是指分析方法对程序特征的敏感程度。这些特征包括程序的控制流、数据流、动态执行所有可能的路径、函数调用上下文以及对象的属性等。敏感性是衡量静态代码分析精度的关键因素,不同的敏感性方法对代码的检测能力和精度产生重要影响。举一个非敏感性的例子,如静态分析工具在系统中发现与SQL相关的API语法时如java.sql.Statement.executeQuery都报出SQL注入问题,而不检查SQL命令是否来自不受信任的输入以及真正执行时到达的可能性。这种方法使工具永远虽然不会有漏报,但报告每一个与SQL相关的API使用情况只会使工具可用性降低,产生大量不需要程序员修复的误报。为了提高安全工具的可用性,支持和实现各种分析敏感性是非常重要的。

一个简单的例子

考虑以下代码片段GetUserInput返回一个由外界输入的字符串,也就是是不可信的外界输入源。如果该输入最终成为Execute方法的参数,该函数将给定的参数作为操作系统命令运行,这就意味着在这里存在命令行注入风险。

1 a = 3; b = 2;2 input = String.Empty;3 if (a < b)4 {5    input = GetUserInput();6 }7 else8 {9    input = String.Empty;10 }11 Execute(input);

人工分析代码,我们可以看到Excute方法不可能执行来自于GetUserInput的不受信任的输入,因为只有当a小于b时,才会调用GetUserInput。如果静态代码分析工具报出了命令行注入缺陷,那么开发人员可能不会去修改。这个例子很简单,因为a和b的值是常量。但如果它们是变量,代码分析工具需要去计算其可能的数值范围,这对代码分析功能的能力才是真正的挑战,不


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部