2.2.1 漏洞产生因素
1.技术因素
关键点:软件规模复杂度增大、开源的流行。
随着信息化技术和应用领域的不断发展和深入,人们对软件的依赖越来越大,对其功能和性能的要求也越来越高,因此驱动了软件系统规模的不断膨胀。例如,Windows 95只有1 500万行代码,Windows 98有1 800万行代码,Windows XP有3 500万行代码,而Windows Vista则达到了5 000万行代码。同时,由于软件编程技术、可视化技术、系统集成技术的不断发展,更进一步地促使软件系统内部结构和逻辑日益复杂。显然,软件系统规模的迅速膨胀及内部结构的日益复杂,直接导致软件系统复杂性的提高。目前学术界普遍认为,软件系统代码的复杂性是导致软件系统质量难于控制、安全性降低、漏洞产生的重要原因。
同时,计算机硬件能力的不断提升,特别是多核处理器的出现与普及,使得软件系统开发方式发生了变化。由于主流的计算机体系结构是采用冯·诺依曼的“顺序执行,顺序访问”的架构,而导致开发并发程序的复杂性要远远高于普通的顺序程序。这里的复杂性不仅包括并行算法本身的复杂性,还包括开发过程的复杂性。
此外,随着开源软件的不断发展,一方面,软件开发厂商为了节约开发成本,缩短开发时间,提高开发效率,常常鼓励程序开发者使用开源软件中的某些功能或系统模块(以下简称公用模块)。另一方面,大量开发者认为公用模块使用了很多业界主流或较新的技术,特别是IT界大公司,如微软、IBM、Sun公司等提供的开源公用模块,不但包括系统级的解决方案,而且也包括功能级的小模块,因此大大增强了开发人员学习和使用公用模块的驱动力。但是由此也引发了公用模块的安全问题,主要体现在以下几个方面。
(1)如果公用模块中存在一个安全漏洞,那么随着该公用模块的广泛传播,漏洞的危害也会传播且有可能不断被放大。
(2)在开源社区中,对源代码中安全补丁的修复及管理上往往不能准确和及时地进行,甚至出现没有人修复的情况。此外,即使公用模块的开发者及时地发布了安全补丁,但使用公用模块的开发商如果没有及时关注补丁信息,也可能导致了公用模块中的漏洞不能被及时修复。
(3)某些恶意的攻击者可以通过分析公用模块的源代码更加容易发现或利用公用模块中的漏洞,甚至直接开发带有恶意代码甚至后门的源代码公用模块,放置在互联网上。
2.经济因素
关键点:软件安全性不能体现价值,厂商更关注软件的功能。
软件系统的安全性不是显性价值,厂商要实现安全性就要额外付出巨大的代价。此时,软件系统的安全质量形成了一个典型的非对称信息案例,即产品的卖方对产品质量比买方有更多信息。在这种情况下,经济学上著名的“柠檬市场”效应会出现,即在信息不对称的情况下,往往好的商品遭受淘汰,而劣等品会逐渐占领市场并取代好的商品,导致市场中都是劣等品。在这种市场之下,厂商更加重视软件系统的功能、性能、易用性,而不愿意在安全质量上做大的投入,甚至某些情况下,为了提高软件效率而降其安全性,结果导致了软件系统安全问题越来越严重。这种现象可以进一步归结为经济学上的外在性(Externality),像环境污染一样,软件系统漏洞的代价要全社会来承受,而厂商拿走了所有的收益。
3.应用环境因素
关键点:网络的发展,使软件更开放。
以Internet为代表的网络逐渐融入人类社会的方方面面,导致了软件系统的运行环境从传统的封闭、静态和可控,变为开放、动态和难控。此外,在网络空间环境下还形成了一些新的软件形态,如网构软件(Internetware)。从技术的角度看,网构软件是在面向对象、软件构件等技术支持下的软件实体,以主体化的软件服务形式存在于Internet的各个节点之上,各个软件实体相互间通过协同机制进行跨网络的互联、互通、协作和联盟,从而形成一种与WWW相类似的软件Web(Software web)。在网络环境中的开发、运行、服务的网络化软件一方面导致了面向Web应用的跨站脚本、SQL注入等漏洞越来越多,另一方面也给安全防护带来了更大的难度。
同时,由于无线通信、电信网络自身的不断发展,它们与Internet共同构成了更加复杂的异构网络。在这个比Internet网络环境还要复杂的应用环境下,不但会产生更多的漏洞类型和数量,更重要的是漏洞产生的危害和影响要远远超过在非网络或同构网络环境下的漏洞的危害和影响程度。