当前位置:首页 > 专题范文>公文范文> 正文

计算机安全漏洞动态检测研究

木木文档网 发表于:2022-11-07 13:50:17 来源:网友投稿

摘要:计算机安全性问题是使用电脑时最关心的问题之一。为了构建安全的软件设计体系,防止各种外部干扰对软件的攻击和破坏,软件设计过程中对安全漏洞的检测和防护就显得尤为重要。本文对软件设计中各种安全漏洞动态检测技术的详细分析,总结出各种动态检测技术的优、缺点,为在各种软件设计中正确选用适合的检测技术提出有力的参考依据。

关键词:计算机软件;安全漏洞;检测研究

中图分类号:TP307 文献标识码:A

计算机和网络赖以生存的基础就是软件,而软件的安全漏洞直接决定了软件的性能。安全漏洞是指在计算机系统中软件及协议的具体实现或系统安全策略上存在安全方面的缺陷,软件中存在安全漏洞是导致入侵的根本原因,如何预先检测,找出软件中存在的安全隐患,及时修正存在的安全漏洞,最大程度地降低软件安全所带来的风险,己成为信息安全领域的一个重要研究内容。本文将详细分析计算机软件检测中的动态检测方法,讨论各种具体的实施方法的优缺点。

1 计算机安全动态检测方法概述

程序在设计以及执行期内有很多共性的东西,比如有控制流(control Flow)和数据流(Data Flow)。一个进程的内存映射会被分为代码段(text section)、只读数据段(rdata section)、数据段(data section)、资源段(rsrc section)、堆(heap)、栈(stack)等多个部分。当然在不同的操作系统下它们的多少会有所不同,比如在UNIX下通常还会有未初始化的数据段(Bss)等等。动态检测方法就是在不改变源代码甚至是二进制代码的情况下,对程序的弱点进行检测的方法,这类检测主要通过修改进程运行环境来实现。

动态检测方法主要有:非执行栈(Non-Executable Stack)、非执行堆与数据(Non Executable Heap/data)、内存映射(Memory Mapping)、安全共享库(sale Shared Libraries)、沙箱(sandbox)和程序解释(Program Interpretation)等。

2 计算机安全动态检测技术探讨

2.1 非执行栈技术

基于栈进行软件攻击的事件最近几年经常发生,原因就是很多操作系统的栈是可以写与执行的,而且内部变量尤其是数组变量都保存在栈中,攻击者向栈中注入恶意代码,然后想方设法来执行这段代码。栈攻击技术的文档也比较全面,这从某种程度上加速了基于栈的攻击。一个最直接的防范栈攻击的方法就是使得栈不能执行代码。这样即使攻击者在栈中写入了恶意代码,这个恶意代码也不会被执行,在一定程度上防住了一些攻击者。只是这个方法需要在操作系统层进行修改,同时,不可执行栈的技术涉及到的一个大问题就是性能问题。此外,在既有栈溢出漏洞又有堆溢出漏洞的程序中,易出问题。可以利用栈溢出使程序跳转至攻击代码,该代码是被放置在堆上。没有实际执行栈中的代码,而是执行了堆中的代码。该技术所付出的代价就是对操作系统内核引入一个微小的改变:把栈页标记为不可执行。

该技术的检测不够全面,它仅能检测并阻止摧毁栈攻击。一个攻击者可以通过把恶意代码注入到数据段来绕过该技术的检测,他只需要把栈中返回地址覆盖掉,使得这个返回地址指向数据段中的恶意代码就可以了。该技术可能会造成小量的兼容性问题,因为有个别的应用程序就是依靠栈执行来正确运行的。该技术对性能的消耗可以被忽略,有报告称这项技术仅仅在上下文切换时增加了2到3个CPU的指令周期。

2.2 非执行堆与数据技术

由于堆是程序运行时动态分配内存的区域,而数据段则是程序编译时就初始化好了的。很长时期以来,由于担心非执行的堆与数据段会破坏软件的正常运行,所以该方法进展缓慢,最近几年才有些进展和文章。如果堆和数据段都不能执行代码,攻击者注入其中的恶意代码将不能被执行。这项技术和前面的非执行栈技术结合能起到更全面的作用,使得恶意代码彻底失去执行机会。使用该技术所付出的代价要比非执行栈技术大一些,因为它对内核的修改要多一些。现在已经有了大量的实例可以使用,这个技术还是可以接受的。

从全面性上来看,该技术对于几乎所有的利用把恶意代码注入进程内存中的攻击都可以检测并阻止。但是,对于恶意修改函数指针和函数参数的攻击没有办法检测和防范。该技术改变了传统程序在堆或数据段中动态生成代码的方式,会造成很多应用程序的不兼容性。另外,使用这个技术来检测并排除漏洞对很多的应用不会产生太大影响,性能上的消耗也可以忽略。

2.3 内存映射技术

有些攻击者通过使用NULL结尾的字符串来覆盖内存,以达到攻击的目的。通过使用映射代码页方法,将使得攻击者很难通过NULL结尾的字符串来跳转到较低的内存区,而且这些代码本身又可能含有NULL字符。再者,把代码页随机地映射到不同的内存地址,在某种程度上防止了那些靠猜地址来进行攻击的攻击方法。比如对于缓冲区溢出的漏洞,攻击者就是要寻找目标进程在内存中的某些地址,然后构造自己的数据来覆盖这些地址。这些地址在很多操作系统上都是有规律可以计算出的。如果使用内存映射技术,把代码页映射到随机的地址,将给攻击者增加很大的困难,不做大量的尝试是不可能查出所需地址的。使用内存映射技术所付出的最大的代价就是要修改操作系统内核、使得操作系统可以把代码页映射到较低的内存空间。虽然这个技术不需要对代码进行修改,但要重新链接,因为二进制的地址在程序链接阶段就确定了。

内存映射技术可以检测并阻止基于内存中地址跳转的攻击。但它对于注入新代码并执行新代码的攻击不能检测和预防。除此之外,因为低端内存是有大小限制的,想把所有的代码页都映射到低端内存在有些应用中是不可行的。内存映射技术仅仅对那些依靠固定地址或使用高端地址的应用程序有影响。而这样的应用程序并不多。内存映射技术对性能的消耗也可以忽略,它仅仅是在程序装载的过程中工作,运行起来之后对程序没有任何影响。

2.4 安全共享库技术

很多软件的安全漏洞来源于使用了不安全的共享库,尤其是C&C++,当中有很多的函数都不够“安全”,比如:strcpy、streat、gets等等。这些函数使用不好就会带来灾难性的后果。用安全共享库技术,能在一定程度上阻止攻击者的攻击[5,6]。安全共享库技术就是依靠动态链接技术,能在程序运行期间拦截对不安全的函数的调用,并对函数参数等进行检测,这在Windows和UNIX上都被广泛应用。特别的是,这个技术能对当前内存大小的上限给出一个评估值,这在一定程度上阻止了把数据写到评估边界的外面。安全共享库技术从技术的角度很容易开发和配置,而且不需要对已有的应用程序作任何

的修改和再编译。

从理论上讲,安全共享库技术可以检测并防止所有的基于标准库函数的攻击。但是它不能保护本地变量的安全,而且它也不能防止数据段和代码段数据的溢出攻击。安全共享库技术对于非标准的库函数无能为力。安全共享库技术不会造成任何兼容性问题,在标准库下运行正常的程序在安全共享库技术下面也同样运行良好。安全共享库技术对于那些和安全没有关系的标准库中函数不做任何处理。性能瓶颈主要在这些有安全弱点的函数上。这样可以大幅度提高程序的性能。如果所有的库中的函数都被拦截并检查,性能上的消耗将提高15%。现在安全共享库的研究项目中的某些特性已经整合到某些标准库中了,如glibe。使用glibe库的应用程序能提供隐式的安全性。

2.5 沙箱技术

通过限制一个进程所访问的资源来预防某些攻击行为。例如:在C语言中有execy、system等系统调用函数,一个软件可能根本不会存在这些系统调用,如果发现某一大该运行软件有了这些系统调用,可能就是被攻击了。在攻击之前如果能使用沙箱技术限制住对这些资源的访问,则攻击就不会得逞。沙箱技术不需要对操作系统内核和应用程序作任何改变。然而,要给每一个需要安全检测的应用程序定义一个资源访问策略。对于一个复杂的应用程序而言,定义这样的一个策略将是很麻烦的工作。

沙箱技术检测的全面性主要看定义的策略的全面性。一个严格定义的策略可以更好的保护程序不受攻击。但该技术对于通过改写关键的木地变量(例如用户的身份ID等)而修改程序逻辑流程的攻击束手无策。沙箱技术依赖于安全策略。它不会带来兼容性方面的问题。但是一个过于严格的策略可能会限制应用程序的合法行为,最终导致程序不能使用。而且对系统调用函数的审查可能会带来竞争条件问题的出现。

沙箱技术的主要性能消耗是在每个系统函数调用的检测开关上和查询策略表上。这个性能消耗在系统函数调用不频繁的应用程序中并不明显。沙箱技术目前主要集中于系统调用方面。在不知道一个应用程序逻辑的情况下限制它的行为是很困难的,而且可以通过不在策略中的函数而绕过检测。

2.6 程序解释技术

在程序运行之后来监视其行为并且强制进行安全检查是最显而易见的好方法,这就需要解释程序的执行。但程序解释技术方法,通常会消耗大量性能。最近也有很多的动态优化技术来弥补这个缺陷。程序监视器是使用这种方法的一个较好的例子。它使得进行额外的安全检测却不牺牲太多的性能成为可能。

程序解释技术不需要对操作系统内核和应用程序代码作任何改变,应用程序只要重新链接产生一个新的起动代码就可以了,然后有这个起动代码来调用动态优化的程序解释框架。有了严谨的安全策略,几乎所有已知的改变程序控制流程或修改危险函数的参数的攻击都可以被检测到并防范住。但是,通过对关键变量(如身份ID)的修改、覆盖来改变程序逻辑流程的攻击没有好的办法防范,除非对每一个读写指令都进行解释,而这样又会带来不能接受的性能上的消耗。使用程序解释技术的又一个优点是它能对动态生成的代码执行安全检测,例如JIT代码。

3 计算机安全动态检测技术注意事项

计算机软件设计中的安全漏洞动态检测技术就是在程序执行的情况下,通过对程序的运行环境(环境变量、内存、堆和栈等)进行分析,来检测程序是否存在漏洞的技术。动态检测技术的优点就是不需要修改目标程序源码或其二进制代码,这在一定程度上提高程序的保密性。基于动态检测技术的软件安全漏洞检测过程,需要综合考虑对性能的影响、检测全面性、误报率、使用全面性、便于管理等多方面的因素,以便决定选择最合适的动态检测技术。

推荐访问:安全漏洞 检测 计算机 动态 研究