上回我在"应用程序间的安全隔离问题(1)"中介绍了硬件虚拟技术的一个特点:由于VMM的不可被旁路的强制性监控性质,不同的客户虚拟机之间具有很强的隔离效果, 跑在不同虚拟机上的用户应用程序是很难做到实现互访而同时又不被VMM所监控到. 那么将不同用户的应用程序部署于不同的虚拟机上,是否应用程序间的严格隔离就得到满足了呢?
 
     如上问题的回答其实是安全操作系统要解决的一个问题. 假定在客户VM中跑的操作系统本身不存在安全漏洞可被利用来***用户程序, 那么对如上的问题我们可以给出肯定的回答. 当然这也是一个有点儿奇怪的回答: 如果这样安全的操作系统存在, 用户程序之间的隔离则无须走硬件虚拟化技术的途径. 其实当前利用硬件虚拟化技术来解决操作系统安全问题这样的做法变得越来越热门.这一现象本身恰恰是因为安全操作系统的缺失才使得人们考虑另辟蹊径走虚拟化道路的. 常用的商业操作系统(如Windows, Linux, Unix各种版本, Mac等)可以说没有一个能被认为是安全的操作系统. 如果跑在一个客户VM中的操作系统是这些商业操作系统中的任何一个, 则客户虚拟机之间哪怕是再怎么强的隔离效果都无法在用户程序之间形成有效隔离. 哪怕是在一个VM中只跑一个用户程序也不解决问题! 原因是如此简单: 你无法在用户程序及操作系统之间做隔离! 用户程序需要操作系统对其提供服务.而其中最起码的一项服务就是内存管理. 很不幸,所有商用操作系统偏偏在内存管理上尤其弱得不堪一击(理由我在上一讲中叙述过,下一讲中我还将给出***实例演示).广为所闻的堆栈缓冲区溢出***就是利用了商用操作系统在内存管理上存在的设计漏洞. 你也许可以要求让你的程序"独享专用"一个VM,即不允许其他任何程序使用你的VM.可是你的"仆人",操作系统,却始终在为你服务!这个仆人的确能为你提供许多优质的服务使得你已经离不开它.可是它却有许多与生俱来的缺点和毛病可以被隐藏的敌人利用而给你带来危险!如今似乎没有人能知道常用的商用操作系统中隐含的安全漏洞在哪里.人们已达成共识:发现一个漏洞打一个补钉的方法是不能够得到一个安全操作系统的.
 
     这就是为什么我们说VM之间的隔离无法延伸到用户程序之间的隔离. 在下一讲中我要用一个播客来展示如何利用商用操作系统的漏洞来***一个用户应用程序. 这一杂谈系列将引入道里项目试图解决应用程序间的安全隔离问题的技术手段.