打印本文 打印本文  关闭窗口 关闭窗口  
系统漏洞概念和分类及进一步发掘
作者:陈鹏  文章来源:eNet  点击数  更新时间:2009/9/11 23:26:32  文章录入:陈鹏  责任编辑:陈鹏

漏洞是一个永远的童话。实现劫富济贫的英雄梦想,实现打破技术垄断的自由蓝图,发现漏洞的人,利用漏洞的人,修补漏洞的人,喜欢漏洞的人,害怕漏洞的人就象这个多彩的世界一样,他们构成了计算机网络安全世界永远的角色!

  现在很多口必称漏洞,把漏洞的利用当自己的绝招和宝贝,其实漏洞是什么,我们或许存在着很多误解。下面结合相关资料和我个人的理解,我们今天就讲讲什么是漏洞,这个十分基本的问题。

  1、什么是漏洞

  专业上讲漏洞是在硬件、软件、协议的具体实现或系统安全策略上(主要是人为)存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。但是,其实这是一个纲目,很多书上定义都不同,这里算是比较全面的。怎么理解呢,还是有例子来说吧,这几十年来,漏洞太多了,不能一一说。

  2、漏洞的狭义范围

  漏洞会影响到很大范围的软硬件设备,包括作系统本身及其支撑软件,网络客户和服务器软件,网络路由器和安全防火墙等。怎么理解呢,就是在这些不同的软硬件设备中都可能存在不同的安全漏洞问题。

  3、漏洞的广义范围

  这里的漏洞是指所有威胁到计算机信息安全的事物。包括人员、硬件、软件、程序、数据。

  4、漏洞的长久性

  漏洞问题是与时间紧密相关的。一个系统从发布的那一天起,随着用户的深入使用,系统中存在的漏洞会被不断暴露出来,这些早先被发现的漏洞也会不断被系统供应商发布的补丁软件修补,或在以后发布的新版系统中得以纠正。而在新版系统纠正了旧版本中具有漏洞的同时,也会引入一些新的漏洞和错误。因而随着时间的推移,旧的漏洞会不断消失,新的漏洞会不断出现。漏洞问题也会长期存在。

  5、漏洞的隐蔽性

  系统安全漏洞是指可以用来对系统安全造成危害,系统本身具有的,或设置上存在的缺陷。总之,漏洞是系统在具体实现中的错误。比如在建立安全机制中规划考虑上的缺陷,作系统和其他软件编程中的错误,以及在使用该系统提供的安全机制时人为的配置错误等。

  系统安全漏洞是在系统具体实现和具体使用中产生的错误,但并不是系统中存在的错误都是安全漏洞。只有能威胁到系统安全的错误才是漏洞。许多错误在通常情况下并不会对系统安全造成危害,只有被人在某些条件下故意使用时才会影响系统安全。

  6、漏洞的必然被发现性

  漏洞虽然可能最初就存在于系统当中,但一个漏洞并不是自己出现的,必须要有人发现。在实际使用中,用户会发现系统中存在错误,而入侵者会有意利用其中的某些错误并使其成为威胁系统安全的工具,这时人们会认识到这个错误是一个系统安全漏洞。系统供应商会尽快发布针对这个漏洞的补丁程序,纠正这个错误。这就是系统安全漏洞从被发现到被纠正的一般过程。

  系统攻击者往往是安全漏洞的发现者和使用者,要对于一个系统进行攻击,如果不能发现和使用系统中存在的安全漏洞是不可能成功的。对于安全级别较高的系统尤其如此。

  系统安全漏洞与系统攻击活动之间有紧密的关系。因而不该脱离系统攻击活动来谈论安全漏洞问题。广泛的攻击存在,才使漏洞存在必然被发现性。

  7、为什么要紧跟最新的计算机系统及其安全问题的最新发展动态

  脱离具体的时间和具体的系统环境来讨论漏洞问题是毫无意义的。只能针对目标系统的作系统版本、其上运行的软件版本以及服务运行设置等实际环境来具体谈论其中可能存在的漏洞及其可行的解决办法。

  同时应该看到,对漏洞问题的研究必须要跟踪当前最新的计算机系统及其安全问题的最新发展动态。这一点如同对计算机病毒发展问题的研究相似。如果在工作中不能保持对新技术的跟踪,就没有谈论系统安全漏洞问题的发言权,既使是以前所作的工作也会逐渐失去价值。

  你喜欢漏洞,你讨厌也好。它永远存在,做到了“不以物喜,不以己悲”,实现了“爱她就爱她的灵魂----自由,平等,共享,创新”。同时它也证明了这个世界没有绝对的安全,如果世界上永远存在计算机存在软件,那么它又将证明什么叫永恒。童话里有永恒的虚假的美, 而漏洞是永恒的真实的童话。

  一、不同角度看安全漏洞的分类

  对一个特定程序的安全漏洞可以从多方面进行分类。

  1、从用户群体分类

  大众类软件的漏洞。如Windows的漏洞、IE的漏洞等等。

  专用软件的漏洞。如Oracle漏洞、Apache漏洞等等。

  2、从数据角度看分为

  能读按理不能读的数据,包括内存中的数据、文件中的数据、用户输入的数据、数据库中的数据、网络上传输的数据等等。

  能把指定的内容写入指定的地方(这个地方包括文件、内存、数据库等)

  输入的数据能被执行(包括按机器码执行、按Shell代码执行、按SQL代码执行等等)

  3、从作用范围角度看分为

  远程漏洞,攻击者可以利用并直接通过网络发起攻击的漏洞。这类漏洞危害极大,攻击者能随心所欲的通过此漏洞操作他人的电脑。并且此类漏洞很容易导致蠕虫攻击,在Windows。

  本地漏洞,攻击者必须在本机拥有访问权限前提下才能发起攻击的漏洞。比较典型的是本地权限提升漏洞,这类漏洞在Unix系统中广泛存在,能让普通用户获得最高管理员权限。

  4、从触发条件上看可以分为

  主动触发漏洞,攻击者可以主动利用该漏洞进行攻击,如直接访问他人计算机。

  被动触发漏洞,必须要计算机的操作人员配合才能进行攻击利用的漏洞。比如攻击者给管理员发一封邮件,带了一个特殊的jpg图片文件,如果管理员打开图片文件就会导致看图软件的某个漏洞被触发,从而系统被攻击,但如果管理员不看这个图片则不会受攻击。

  5、从操作角度看可分为

  文件操作类型,主要为操作的目标文件路径可被控制(如通过参数、配置文件、环境变量、符号链接灯),这样就可能导致下面两个问题:

  写入内容可被控制,从而可伪造文件内容,导致权限提升或直接修改重要数据(如修改存贷数据),这类漏洞有很多,如历史上Oracle TNS LOG文件可指定漏洞,可导致任何人可控制运行Oracle服务的计算机;

  内容信息可被输出,包含内容被打印到屏幕、记录到可读的日志文件、产生可被用户读的core文件等等,这类漏洞在历史上Unix系统中的crontab子系统中出现过很多次,普通用户能读受保护的shadow文件;

  内存覆盖,主要为内存单元可指定,写入内容可指定,这样就能执行攻击者想执行的代码(缓冲区溢出、格式串漏洞、PTrace漏洞、历史上Windows2000的硬件调试寄存器用户可写漏洞)或直接修改内存中的机密数据。

  逻辑错误,这类漏洞广泛存在,但很少有范式,所以难以查觉,可细分为:

  条件竞争漏洞(通常为设计问题,典型的有Ptrace漏洞、广泛存在的文件操作时序竞争)

  策略错误,通常为设计问题,如历史上FreeBSD的Smart IO漏洞。

  算法问题(通常为设计问题或代码实现问题),如历史上微软的Windows 95/98的共享口令可轻易获取漏洞。

  设计的不完善,如TCP/IP协议中的3步握手导致了SYN FLOOD拒绝服务攻击。

  实现中的错误(通常为设计没有问题,但编码人员出现了逻辑错误,如历史上博彩系统的伪随机算法实现问题)

  外部命令执行问题,典型的有外部命令可被控制(通过PATH变量,输入中的SHELL特殊字符等等)和SQL注入问题。

  6、从时序上看可分为

  已发现很久的漏洞:厂商已经发布补丁或修补方法,很多人都已经知道。这类漏洞通常很多人已经进行了修补,宏观上看危害比较小。

  刚发现的漏洞:厂商刚发补丁或修补方法,知道的人还不多。相对于上一种漏洞其危害性较大,如果此时出现了蠕虫或傻瓜化的利用程序,那么会导致大批系统受到攻击。

  0day:还没有公开的漏洞,在私下交易中的。这类漏洞通常对大众不会有什么影响,但会导致攻击者瞄准的目标受到精确攻击,危害也是非常之大。

  二、不同角度看待漏洞利用

  如果一个缺陷不能被利用来干“原本”不能干的事(安全相关的),那么就不能被称为安全漏洞,所以安全漏洞必然和漏洞利用紧密联系在一起。

  漏洞利用的视角有:

  数据视角:访问本来不可访问的数据,包括读和写。这一条通常是攻击者的核心目的,而且可造成非常严重的灾难(如银行数据可被人写)。

  权限视角:主要为权限绕过或权限提升。通常权限提升都是为了获得期望的数据操作能力。

  可用性视角:获得对系统某些服务的控制权限,这可能导致某些重要服务被攻击者停止而导致拒绝服务攻击。

  认证绕过:通常利用认证系统的漏洞而不用受权就能进入系统。通常认证绕过都是为权限提升或直接的数据访问服务的。

  代码执行角度:主要是让程序将输入的内容作为代码来执行,从而获得远程系统的访问权限或本地系统的更高权限。这个角度是SQL注入、内存指针游戏类漏洞(缓冲区溢出、格式串、整形溢出等等)等的主要驱动。这个角度通常为绕过系统认证、权限提升、数据读取作准备的。

  三、漏洞发掘方法

  首先必须清除安全漏洞是软件BUG的一个子集,一切软件测试的手段都对安全漏洞发掘实用。现在”黑客“用的各种漏洞发掘手段里有模式可循的有:

  fuzz测试(黑盒测试),通过构造可能导致程序出现问题的方式构造输入数据进行自动测试。

  源码审计(白盒测试),现在有了一系列的工具都能协助发现程序中的安全BUG,最简单的就是你手上最新版本的C语言编译器。

  IDA反汇编审计(灰盒测试),这和上面的源码审计非常类似,唯一不同的是很多时候你能获得软件,但你无法拿到源码来审计,但IDA是一个非常强大的反汇编平台,能让你基于汇编码(其实也是源码的等价物)进行安全审计。

  动态跟踪分析,就是记录程序在不同条件下执行的全部和安全问题相关的操作(如文件操作),然后分析这些操作序列是否存在问题,这是竞争条件类漏洞发现的主要途径之一,其他的污点传播跟踪也属于这类。

  补丁比较,厂商的软件出了问题通常都会在补丁中解决,通过对比补丁前后文件的源码(或反汇编码)就能了解到漏洞的具体细节。

  以上手段中无论是用哪种都涉及到一个关键点:需要通过人工分析来找到全面的流程覆盖路径。分析手法多种多样,有分析设计文档、分析源码、分析反汇编代码、动态调试程序等。

  四、漏洞等级评定

  考察漏洞的危害性应该紧密的和利用该漏洞带来的危害相关,并不是通常大家认识的所有缓冲区溢出漏洞都是高危漏洞。以远程漏洞为例,比较好的划分方法为:

  1 可远程获取OS、应用程序版本信息。

  2 开放了不必要或危险得服务,可远程获取系统敏感信息。

  3 可远程进行受限的文件、数据读取。

  4 可远程进行重要或不受限文件、数据读取。

  5 可远程进行受限文件、数据修改。

  6 可远程进行受限重要文件、数据修改。

  7 可远程进行不受限得重要文件、数据修改,或对普通服务进行拒绝服务攻击。

  8 可远程以普通用户身份执行命令或进行系统、网络级的拒绝服务攻击。

  9 可远程以管理用户身份执行命令(受限、不太容易利用)。

  10 可远程以管理用户身份执行命令(不受限、容易利用)。

  本地漏洞几乎都是导致代码执行,归入上面的10分制可以为:

  远程主动触发代码执行(如IE的漏洞)。

  远程被动触发代码执行(如Word漏洞/看图软件漏洞)。

  五、DEMO

  一个防火墙隔离(只允许运维部的人访问)的网络里运行一台Unix服务器;操作系统中只有root用户和oracle用户可登陆,操作系统中运行了Apache(nobody权限)、Oracle(oracle用户权限)等服务。

  一个攻击者的目的是修改Oracle数据库中的帐单表的数据。

  其可能的攻击步骤为:

  1.接入运维部的网络,获得一个运维部的IP地址从而能通过防火墙访问被保护的Unix服务器。

  2.利用Apache服务的某远程缓冲区溢出漏洞直接获得一个nobody权限的shell访问。

  3.利用操作系统某suid程序的漏洞将自己的权限提升到root权限。

  4.用Oracle的sysdba登陆进入数据库(本地登陆不需要密码)。

  5.修改目标表的数据。

  以上5个过程分析下来为:

  第1步:认证绕过

  第2步:远程漏洞、代码执行(机器码)、认证绕过

  第3步:权限提升、认证绕过

  第4步:认证绕过

  第5步:数据写

 



【责任编辑 王凡】

打印本文 打印本文  关闭窗口 关闭窗口