漏洞检测的几种方法

时间:2024-04-14 21:33:47

  系统安全漏洞,也可以称为系统脆弱性,是指计算机系统在硬件、软件、协议的设计、具体实现以及系统安全策略上存在的缺陷和不足。系统脆弱性是相对系统安全而言的,从广义的角度来看,一切可能导致系统安全性受影响或破坏的因素都可以视为系统安全漏洞。安全漏洞的存在,使得非法用户可以利用这些漏洞获得某些系统权限,进而对系统执行非法操作,导致安全事件的发生。漏洞检测就是希望能够防患于未然,在漏洞被利用之前发现漏洞并修补漏洞。本文作者通过自己的实践,介绍了检测漏洞的几种方法。

  漏洞检测可以分为对已知漏洞的检测和对未知漏洞的检测。已知漏洞的检测主要是通过安全扫描技术,检测系统是否存在已公布的安全漏洞;而未知漏洞检测的目的在于发现软件系统中可能存在但尚未发现的漏洞。现有的未知漏洞检测技术有源代码扫描、反汇编扫描、环境错误注入等。源代码扫描和反汇编扫描都是一种静态的漏洞检测技术,不需要运行软件程序就可分析程序中可能存在的漏洞;而环境错误注入是一种动态的漏洞检测技术,利用可执行程序测试软件存在的漏洞,是一种比较成熟的软件漏洞检测技术。

  安全扫描

  安全扫描也称为脆弱性评估(Vulnerability Assessment),其基本原理是采用模拟黑客攻击的方式对目标可能存在的已知安全漏洞进行逐项检测,可以对工作站、服务器、交换机、数据库等各种对象进行安全漏洞检测。

  到目前为止,安全扫描技术已经达到很成熟的地步。安全扫描技术主要分为两类:基于主机的安全扫描技术和基于网络的安全扫描技术。按照扫描过程来分,扫描技术又可以分为四大类:Ping扫描技术、端口扫描技术、操作系统探测扫描技术以及已知漏洞的扫描技术。

  安全扫描技术在保障网络安全方面起到越来越重要的作用。借助于扫描技术,人们可以发现网络和主机存在的对外开放的端口、提供的服务、某些系统信息、错误的配置、已知的安全漏洞等。系统管理员利用安全扫描技术,可以发现网络和主机中可能会被黑客利用的薄弱点,从而想方设法对这些薄弱点进行修复以加强网络和主机的安全性。同时,黑客也可以利用安全扫描技术,目的是为了探查网络和主机系统的入侵点。但是黑客的行为同样有利于加强网络和主机的安全性,因为漏洞是客观存在的,只是未被发现而已,而只要一个漏洞被黑客所发现并加以利用,那么人们最终也会发现该漏洞。

  安全扫描器,是一种通过收集系统的信息来自动检测远程或本地主机安全性脆弱点的程序。安全扫描器采用模拟攻击的形式对目标可能存在的已知安全漏洞进行逐项检查。目标可以是工作站、服务器、交换机、数据库等各种对象。并且,一般情况下,安全扫描器会根据扫描结果向系统管理员提供周密可靠的安全性分析报告,为提高网络安全整体水平提供了重要依据。

  安全扫描器的性质决定了它不是一个直接的攻击安全漏洞的程序,它是一个帮助我们发现目标主机存在着弱点的程序。一个优秀的安全扫描器能对检测到的数据进行分析,帮助我们查找目标主机的安全漏洞并给出相应的建议。

  一般情况下,安全扫描器具备三项功能:

  ● 发现Internet上的一个网络或者一台主机;

  ● 一旦发现一台主机,能发现其上所运行的服务类型;

  ● 通过对这些服务的测试,可以发现存在的已知漏洞,并给出修补建议。

  源代码扫描

  源代码扫描主要针对开放源代码的程序,通过检查程序中不符合安全规则的文件结构、命名规则、函数、堆栈指针等,进而发现程序中可能隐含的安全缺陷。这种漏洞分析技术需要熟练掌握编程语言,并预先定义出不安全代码的审查规则,通过表达式匹配的方法检查源程序代码。

  由于程序运行时是动态变化的,如果不考虑函数调用的参数和调用环境,不对源代码进行词法分析和语法分析,就没有办法准确地把握程序的语义,因此这种方法不能发现程序动态运行过程中的安全漏洞。

  反汇编扫描

  反汇编扫描对于不公开源代码的程序来说往往是最有效的发现安全漏洞的办法。分析反汇编代码需要有丰富的经验,也可以使用辅助工具来帮助简化这个过程,但不可能有一种完全自动的工具来完成这个过程。例如,利用一种优秀的反汇编程序IDA(www.datarescue.com)就可以得到目标程序的汇编脚本语言,再对汇编出来的脚本语言进行扫描,进而识别一些可疑的汇编代码序列。

  通过反汇编来寻找系统漏洞的好处是,从理论上讲,不论多么复杂的问题总是可以通过反汇编来解决。它的缺点也是显然的,这种方法费时费力,对人员的技术水平要求很高,同样不能检测到程序动态运行过程中产生的安全漏洞。

  环境错误注入

  由程序执行是一个动态过程这个特点,不难看出静态的代码扫描是不完备的。环境错误注入是一种比较成熟的软件测试方法,这种方法在协议安全测试等领域中都已经得到了广泛的应用。

  系统通常由“应用程序”和“运行环境”组成。由于各种原因,程序员总是假定认为他们的程序会在正常环境中正常地运行。当这些假设成立时,他们的程序当然是正确运行的。但是,由于作为共享资源的环境,常常被其他主体所影响,尤其是恶意的用户,这样,程序员的假设就可能是不正确的。程序是否能够容忍环境中的错误是影响程序健壮性的一个关键问题。

  错误注入,即在软件运行的环境中故意注入人为的错误,并验证反应——这是验证计算机和软件系统的容错性、可靠性的一种有效方法。在测试过程中,错误被注入到环境中,所以产生了干扰。换句话,在测试过程中干扰软件运行的环境,观察在这种干扰情况下程序如何反应,是否会产生安全事件,如果没有,就可以认为系统是安全的。概言之,错误注入方法就是通过选择一个适当的错误模型试图触发程序中包含的安全漏洞。

  在真实情况下,触发某些不正常的环境是很困难的,知道如何触发依赖于测试者的有关“环境”方面的知识。所以,在异常的环境下测试软件安全变得困难。错误注入技术提供了一种模仿异常环境的方法,而不必关心实际中这些错误如何发生。

  软件环境错误注入分析还依赖于操作系统中已知的安全缺陷,也就是说,对一个软件进行错误注入分析时,要充分考虑到操作系统本身所存在的漏洞,这些操作系统中的安全缺陷可能会影响到软件本身的安全。所以选择一个适当的错误模型来触发程序中所隐含的安全漏洞是非常重要的。我们需要选择一个适当的错误模型,能够高水平地模拟真实的软件系统,然后分析漏洞数据库记录的攻击者利用漏洞的方法,把这些利用变为环境错误注入,从而缩小在测试过程中错误注入和真实发生的错误之间的差异。

  总结

  这里介绍的几种漏洞检测的方法,其中安全扫描技术主要是针对已知漏洞的检测,后面三种主要是针对未知漏洞的检测。对于未知漏洞的检测,源代码扫描(包括反汇编扫描)属于静态检测技术,而环境错误注入法属于动态检测技术。

  另外,换个视角来看,源代码扫描(包括反汇编扫描)类似于白盒测试,它检测软件系统源码中可能存在的问题;环境错误注入方法类似于黑盒测试,它不关注代码的问题,而是通过对程序运行环境的干扰,关注运行程序对于注入错误的反应,以便从程序外围发现问题。

  漏洞检测的目的在于发现漏洞,修补漏洞,进而从根本上提高信息系统的安全性,以致从根本上减少安全事件的发生(内容转载)。