
上QQ阅读APP看书,第一时间看更新
1.5 小结
软件漏洞大都是由常见的软件瑕疵所引起的,这一事实早已不是秘密。对C和C++而言更是如此。这些语言在设计时假设其用户具有一定水平的专业知识,可事实上并非如此。结果导致售出的产品中包含大量的瑕疵,其中一些可能导致软件漏洞。软件开发者需要对用户发现的漏洞(其中一些是恶意的)作出反应,接着就开始发布补丁和安装补丁的循环周期。然而,补丁的数量实在太多,导致系统管理员并不能及时完成打补丁的工作。甚至有时补丁程序本身也包含安全缺陷。这种针对安全缺陷的反应式策略并不奏效,我们需要一种在早期进行预防和消除安全缺陷的策略。
引起软件安全问题最主要的原因就是软件中的瑕疵,有瑕疵的软件随处可见。那些广泛使用的操作系统平均每千行代码就有一两个瑕疵,而它们都是由几百万行代码所组成,因此通常都会包含数千个瑕疵[Davis 2003]。应用软件的规模虽然没有操作系统那么庞大,但其每千行代码包含的瑕疵数目差不多也是如此。虽然并非每个瑕疵都有安全问题,但是,就算它们导致安全漏洞的比例只有1%或2%,风险也是相当大的。
SANS Institute主管Alan Paller曾沮丧地说过:“在SANS Institute Top 20 Internet Security排行榜中所列出的安全漏洞,都是由于糟糕的代码编写、不严格的测试、马虎的软件工程实践所造成的。这些问题并非如某些外行所想,是什么‘前沿’问题,它们的技术解决方案都存在,可就是没有得到很好地实现”[Kirwan 2004]。
理解漏洞产生的原理和如何进行安全编程对于保护整个互联网以及我们自身免受攻击至关重要。要想减少软件缺陷的数量,需要采用一种以健全的设计原则和有效的质量管理实践为基础的、严肃的工程方法。