一、漏洞管理(Vulnerability management)
现代计算系统和应用是极其复杂的。以Linux为例子,Linux内核是操作系统的核心部分,处理输入、输出、内存管理、CPU管理和其他核心任务。这个操作系统的核心部分包含了超过2400万行的代码。同时,每天都有数千行代码被添加、删除和改变。鉴于现代软件的复杂性,开发人员不可避免地会犯错误,而其中一些错误会导致安全漏洞的出现。
以安全开发者的角度来看,漏洞管理的过程如下:
- 当一个公司得知他们的软件有漏洞时,安全开发者会分析这个问题;
- 安全开发者会为这个问题开发一个修复程序,也就是所谓的补丁;
- 通过更新机制发布这个补丁;
- 世界各地的管理员应用这个补丁来纠正安全漏洞。
如果以管理员的角度来看,一个成熟的漏洞管理流程包括:
- 扫描系统的漏洞;
- 应用补丁;
- 跟踪修复;
- 报告结果。
我们为什么要去进行漏洞管理,原因有如下几点:
- 保证系统的安全;
- 遵守公司政策;
- 遵循相关网络安全法规。例如,支付卡行业数据安全标准,即PCI DSS。
三种需要进行的漏洞扫描:
- 网络漏洞扫描目的是探测网络中任何设备是否存在安全问题;
- 应用程序扫描测试是检查是否在这些设备上运行的代码的存在潜在缺陷。
- WEB应用需要专门的测试,探测常见的WEB应用安全问题,如SQL注入和跨站脚本。
当我们解释漏洞扫描的结果时,需要用对系统和应用程序配置和日志的审查来补充这些扫描,以审查结果是否有误报和其他错误。注意,不管我们为什么要建立一个漏洞管理项目,基本的工具和过程都是一样的。但是,在我们开始之前,必须知道什么规则适用于自己和自己的组织,这样我们就可以确保设计的程序来满足这些要求。
二、识别扫描目标
当开始实施漏洞管理计划时,第一步是为该计划制定要求。我们需要考虑这个计划是基于提高安全性为目的,还是对法规要求的执行,或者是对企业政策的反应。完成这些以后,下一步就是把这些要求变成我们想扫描的具体系统和网络的列表。
如果我们的组织已经实行了良好的资产管理,便可以直接获得信任的资产清单。如果目前没有信任的资产清单,可以运行一个轻量级的扫描,只搜索本地网络上的系统,而不是运行一个完整的漏洞扫描(这可能非常耗时),以此来获取本地网络的设备。例如,可以使用Nessus扫描器来进行平台来进行搜寻本地的设备。如下:
一旦我们有一个可靠的资产清单,就需要开始为我们的扫描确定这些资产的优先次序。排序可以参考如下的信息完成:
- 给处理更敏感信息的系统分配更高的优先权;
- 给系统暴露在攻击者面前的高风险程度更高的优先权;
- 把关键系统放在优先于非关键系统的位置。
三、扫描配置
介绍和使用Nessus进行漏洞扫描,首先在主页点击New Scan:
然后可以看到模板界面,例如这里我们选择Advanced Scan,表示所有信息都由自己手工配置:
在General一栏,需要填写扫描的名称、范围等信息:
在Schedule一栏,可以设置扫描的具体时间:
在Notifications一栏中,可以将扫描结果发送的具体邮箱:
在Discover一栏,可以设置使用什么方式去探测,扫描设备,设置扫描的端口号范围:
在Assessment的评估部分,我可以设置扫描敏感度水平。这是一个重要的设置,当我们执行任何类型的扫描时,你都有可能出现错误警报。这些可能会浪费安全分析员的时间。默认情况下,Nessus使用它所谓的正常精度。可以把它看作是一种中度设置,旨在平衡错误警报的风险和遗漏真正漏洞的风险。如果有需要,我们可以通过勾选覆盖正常精度框,然后选择显示潜在的错误警报,来改变这一设置,使之偏向于报告漏洞,这将给你带来更多的错误警报,或者可以通过选择避免潜在的错误警报,使之比默认值更多地避免错误警报。
在Advanced页面。这有几个重要的设置。首先,注意这里选中的第一个框,启用安全检查(Enable safe checks)。这个设置告诉Nessus避免执行可能破坏系统的扫描。当我们在生产环境中工作时,最好不要勾选这个框,以获得最彻底的扫描结果:
在这个页面上还有一些设置,允许我们改变扫描的性能。我们可以告诉Nessus在检测到网络拥堵时放慢扫描速度,还可以设置特定的超时和检查来限制扫描速度并控制其对网络的影响。
Nessus使用插件来执行漏洞检查。每个插件都是为检查一个特定的漏洞而设计的,插件是按照它们影响的系统类型组织的。我们可以在这里的插件标签中看到插件的设置,然后点击对应的按钮来选择检查对应的漏洞。
漏洞扫描器提供了各种各样的配置选项,使我们能够定制扫描器的性能。如果发现自己在调整这些设置,一定要创建自己的自定义模板,这样就可以在多次扫描中轻松地重复使用这些设置。
四、扫描视角(scan perspective)
虽然我们可以设置扫描,在相同的端口和服务上使用相同的工具测试相同的系统,但还有其他因素可能影响我们在扫描结果中看到的内容,例如扫描视角。扫描视角最重要的组成部分是扫描器在网络上相对于被扫描系统的位置。
-
视角:DMZ网络
上图显示了一个组织和互联网的防火墙,以及一个包含可供外界访问的网络服务器的DMZ段。如果像这张图一样,漏洞扫描器也在DMZ中,那么扫描器就可以不受限制地访问网络服务器,因为它不需要通过防火墙就可以到达那里。 -
视角:内部网络
如果漏洞扫描器位于内部网络中,我们就会有一个完全不同的情况。现在,漏洞扫描器的流量在到达Web服务器的路上必须通过防火墙。防火墙会放弃任何不符合防火墙规则的连接尝试,它还可能执行过滤,放弃被怀疑是恶意的流量。这可能会阻止扫描器检测到一些漏洞,而如果它被放置在DMZ上,它就会看到这些漏洞。 -
视角:外部网络
最后,如果我们把扫描仪移到互联网上,我们会得到一个完全不同的观点。来自扫描仪的流量仍然需要通过防火墙,但现在它受制于规范来自互联网的入站流量的防火墙规则。据推测,这些规则要比内部网络的规则严格得多。因此,在这种配置下,扫描仪可能会看到尽可能少的漏洞。
三个视角对网络安全分析人员来说可能是有价值的。例如,将扫描仪放在DMZ中,可以最清楚地看到目标系统上的漏洞。如果我想知道我可能遇到的所有问题,这是获得这些问题的方法,因为他们的扫描仪有最大的权限来访问目标系统。然而,把扫描仪放在互联网上,我就可以看到攻击者对我的网络的看法。我可以看到外部攻击者从外部运行扫描时可能看到的同样的漏洞。同时我们也需要注意防火墙和入侵防御系统(IPS)对漏洞扫描的影响。
基于代理的扫描:
到目前为止,我们谈到的所有扫描都是基于服务器的扫描(server-based scans),漏洞扫描器通过网络联系到一个系统,然后探测它的漏洞。还有一种技术,你可以用它来获得不同的视角。基于代理的扫描(agent-based scanning)在每台服务器上安装一个安全代理,它可以深入探查服务器的配置并检查是否有漏洞。然后这些代理将它们发现的任何弱点报告给*漏洞管理系统。这提供了很好的洞察力,但一些组织选择不使用基于代理的扫描,因为他们不想在所有的服务器上安装软件,增加环境的复杂性。基于代理的扫描的另一个选择是凭证式扫描。在这种方法中,你向扫描器提供凭证,它可以用来登录到远程系统并获取配置信息。让我们来看看我们如何在Nessus中配置基于凭证的扫描。在扫描的设置中,我选择了凭证标签,然后我可以选择是否要配置SSH凭证或Windows凭证。
五、安全内容自动化协议(SCAP)
在漏洞管理的世界里有一大堆行话,可能有点令人困惑。我们可能会用网络应用程序漏洞、SQL注入问题和输入验证缺陷这些术语来指称同一件事。我们也可能把一个漏洞说成是严重的、关键的、或紧急的。我们的语言中有很多模糊不清的地方,这种模糊不清的地方不仅让我们所有人都感到困惑,而且也会妨碍我们对漏洞管理活动进行自动化。就好像我们的系统不说同样的语言一样。
安全内容自动化协议(SCAP或Security Content Automation Protocol)是由美国国家标准和技术研究所领导的一项工作,旨在为讨论安全问题创造一种一致的语言和格式。遵守SCAP标准的系统能够以一种描述环境、漏洞和补救步骤的方式分享信息,并使用一致的语言。SCAP有几个组成部分:
- CVSS:Common Vulnerability Scoring System。CVSS在整个安全界被广泛使用,因为它提供了一种评估安全漏洞严重性的一致方法。大多数漏洞扫描产品中都有CVSS评分,而且在扫描报告中也能看到。我们将在一分钟内讨论更多关于CVSS的内容。
- CCE:Common Configuration Enumeration,是另一个SCAP组件。CCE为我们提供了一种在分享系统配置时使用的一致语言。
- CPE: Common Platform Enumeration,对产品名称和版本做了同样的事情,为我们提供了一个标准化的系统来命名它们。
- CVE:Common Vulnerabilities and Exposures,为我们提供了一种描述漏洞的语言。
- XCCDF:Extensible Configuration Checklist Description Format,为创建和共享检查表以及处理安全检查表的结果提供了一种语言。
- OVAL:Open Vulnerability and Assessment Language,即为我们提供了一种以程序化方式描述测试程序的方法。
六、常见的漏洞评分系统(CVSS)
CVSS以10分制的方式给每个漏洞分配一个分数。我们可以通过评估八个不同的指标,然后结合结果来计算出一个基本的CVSS分数。
第一个指标是攻击矢量指标(Attack Vector或AV)。它描述了攻击者利用一个漏洞所必须具备的访问类型。这个指标的值可以是Physical的,意味着攻击者必须能够真实地触摸或操纵目标系统。它可以是Local的,意味着攻击者必须对系统的控制台有物理或逻辑上的访问。也可以是Adjancent Netword,意思是攻击者必须能够访问系统的本地网络。或者它可以只是Network,意味着该漏洞是可以远程利用的。
第二个指标是攻击复杂度指标(Attack Complexity或AC)。这个指标衡量利用一个漏洞的难度。如果该漏洞需要专门的条件和困难的工作,我们给这个度量值定为高,如果它很容易被利用则定为低。
接下来,我们使用 所需权限指标(Privileges Required或PR),看看攻击者必须拥有什么用户级别的访问权才能利用该漏洞。如果攻击需要攻击者首先获得管理权限,我们给这个指标赋值为高;如果攻击需要使用基本用户账户,我们给这个指标赋值为低;如果攻击者不需要事先访问系统就可以利用这个漏洞,我们给这个指标赋值为无。
然后,我们用 用户互动指标(User Interaction或UI) 评估所需的人类参与程度。如果攻击者必须以某种方式让授权用户采取一些行动来使攻击成功,则该指标被设置为需要;如果攻击者可以自己进行攻击,则没有。
这四个指标攻击矢量(AV)、攻击复杂度(AC)、所需权限(PR)和用户互动(UI),结合起来描述了一个漏洞的可利用性。除了可利用性之外,我们还必须考虑一个漏洞的影响。而这正是接下来的三个指标发挥作用的地方。我们使用CIA三要素看影响:
首先是保密性(Confidentiality或C)。 如果没有保密性的影响,我们就给保密性评级为无;如果攻击者可以访问一些,但不是所有的信息,我们就给部分保密性评级;如果系统上的所有信息都会被破坏,我们就给高保密性评级。
然后,我们再看完整性(Integrity或I),如果没有完整性的影响,我们就给它一个评级,如果某些信息有可能被修改,就给它一个低评级,如果所有信息都可能被攻击者随意修改,就给它一个高评级。
最后,我们看一下可用性(Availability或A)。如果没有可用性影响,则给予无评级;如果性能会下降,则给予低评级;如果攻击会涉及目标系统的关闭,则给予高评级。
这三个指标,保密性(C )、完整性(I)和可用性(A),结合起来描述了一个漏洞的影响。
第八个指标,范围(Scope或S),反映了一个漏洞是否能影响到具有该漏洞的组件以外的组件。如果利用漏洞可以影响到漏洞范围以外的资源,我们将其设置为改变(Changed),如果利用漏洞只能影响到由同一安全机构管理的资源,则设置为不变(Unchanged)。
七、分析扫码报告
1.五个解释因素
当网络安全分析员解释任何扫描报告的结果时,应该首先关注五个因素。这些因素包括:
- 漏洞的严重性;
- 受影响系统的关键性;
- 所涉及信息的敏感性;
- 修复的难度;
- 漏洞的系统的暴露程度。
这五个因素将帮助对网络安全分析员所面临的各种漏洞进行分流,并将正确的优先级输入你的漏洞修复工作流程。
2.漏洞验证
在请求修复漏洞之前,验证漏洞是很重要的。在这里,我们不仅要考虑漏洞扫描器所提供的信息,还需要加入一些自己的安全专业知识,以确认该漏洞的存在,以及它在优先级排序过程中被正确评级。
在漏洞验证过程中,我们应该检查的第一件事是,该漏洞是否真的如报告中所说的那样存在?漏洞扫描器确实由于各种原因产生了错误的阳性报告(False Positive),例如,我们看到一个报告,说一个Windows服务器缺少一个Mac补丁,可能可以认为这是一个假阳性报告。这可能是扫描器使用了一个定义不明确的签名,或者扫描器无法检测到缓解漏洞的安全控制的存在。在任何情况下,我们都应该仔细审查漏洞,特别是那些需要广泛或破坏性补救措施的漏洞,以验证问题是否真的存在。做到这一点的最好方法是审查扫描仪报告上的细节。扫描器报告通常包括一个部分,显示扫描器向目标系统发送的输入,以及由此产生的输出。审查该部分是一个很好的方法,可以找出扫描仪报告漏洞的原因。
在一些情况下,组织可能已经承认某个系统存在漏洞,并实施了修复或决定接受风险。所以一定要在我们的扫描器中,或在配置管理数据库中跟踪这些例外情况,因为我们不希望报告一个大家都已经知道的漏洞。在上报漏洞进行修复之前,检测假阳性报告和例外情况是非常重要的。
任何漏洞报告有四种可能结果。如果漏洞扫描器报告了一个发现,而且该漏洞确实存在,这就是一个True Positive报告。如果漏洞扫描器报告了一个发现,而该漏洞并不真正存在,这就是一个False Positive报告。如果漏洞扫描器没有报告发现,也会出现两种结果。如果没有发现,也没有漏洞,这就是一个True Negative报告。但是,如果漏洞扫描器漏掉了一个实际的漏洞,这就是一个False Positive报告。如下图象限所示:
八、关联(correlating)扫描结果
我们除了验证扫描结果以消除假阳性报告和删除记录的例外情况外,还需要把扫描报告与其他来源获得的其他信息联系起来。
-
需要参考的第一个信息来源是与我们的组织相关的任何行业标准、最佳实践或合规义务。这些标准可能对需要更紧急补救的漏洞类型提供具体指导。例如,PCI DSS包含一些关于漏洞扫描的非常具体的指导。一般来说,要被认为是合规的,这些组件都不能包含任何被分配到通用漏洞评分系统,或CVSS,基本得分等于或高于4.0的漏洞。" 这样的指导,对PCI DSS环境中的分析人员非常有帮助。
-
我们需要关联的第二个信息来源是我们自己组织中已经存在的技术信息。我们应该查看配置管理系统、日志库和其他可能为我们的扫描结果提供信息的数据源。这些信息源在检测和消除假阳性报告方面可能特别有用。
-
最后,我们还应该把漏洞扫描信息与自身联系起来(扫描的历史趋势)。例如下图所示:
如果相同类型的漏洞不断出现,也许有一个潜在的问题我们需要解决。例如,如果新的网络应用程序不断出现跨站脚本漏洞,我们应该与开发人员一起解决这个问题。可以通过为开发人员提供安全培训来解决根本原因,或者甚至创建标准的输入验证库,让他们可以使用这些库来保护他们的代码免受攻击。从一开始就阻止一个漏洞,比补救一个已经存在的漏洞要好得多。