我们能使操作系统安全可靠吗?(一)

下文是美国电气与电子工程师学会计算机学会《IEEE Computer》2006年第5期的一篇论文“Can We Make Operating Systems Reliable and Secure”,作者Andrew S. Tanenbaum、Jorrit N. Herder、Herbert Bos。

长期以来微内核体系结构由于其性能较单核结构逊色而被人忽视。如今微核结构有可能由于其潜在的高可 靠性而重新风光,因为现在许多研究人员把可靠性看得比性能更为重要。

您什么时候碰到过一台电视机出现系统崩溃或者需要您去网络上下载什么紧急的软件升级补丁?除非那是一台极为老久的机器(即使如此也不会麻烦您去软件升级,只不过需要更换零部件罢了-译者注)。而一台新的电视机只不过是一个由一颗处理器、一个大屏幕监视器、一些解调无线电信号的模拟电子部件、一些特殊的(相对于一般计算机而言)读写(I/O)设备:遥控器、内置卡式录像带机或DVD驱动器以及ROM里的一些软件组成的计算机而已。

这一问,触及到计算机界人士讳莫如深的一个难堪的“秘密”,为什么电视、DVD录像机、MP3播放器、移动电话和其他软件驱动的电子设备都十分可靠、安全,而计算机却做不到呢?当然有许多“解释”,比如计算机是可变的、计算机可以允许用户改变软件、信息技术产业还不成熟等等。但是,当我们步入一个绝大部分的计算机用户是非专业技术人员的时代时,上述理由对于他们来说,就看起来越来越像是毫无说服力的借口。

消费者对于计算机的期待和对电视机一样:买了以后,插上电源,就能完美地工作10年。作为信息技术的专业人员,我们必须面对这个挑战,并且尽量使计算机像电视机 一样可靠安全。

要做到可靠和安全,最大的障碍就是操作系统。虽然应用程序也存在着许多缺陷,但是如果操作系统没有毛病,应用程序中的缺陷只能产生有限的破坏。因此我们将集中讨论操作系统。

然而,在进入细节之前,有必要先说明一下可靠与安全之间的关系。这两个方面的问题一般都是由相同的原因造成的,即软件中的缺陷。一个缓冲区溢出错误会导致系统崩溃(可靠性问题),也会让精心编写的病毒或蠕虫接管计算机(安全性问题)。尽管我们主要关注可靠性,但在改善可靠性的同时也会提高安全性。

系统为什么不可靠?

当前的操作系统有两个特征使得它不可靠、不安全:一是规模巨大,二是故障隔离的性能很差。Linux内核拥有超过250万行的代码。Windows XP的内核则是前者的2倍还多。

一项关于软件可靠性的研究表明:每1000行可执行代码中会包含6~16个缺陷[1],而另一项研究则估计可执行代码的缺陷密度(fault density)为每千行2~75个[2]。按照每1000行代码中有6个缺陷的保守估计,Linux内核大约存在15000个缺陷,而Windows XP中的缺陷至少是它的2倍。

更糟糕的是,通常大约70%的操作系统带有设备驱动程序,而这些驱动程序的失效密度是普通代码的3~7倍,所以上面提到的缺陷数可能在总体上被低估了[3]。显然,发现并修正所有的缺陷是根本不可行的,更何况缺陷的修补经常会引入新的缺陷。

当前操作系统的巨大规模意味着没有人能够理解其全部情况。显然,在没有人真正很好理解一个系统的情况下要将其工程化是极为困难的。

这给我们提出了第2个议题:故障隔离。没有哪个人能弄懂航空母舰的全部零件是如何工作的,但其子系统都实现了彼此很好地隔离,这样就不至于产生厕所阻塞影响到导弹发射子系统的问题。

操作系统的各个部件没有这种隔离。现代操作系统包含成百上千个链接在一起的过程,作为一个独立的二进制程序以内核的形式运行。在这几百万行内核代码中,每一行都能够重写与之无关的组件使用的关键数据结构,从而以很难检测到的方式造成系统崩溃。此外,如果病毒或者蠕虫感染了一个内核过程,我们也无法阻止它快速蔓延至其他子程序并控制整台机器。

回到舰船的例子。现代舰船的船壳内分成许多隔间。如果某一个隔间出现了裂缝,只有这个隔间漏水,不会影响整个船体。当前的操作系统就像隔间发明之前的船只,每一个漏缝都能使整只船沉没。

所幸研究人员正在研究构建更可靠的操作系统。下面我们根据方法的“彻底性”按照从最保守到最激进的次序介绍四种不同途径。(待续)

相关推荐