漏洞治理面面观

2018年开年,计算机领域就曝光一个重大安全漏洞—Intel芯片存在硬件漏洞,Intel,ARM,AMD等多家著名CPU制造企业均未能幸免于难,这一漏洞影响到全球范围内几百万台笔记本电脑。据称,利用该漏洞,攻击者在几秒钟之内就可以获得系统的控制权,获取用户的账号密码、通信信息等隐私资料。Intel芯片漏洞迅速成为人们关注的焦点,再次引发人们对安全漏洞问题的热议,一时间出现了多篇关于该漏洞的成因、利用技术和解决方案的文章。本文不讨论这些具体的技术问题,而从漏洞治理角度寻找解决安全漏洞更加有效的方法。

漏洞的定义

漏洞就是攻击者可以利用的软件(硬件)脆弱点或错误,可以在未授权的状态下实现对系统资源的非法访问或破坏。

尽管传统的漏洞定义(如微软对于漏洞的定义)主要指软件设计上的缺陷,但在实际应用中,人们对于漏洞的理解远远超出了设计缺陷的范畴,不仅仅包括软件设计上的逻辑缺陷(Flaw)、也包括软件编码过程中出现的各种Bug、系统运行过程中出现的各种故障(Default),以及硬件缺陷(如最近的芯片漏洞)。已有攻击的分析证明,攻击成功最根本的原因在于系统本身存在安全漏洞。广义上讲,安全需求不足、设计缺陷、编码安全问题、不适当的配置和操作失误都属于漏洞的范畴。

虽然看起来许多安全问题与不安全编码有关,但大多数安全错误也是基于架构的。界定一个系统安全错误是基于架构不合理还是由于不安全的编码实现而产生的,这种区别不是很明显,错误本身也可能是一个体系架构缺陷和实现错误联合作用的结果,因此单纯地将漏洞归结为编码阶段的错误是不完全合理的。逻辑缺陷有些场合也被认为是语义问题,有时还包括语法和编码错误。输入验证不足和不当的会话管理错误是主要的体系结构缺陷,表现为编码错误。无论是什么原因造成的,这些问题统称为漏洞。

漏洞的补丁修复模式效果怎么样?

到目前为止,漏洞的主要修复方法就是为系统打补丁。一旦漏洞被发现,软件开发商通常会开发补丁程序对这一漏洞进行软件层面的修复。一般来讲这一措施针对已经发现的漏洞有效的,然而也会给用户带来新的问题。一个主要问题就是究竟要不要打补丁?对于重要的信息系统来说,用户在打补丁这一问题上都是非常慎重的,因为他们不知道补丁程序中是否含有其他恶意程序代码,因此通常用户在打补丁之前都会对补丁进行测试,结果无误后才对系统正式执行补丁修复程序。另一个问题是即使完成了补丁测试过程,也不能完全保证新打的补丁不会带来其他安全问题,因为信息系统越来越复杂,一个地方的局部代码修复很可能导致整个系统的逻辑出现新的问题。

漏洞补丁的发布往往是在漏洞被开发商掌握并正式发布之后,而从漏洞被发现到补丁程序发布之前,这一时间段被称为0day。对于漏洞来讲0day是一个重要的时间概念,它可以很短,有时也会很长,因为有些设计缺陷和系统逻辑结构上的漏洞在系统运行维护阶段是无法修复的;有些情况下即使已经被发现,开发人员也置之不理,没有相应地开发补丁程序,这在开源软件里非常常见。针对0day的攻击危害是巨大的,因为0day漏洞已经被黑客发现,但是开发商和用户并不知晓,如果黑客利用0day漏洞进行攻击,系统几乎没有任何防范能力。

据Risk Based Security发布的一项调查,仅2016年VulnDB就正式报告发布了15000个漏洞,这一数据刷新了历史记录,而这只是冰山的一角,已经发现但未正式公布补丁程序的0day漏洞就像潜藏在冰面之下的巨大冰川,每一次针对0day的攻击对整个系统安全可能都是致命的。除此以外,更多的漏洞尚未被发现,它们潜藏在系统中,随着系统在实时地运行,随时都有可能被发现而转化为0day漏洞,成为系统安全存在的巨大隐患。

由此我们可以看到,仅仅依靠打补丁只能修复开发商已经掌握的漏洞,而对于0day漏洞以及众多尚未发现的漏洞而言,补丁并不能解决问题。

漏洞应该如何预防?

面对系统存在的0day漏洞,可能采取的预防措施包括:

1)从漏洞修复的角度出发,采用非官方的补丁修复程序,这和官方的补丁有异曲同工之处;

2)依据特征检测的思想,将利用漏洞的病毒或恶意代码的特征码加入杀毒软件病毒库,阻止利用0day漏洞的攻击,本质上仍然属于漏洞检测的范畴;

3)在浏览器选项中设置禁用ActiveX控件,避免远程恶意代码在本地执行。这种方法是通过对可执行的代码类型的控制,达到避免0day攻击的目的,属于减小攻击面的漏洞防御方法。

上述方法都是在漏洞产生以后,采取各种防御措施对漏洞进行检测和控制,客观上对于减少漏洞的产生是没有帮助的,属于被动、滞后的防御方法。特别是对于尚未发现的漏洞,这些0day预防方法也很难奏效。为了寻找更好的可以避免漏洞产生的方法,本文从漏洞的产生原因分析入手,探讨减少漏洞产生的途径。

漏洞治理的新途径

为了寻找更好的漏洞治理方法,我们需要回答这样几个问题:

1)漏洞究竟是如何产生的?

2)漏洞是否有规律可以遵循?

3)如何才能避免漏洞的产生?

1)漏洞究竟是如何产生的?

对于这一问题,还是应该从漏洞的定义出发,去探寻漏洞产生的根本原因。漏洞就是攻击者可以利用的软件(硬件)脆弱点或错误,不仅仅包括软件设计上的逻辑缺陷、也包括软件编码过程中出现的各种Bug、系统运行过程中出现的各种故障,以及各种硬件安全缺陷。这意味着,安全是一个系统性问题,任何一个环节出现错误都会导致整个系统出现问题,因此漏洞的产生就应该从系统的整个生命周期去考虑,即从系统需求、系统设计、编码、测试以及运维等多个阶段来分析漏洞产生的原因。漏洞是系统开发生命周期各阶段错误的真实体现,这些错误会导致系统漏洞或者脆弱点。

如果与系统生命周期相关联的话,安全漏洞的产生可以包含下面几种情况:

l需求说明错误。由于需求分析过程的错误而产生的需求不正确或缺失的需求,如缺少用户输入验证,这会导致数据格式错误或缓冲区溢出漏洞。

l设计错误。由于设计阶段引入不正确的逻辑决策、决策本身错误或者由于决策表达错误而导致的系统设计上的错误,如不正确的口令恢复程序。

l代码编写错误。由于代码编写阶段错误而导致的设计决策的不正确表达。

l配置错误。由于软件在应用环境中配置不当而产生的错误,如防火墙采用默认口令。

安全错误是系统错误的一个子集,两者之间唯一的差别是安全错误导致漏洞或脆弱点,而系统错误可能会产生与安全无关的不期望的行为,如系统可靠性方面的问题。

2)漏洞是否有规律可以遵循?

尽管漏洞数量巨大,形式纷繁复杂,但还是有一定的规律可循,对于漏洞类型的划分就是漏洞规律研究的有益探索。通常漏洞类型有下面几种划分方法:

l基于漏洞产生的原因来划分,可以将漏洞分为需求缺陷、设计缺陷、代码Bug和系统配置错误等。

l根据漏洞导致的结果进行分类,如“缓冲区溢出漏洞”和“内存破坏漏洞”等。

l根据漏洞的严重程度进行分类,如Microsoft公司的MS漏洞严重度等级分类法;

l根据漏洞利用的方法进行分类,如利用防火墙的参数配置错误进行的攻击。

3)如何才能避免漏洞的产生?

根据不同的漏洞分类方法,就可以有针对性地对各种漏洞给出预防控制措施。

比如,针对生命周期不同阶段产生的漏洞,一个最容易理解但却一直被忽视的方法就是对生命周期的每一个阶段进行安全检查,保证每一阶段引入的安全错误最小,从而使最终的软件产品或系统漏洞数量最少。这可以通过全局测试技术来实现,比如著名的软件安全专家McGraw的接触点模型中外部审核功能跨越了软件开发的整个生命周期就体现了这种全局测试的观点(如下图)。

再比如,针对缓冲区溢出问题漏洞,采用安全的编程语言以及输入验证的方法,已经可以很好地避免缓冲区溢出漏洞的发生。

现在常用的安全测试、安全编码方法可以解决一部分Bug问题但并不是所有问题,有些系统结构设计上的缺陷在测试阶段是无法发现的,因此需要将安全考虑提前到系统开发的早期阶段,这就是系统安全开发概念最初的起源。

总结起来,对于安全漏洞的解决方法基本有两种途径:

第一种途径是采用各种检测、分析、挖掘技术对安全错误进行发现、分析、评价,然后采取各种安全控制措施对漏洞进行修复和风险控制,如传统的打补丁、防病毒、防火墙、入侵检测、应急响应等等。这种方法是将安全保障措施开始于软件发布运行之时,是当前系统安全保障普遍采用的方法。历史经验证明,该方法在时间和经济上投入产出比较低,漏洞数量并没有从根本上减少,信息系统的安全状况没有得到有效地改善。

第二种途径是分析安全漏洞发生的原因,将漏洞的修正考虑嵌入到系统开发生命周期的各个阶段。通过对需求分析、设计、实现、测试、发布,以及运维等各阶段相关的安全错误的分析与控制,以期大大减少信息系统漏洞数量,提高信息系统的本质安全性。该方法是将安全保障的实施开始于软件产品发布之前,尤其强调从生命周期的早期阶段开始安全考虑,从而减少后期系统运行过程中安全运维的工作量,提高安全保障的效果。

漏洞治理的经济性问题

很多人认为,对于软件(系统)开发这样复杂的工作而言,安全漏洞是不可避免的。如果要在系统开发早期阶段就引入安全考虑,所花费的成本太高,开发时间也会因此而延长,无法满足企业投入/产出需求。然而微软公司安全开发的实践表明,在系统开发的早期就引入安全考虑,可以有效减少系统生命周期后期运行维护的工作量,总的投入成本并没有增加。另外的研究结果也显示,在系统维护阶段才考虑安全问题比从系统开发需求阶段就引入安全要素,所花费的错误修复成本要高30-100倍。

统计数据表明,近年来因为信息安全问题而在全球引发的可计算的经济损失每年可以达到4500亿美元,由于漏洞的存在而导致的一次大规模黑客攻击可能造成的损失高达530亿美元,堪比重大自然灾害。因此从漏洞产生的源头进行治理,避免漏洞的产生,特别是避免那些已经多次出现的类似漏洞再发生,其经济效益和社会效益都是巨大的。

漏洞管理VS漏洞治理

管理工作的主要目的是提高经济效益,既从有限的投入去获得最大限度的产出,通常表示为投入产出的关系;而治理指的是一种由目标支持的活动,治理首先强调的就是目标的正确性,即做正确的事。在漏洞这一具体问题上,笔者认为如何减少甚至避免漏洞的产生才是漏洞治理的出发点和根本目标。

尽管人们认为,软件是由人来开发的,出现漏洞是不可避免的,特别是市场需求紧迫而带来的短平快的开发模式,是导致这些年漏洞数量爆发式增长的主要原因。为了有效减少漏洞产生的数量,需要遵循漏洞形成的基本规律,对系统的全生命周期进行过程管理和控制,以期提供信息系统的本质安全性。

本文讨论漏洞治理而不是漏洞管理问题,是想借此给大家一个深入思考的机会。漏洞治理,除了传统的挖掘/修复/防御模式,还有更好的从根本上解决问题的途径,那就是系统全生命周期的安全管理和控制。

更多漏洞预防的内容,请看《软件安全开发-属性驱动模式》.电子工业出版社,2016.5.

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180115G0Y3H000?refer=cp_1026

相关快讯

扫码关注云+社区