谷歌的原生客户端(通常缩写为“NaCl”,发音为NAH-cull)是一个有趣的新系统,它允许不可信的x86二进制文件在裸金属上安全运行。不受信任的代码对于Web来说已经是必不可少的了,无论是提供JavaScript源代码、Java字节码、Flash应用程序还是ActiveX控件。Java、JavaScript和Flash都使用从硬件抽象出来的中间表示,使用越来越复杂的分析和编译技术在现代计算机上实现良好的性能。
另一方面,ActiveX(或Netscape/Firefox插件)允许直接传输Windows x86二进制对象,由用户进行数字签名和手动批准,以便本机运行。
ActiveX从来都不是特别需要的。它不能移植到非windows平台上,而且每个用户只要错误地点击一下就会安装恶意软件。与此同时,Flash已经成为一种标准安装,主要是因为它强大的图形和视频库。(当你在浏览器中观看YouTube视频时,你看到的是Flash插件。)事实上,Flash对本地系统有足够的访问权限,它本身已经成为各种安全攻击的目标。当然,你可以在你的系统上卸载Flash(手机根本不支持它),但是太多的网站认为你已经安装了Flash,没有它就无法使用。
在这一缺口上,NaCl提供了一个聪明的选择。像Flash这样用原生x86代码编译和优化的插件,可以在任何Web页面上下载、安装和运行,而无需征求用户的许可。如果插件被证明有安全缺陷,这些缺陷将被NaCl在代码周围构建的墙所包含。
插件可以作为不同的、没有特权的用户在系统中运行,利用任何现代操作系统中已经存在的多用户隔离机制,但这忽略了几个令人不快的现实。首先,世界上有很大一部分电脑运行的是老版本的Windows系统,存在着不可接受的安全漏洞。我们必须建立比这些平台本身机制所能支持的更坚固的墙。其次,我们必须担心CPU bug。虽然最著名的CPU实现错误可能是英特尔的Pentium浮点除法缺陷(算术可能在尾数的低阶位产生错误),但其他错误也不时发生,导致更严重的安全后果。我们需要有能力过滤掉那些可能引起CPU bug的指令或其他不受欢迎的行为。
如果全世界都在运行经典的RISC机器,每个指令都是32位长,那么这个过程就会很简单。然而,可变长度的x86指令允许任何给定的字节数组对应多个不同的指令流,这取决于您跳转到的确切字节偏移量。因此,NaCl引入了一个简单的静态验证器,以确保所有跳转指令只能瞄准32字节对齐边界上的指令,并确保从这些偏移量开始的代码块没有已知的不安全指令。
NaCl系统隐藏了本机系统调用接口,并使用自己的进程间通信机制,同时还使用更传统的操作系统进程权限限制构建了一个“外部沙盒”。原则上,NaCl可以内置于浏览器中,ActiveX和Flash可以被踢出。Adobe可以重新编译Flash以通过NaCl的验证程序,最终用户将减少一个需要担心的安全漏洞来源。此外,如果Web设计人员想使用不同的视频编解码器,他们将不再局限于Flash所支持的内容。更好的是,由于NaCl不一定公开本机操作系统的系统调用接口,我们甚至可以想象NaCl应用程序在Linux、OS X和Windows上可移植运行(NaCl甚至被扩展为支持ARM和x86-64)。
开源NaCl实现的安全性如何?我是谷歌今年早些时候举办的比赛的评委之一。最后,只有5个团队有条目,它们共同确定了谷歌开发团队认为是24个有效的安全问题。这些可以大致分为NaCl支持基础结构中的错误(未处理的异常、缓冲区溢出漏洞和一些“类型混淆”攻击(利用在预期传递另一种类型的地方传递一种类型的能力),以及静态验证者遗漏的模糊指令序列(例如,验证者遗漏了改变跳转指令行为的一类“前缀”位)。一个漏洞依赖于NaCl对内存映射的支持来取消和重新映射代码段,允许执行未经验证的代码。聪明的攻击,但都很容易补救。
总之,下面这篇文章中详细介绍的NaCl设计是实用的和有吸引力的,其已知的实现缺陷并不比我们在任何新兴操作系统的安全边界中可能看到的更糟糕。NaCl的代码库很小,很简单,如果NaCl离开实验室并在该领域获得市场份额,这些类型的错误可以并且将会被修复。
©2010 acm 0001-0782/10/0100 $10.00
允许为个人或课堂使用本作品的全部或部分制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或付费。
数字图书馆是由计算机协会出版的。版权所有©2010 ACM, Inc。
没有发现记录