毕业论文
您现在的位置: 语言识别 >> 语言识别前景 >> 正文 >> 正文

为什么没有完美的静态分析仪,在理论和实践

来源:语言识别 时间:2022/10/26
白癜风治疗最新方法 http://m.39.net/baidianfeng/a_4249431.html

如今,如果不使用静态代码分析方法,很难想象开发高质量的软件。静态代码分析可以内置到开发环境中(使用标准方法或使用插件),可以在将代码运行到商业操作之前由专用软件执行,或者由全职或外部专家“手动”执行。通常有一种理由认为动态代码分析或渗透测试可以取代静态分析,因为这些验证方法将揭示真正的问题并且不存在误报。然而,这是一个有争议的问题,因为与静态分析相比,动态分析不会检查所有代码,而只会检查软件对模拟攻击者行为的一组攻击的弹性。攻击者可能比验证者更具创造性,无论谁执行验证:人员或机器。只有在完全测试覆盖率上执行动态分析时才会完成动态分析,这应用于实际应用程序是一项艰巨的任务。测试覆盖完整性的证明是算法上无法解决的问题。对软件代码进行必要的静态分析是调试具有更高信息安全要求的软件的必要步骤之一。

目前,市场上有许多不同的静态代码分析器,并且越来越多的新的静态代码分析器不断出现。实际上,有些情况下,一起使用多个静态分析仪来提高检查质量,因为不同的分析仪会寻找不同的缺陷。为什么没有通用的静态分析器可以完全检查任何代码并发现其中的所有缺陷而没有误报,同时可以快速工作并且不需要大量资源(CPU时间和内存)?

关于静态分析仪的架构

这个问题的答案在于静态分析仪的架构。几乎所有的静态分析器都是按照编译器的原理以某种方式构建的,也就是说,他们的工作包含转换源代码的步骤-与编译器相同。

一切都以词法分析开始,词汇分析以高级语言接收程序文本的输入,并且词汇流传递到输出。然后将得到的标记流传递给语法分析器的输入,语法分析器解析语言结构并将解析结果传递给语义分析器。,由于其工作执行内部代表的建设准备。该内部表示是每个静态分析器的一个特征。分析仪的效率取决于它的成功程度。

许多静态分析仪制造商声称它们对分析仪支持的所有编程语言使用通用内部表示。通过这种方式,他们可以分析以多种语言开发的软件代码,而不是单独的组件。分析的“整体方法”允许您避免在软件产品的各个组件之间的接口处出现缺失。

从理论上讲,这是事实,但在实践中,所有编程语言的通用内部表示都是困难且低效的。每种编程语言都很特别。内部表示通常是树,其顶点存储属性。通过遍历这样的树,分析器收集并转换信息。因此,树的每个顶点必须包含一组统一的属性。由于每种语言都是唯一的,因此只能通过组件的冗余来保持属性的一致性。异构的编程语言越多,每个顶点的特征中的异构组件就越多,这意味着内部表示在内存中效率低下。大量的异构特征也会影响树步行者的复杂性,因此导致生产率效率低下。

静态分析仪的优化转换

为了使静态分析器在存储器和时间内有效工作,必须具有紧凑的通用内部表示,这可以通过将内部表示分成若干树来实现,每个树都是为相关的编程语言开发的。优化工作不限于将内部表示划分为相关的编程语言。接下来,制造商使用各种优化预转换-与编译器技术相同,特别是循环的优化转换。关键在于,静态分析的目标理想情况是在程序执行过程中对数据进行推广,以评估程序执行过程中的转换。因此,数据必须在循环的每个回合中“前进”。因此,如果你节省了这些转弯并使它们显着减少,那么我们将在内存和性能方面获得显着的好处。为此目的,积极地使用这种变换,其有可能通过最小次数的通过将数据转换外推到循环的所有周期。您还可以通过计算程序执行将跟随特定分支的可能性来节省分支。如果通过分支的概率低于指定的概率,则不考虑该程序的该分支。显然,这些转换中的每一个都“失去”了分析仪必须检测到的缺陷,但这对于内存和性能方面的效率来说是“费用”。

什么是静态代码分析器?

传统上,以这种或那种方式感兴趣的入侵者以及因此审计员的缺陷可以分为以下几组:

验证错误信息泄漏错误验证错误。验证错误是由于未充分检查输入数据的正确性。攻击者可能会入侵,因为输入数据不是程序所期望的,因此会受到未经授权的访问控制。最常见的数据验证错误是注入和XSS。。攻击者不是使用有效数据,而是向程序输入提供带有小程序的特制数据。正在处理的程序被执行。执行的结果可能是将控制权转移到另一个程序,数据损坏等等。此外,作为验证错误的结果,可以执行用户工作的站点的替换。可以通过静态代码分析方法定性地检测验证错误。信息泄漏错误-由于处理结果导致用户敏感信息被截获并传送给攻击者,因此这些都是错误。可能相反:在系统移动到用户的过程中,存储在系统中的敏感信息被拦截并传送给攻击者。此类漏洞与验证错误一样难以检测。检测到这些错误需要跟踪整个程序代码中数据的提升和转换的静态。这需要实施诸如污点分析和过程间数据分析之类的方法。分析的准确性,特别是误报和遗漏错误的最小化,取决于这些方法的开发程度。此外,静态分析器的准确性中的重要作用由缺陷检测规则库,特别是用于描述这些规则的格式起作用。所有这些都是每个分析仪的竞争优势,并且小心翼翼地保护竞争对手。身份验证错误是攻击者最有趣的错误,因为它们难以检测,因为它们发生在组件的连接处,很难形式化。攻击者利用这些类型的错误来升级访问权限。自动地,未检测到身份验证错误,因为不清楚要查找的内容-这些是程序构建逻辑的错误。

内存错误

它们很难被检测到,因为为了准确识别,需要解决繁琐的方程组,这在内存和性能方面都很昂贵。因此,减少了方程组,因此失去了准确性。常见的内存错误包括use-after-free,double-free,null-pointer-dereference及其变体,例如,越界-读取和越界-写入。当另一个分析仪未能检测到内存泄漏时,您可以听到此类缺陷难以利用。攻击者必须具备高资格并使用大量技能,首先要了解代码中是否存在此类缺陷,其次,要进行攻击。好吧,进一步的论点是:“你确定你的软件产品对这个级别的大师来说很有意思吗?”......然而,历史知道成功利用内存错误并造成相当大的破坏的情况。这种众所周知的情况的例子包括:

CVE---openssl库中的错误-重新发出所有证书并重新生成密码所需的私钥的潜在危害。CVE---在mozillafirefox中的js实现错误-边界检查。CVE---在InternetExplorer中免费使用-可远程利用。CVE---AcrobatReader-代码执行。更多攻击者喜欢利用与线程或进程的不正确同步相关的缺陷。这些缺陷很难在静力学中识别,因为在没有“时间”概念的情况下对机器状态进行建模并不是一件容易的事。这是由于竞争条件错误造成的。今天,即使在非常小的应用程序中,并行性也随处可见。综上所述,应该注意的是,如果正确使用,静态分析仪在开发过程中是有用的。在操作过程中,有必要了解对它的期望以及如何处理静态分析仪原则上无法识别的缺陷。如果他们说在开发过程中不需要静态分析器,那么它根本就不知道如何利用它。

转载请注明:http://www.0431gb208.com/sjsbszl/2131.html