摘 要:计算机安全性问题是软件设计需考虑的主要问题之一。本文通过对软件设计中各种安全漏洞动态检测技术的详细分析,并对各种已有的动态检测技术进行详细的比对,总结出各种动态检测技术的优、缺点,为在各种软件设计中正确选用适合的检测技术提出有力的参考依据。
关键词:软件设计;安全漏洞;技术分析
安全漏洞是指在计算机系统中软件及协议的具体实现或系统安全策略上存在安全方面的缺陷,软件中存在安全漏洞是导致入侵的根本原因,如何预先检测,找出软件中存在的安全隐患,及时修正存在的安全漏洞,最大程度地降低软件安全所带来的风险,己成为信息安全领域的一个重要研究内容。
一、动态检测方法概述
程序在设计以及执行期内有很多共性的东西,比如有控制流和数据流。一个进程的内存映射会被分为代码段、只读数据段、数据段、资源段、堆、栈等多个部分。当然在不同的操作系统下它们的多少会有所不同,比如在UNIX下通常还会有未初始化的数据段(BSS)等等。动态检测方法就是在不改变源代码甚至是二进制代码的情况下,对程序的弱点进行检测的方法,这类检测主要通过修改进程运行环境来实现。
二、不同动态检测方法的对比分析
1.非执行栈技术
基于栈进行软件攻击的事件最近几年经常发生,原因就是很多操作系统的栈是可以写与执行的,而且内部变量尤其是数组变量都保存在栈中,攻击者向栈中注入恶意代码,然后想方设法来执行这段代码。栈攻击技术的文档也比较全面,这从某种程度上加速了基于栈的攻击。一个最直接的防范栈攻击的方法就是使得栈不能执行代码。这样即使攻击者在栈中写入了恶意代码,这个恶意代码也不会被执行,在一定程度上防住了一些攻击者。只是这个方法需要在操作系统层进行修改,同时,不可执行栈的技术涉及到的一个大问题就是性能问题。此外,在既有栈溢出漏洞又有堆溢出漏洞的程序中,易出问题。可以利用栈溢出使程序跳转至攻击代码,该代码是被放置在堆上。没有实际执行栈中的代码,而是执行了堆中的代码。该技术所付出的代价就是对操作系统内核引入一个微小的改变:把栈页标记为不可执行。
2.非执行堆与数据技术
由于堆是程序运行时动态分配内存的区域,而数据段则是程序编译时就初始化好了的。很长时期以来,由于担心非执行的堆与数据段会破坏软件的正常运行,所以该方法进展缓慢,最近几年才有些进展和文章。如果堆和数据段都不能执行代码,攻击者注入其中的恶意代码将不能被执行。这项技术和前面的非执行栈技术结合能起到更全面的作用,使得恶意代码彻底失去执行机会。使用该技术所付出的代价要比非执行栈技术大一些,因为它对内核的修改要多一些。现在已经有了大量的实例可以使用,这个技术还是可以接受的。
从全面性上来看,该技术对于几乎所有的利用把恶意代码注入进程内存中的攻击都可以检测并阻止。但是,对于恶意修改函数指针和函数参数的攻击没有办法检测和防范。该技术改变了传统程序在堆或数据段中动态生成代码的方式,会造成很多应用程序的不兼容性。另外,使用这个技术来检测并排除漏洞对很多的应用不会产生太大影响,性能上的消耗也可以忽略。
3.内存映射技术
有些攻击者通过使用NULL结尾的字符串来覆盖内存,以达到攻击的目的。通过使用映射代码页方法,将使得攻击者很难通过NULL结尾的字符串来跳转到较低的内存区,而且这些代码本身又可能含有NULL字符。再者,把代码页随机地映射到不同的内存地址,在某种程度上防止了那些靠猜地址来进行攻击的攻击方法。比如对于缓冲区溢出的漏洞,攻击者就是要寻找目标进程在内存中的某些地址,然后构造自己的数据来覆盖这些地址。这些地址在很多操作系统上都是有规律可以计算出的。如果使用内存映射技术,把代码页映射到随机的地址,将给攻击者增加很大的困难,不做大量的尝试是不可能查出所需地址的。使用内存映射技术所付出的最大的代价就是要修改操作系统内核、使得操作系统可以把代码页映射到较低的内存空间。虽然这个技术不需要对代码进行修改,但要重新链接,因为二进制的地址在程序链接阶段就确定了。
4.安全共享库技术
很多软件的安全漏洞来源于使用了不安全的共享库,尤其是C&C++,当中有很多的函数都不够“安全”,比如:strcpy、strcat、gets等等。这些函数使用不好就会带来灾难性的后果。用安全共享库技术,能在一定程度上阻止攻击者的攻击.华南金融电脑,2007,15(6):104-105
中国论文网(www.lunwen.net.cn)免费学术期刊论文发表,目录,论文查重入口,本科毕业论文怎么写,职称论文范文,论文摘要,论文文献资料,毕业论文格式,论文检测降重服务。