试论计算机安全漏洞的动态检测
2013-04-12陆燕
陆燕
【摘 要】动态检测方法就是在不改变源代码甚至是二进制代码的情况下,对程序的弱点进行检测的方法,这类检测主要通过修改进程运行环境来实现。动态检测方法主要有:非执行栈、非执行堆与数据、内存映射、安全共享库、沙箱和程序解释等。
【关键词】计算机;安全漏洞;动态检测
1.计算机安全动态检测技术探讨
1.1非执行栈技术
基于栈进行软件攻击的事件最近几年经常发生,原因就是很多操作系统的栈是可以写与执行的,而且内部变量尤其是数组变量都保存在栈中,攻击者向栈中注入恶意代码,然后想方设法来执行这段代码。栈攻击技术的文档也比较全面,这从某种程度上加速了基于栈的攻击。一个最直接的防范栈攻击的方法就是使得栈不能执行代码。这样即使攻击者在栈中写入了恶意代码,这个恶意代码也不会被执行,在一定程度上防住了一些攻击者。只是这个方法需要在操作系统层进行修改,同时,不可执行栈的技术涉及到的一个大问题就是性能问题。此外,在既有栈溢出漏洞又有堆溢出漏洞的程序中,易出问题。可以利用栈溢出使程序跳转至攻击代码,该代码是被放置在堆上。没有实际执行栈中的代码,而是执行了堆中的代码。该技术所付出的代价就是对操作系统内核引入一个微小的改变:把栈页标记为不可执行。
1.2非执行堆与数据技术
由于堆是程序运行时动态分配内存的区域,而数据段则是程序编译时就初始化好了的。很长时期以来,由于担心非执行的堆与数据段会破坏软件的正常运行,所以该方法进展缓慢,最近几年才有些进展和文章。如果堆和数据段都不能执行代码,攻击者注入其中的恶意代码将不能被执行。这项技术和前面的非执行栈技术结合能起到更全面的作用,使得恶意代码彻底失去执行机会。使用该技术所付出的代价要比非执行栈技术大一些,因为它对内核的修改要多一些。现在已经有了大量的实例可以使用,这个技术还是可以接受的。从全面性上来看,该技术对于几乎所有的利用把恶意代码注入进程内存中的攻击都可以检测并阻止。但是,对于恶意修改函数指针和函数参数的攻击没有办法检测和防范。该技术改变了传统程序在堆或数据段中动态生成代码的方式,会造成很多应用程序的不兼容性。
1.3内存映射技术
内存映射技术可以检测并阻止基于内存中地址跳转的攻击。但它对于注入新代码并执行新代码的攻击不能检测和预防。除此之外,因为低端内存是有大小限制的,想把所有的代码页都映射到低端内存在有些应用中是不可行的。内存映射技术仅仅对那些依靠固定地址或使用高端地址的应用程序有影响。而这样的应用程序并不多。内存映射技术对性能的消耗也可以忽略,它仅仅是在程序装载的过程中工作,运行起来之后对程序没有任何影响。
1.4安全共享库技术
从理论上讲,安全共享库技术可以检测并防止所有的基于标准库函数的攻击。但是它不能保护本地变量的安全,而且它也不能防止数据段和代码段数据的溢出攻击。安全共享库技术对于非标准的库函数无能为力。安全共享库技术不会造成任何兼容性问题,在标准库下运行正常的程序在安全共享库技术下面也同样运行良好。安全共享库技术对于那些和安全没有关系的标准库中函数不做任何处理。性能瓶颈主要在这些有安全弱点的函数上。
1.5沙箱技术
沙箱技术检测的全面性主要看定义的策略的全面性。一个严格定义的策略可以更好的保护程序不受攻击。但该技术对于通过改写关键的本地变量(例如用户的身份ID等)而修改程序逻辑流程的攻击束手无策。沙箱技术依赖于安全策略。它不会带来兼容性方面的问题。但是一个过于严格的策略可能会限制应用程序的合法行为,最终导致程序不能使用。而且对系统调用函数的审查可能会带来竞争条件问题的出现。
1.6程序解释技术
程序解释技术不需要对操作系统内核和应用程序代码作任何改变,应用程序只要重新链接产生一个新的起动代码就可以了,然后有这个起动代码来调用动态优化的程序解释框架。有了严谨的安全策略,几乎所有已知的改变程序控制流程或修改危险函数的参数的攻击都可以被检测到并防范住。
2.计算机网络安全漏洞检测防护方案
2.1发送含特征码的检测数据包与接收数据包
首先需要在漏洞特征库中查找漏洞的特征码,构造数据包进行发送。在发送检测数据包之前,先判断目标主机是否在线,然后检测操作系统版本等基本信息,并扫描它的端口开放以及所提供的服务情况,以此避免不必要的空扫描和决定检测数据包发往的目的端口。在漏洞检测时,若目标主机不在线或所提供服务的相应端口没有开放,就无须进一步发送数据进行检测,可以提高检测效率。
在Windows系统中,NDIS(Network Driver Interface Specification)是操作系统网络功能驱动的关键部分,位于网络驱动协议和网卡之间,它既为上层的协议驱动提供服务,又屏蔽了各种网卡的差别。它提供了一个完备的NDIS库,可以利用库函数直接对网卡进行各种读写操作。但所提供的函数都是工作在核心模式下,用户不便直接操作。本方案采用由澳大利亚的Canberra大学信息科学与工程系开发研制的网络开发包Packet32来设置网卡的工作模式,调用库中函数直接在网卡上读写数据,为用户提供了一个面向底层的网络编程接口。
2.2建立漏洞特征库与验证库
漏洞特征库是计算机网络漏洞安全检测防护方案中最为重要的部分,包含每个漏洞的特征码。在实际检测中,最终操作是对网络数据包的操作,所以特征码应该能够保证检测数据包的有效性和接收回应数据包后的判断的准确性。由于漏洞的种类千差万别,提取漏洞的特征码是关键工作,实现漏洞扫描是一个分析漏洞、建立知识库、维护知识库的过程。
2.3漏洞扫描控制与调度
漏洞扫描控制是系统管理控制台与扫描调度的接口,接受系统管理控制台的各种命令,可对要扫描的网络、主机和服务端口、敏感信息等等加以配置,按一定的扫描控制策略调用扫描调度;可以控制扫描调度模块的工作,使整个检测系统暂停、停止、继续、结束等。漏洞扫描调度根据扫描控制模块发送的扫描控制要求,采用消息机制协调各工作模块。采用多线程调度策略,对本地或远程主机进行扫描;调用漏洞特征库接口模块,在漏洞特征库表文件中查询漏洞对应的检测表文件名称,调用检测验证模块进行检测验证等。
3.漏洞防护建议
在系统作完安全漏洞检测、扫描之后,形成针对整个系统多种形式的安全报表,如系统内工作站或服务器在某一时间段内的安全状况、提供服务的变化情况以及软件版本更新的情况等,并在此基础上提交用户检测报告,主要包括漏洞风险分析及安全建议。
漏洞的风险分析包括漏洞的流行程度、利用漏洞攻击的容易程度、攻击造成系统的损害程度和采用此漏洞进行攻击被抓获的冒险程度。损害度、容易度、流行度、冒险度都由数字1到9来表示不同的级别。其中冒险程度越大,攻击者被抓住可能性就越大,风险级别就相应的减小。因此,冒险度的具体数值与实际的冒险程度恰好相反。
安全建议是根据漏洞风险分析的结果提醒用户需要在哪些方面如何加强系统的安全性。安全建议具体包括需要填补的所有系统漏洞,如何填补这些漏洞(修改系统配置、下载相应补丁、删除不必要的服务等),在填补所有漏洞不可实现的情况下,应当优先填补那些对系统安全威胁较大或填补工作较为容易的漏洞。
【参考文献】
[1]单谷云,黄成军,江秀臣.电缆排管机器人的图像监控传输系统设计[J].微计算机信息.2008,(29).
[2]蒋诚.信息安全漏洞等级定义标准及应用[J].信息安全与通信保密,2007,(6).