浏览器中安全执行本地代码——Google NaCl 与 Microsoft Xax

2009-07-20

Native Client(简称 NaCl)和 Xax 分别是 Google 和 Microsoft 近一年来开展的有关在 web 浏览器中安全执行本地代码的研究性工作。它们都已有实验原型,其功能类似于现在的 ActiveX,但相比只能在 IE 中运行的 ActiveX,二者都支持跨操作系统、跨浏览器运行(Xax 还声称可以跨体系结构),同时具备比 ActiveX 更完善的安全模型。这类在本地系统直接运行的代码相比 Flash、Silverlight、Java Applet 等虚拟机、JIT 机制,在性能、功能灵活性方面有优势,也便于移植遗留应用。

NaCl 是开源的,其项目主页提供了大量的文档和示例程序,并开放了讨论区。加之 Google IO 大会的宣传,它得到了行业和媒体相对较多的关注,不少人认为它会成为“ActiveX 杀手”。而 Xax 在网上只有一个简单的论文页面,官方没有提供实验产品和更详细的资料下载,因此网络上关注它的文章很少,可能只在学术界为人知晓。

NaCl 和 Xax 已发表的论文分别是:

从论文可以看出两项工作的侧重点有所不同。NaCl 的论文发表在 S&P/Oakland 2009,主要在论证其模型的安全性,欲打造一个安全且跨平台的 ActiveX 替代品;而 Xax 的论文发表在 OSDI 2008,更强调其软件结构的特性利于遗留应用快速移植到与操作系统、浏览器无关的 web 平台。

NaCl 的结构比 Xax 简单,更类似于 ActiveX。它通过浏览器插件加载应用代码,创建一个沙盒进程来执行不可信的代码,直接在浏览器窗口中输出结果。不可信的代码不能直接访问本地文件系统和网络接口,而可以通过 IMC(Inter-Module Communications)间接调用一些可信的服务模块来访问本地资源。这些模块也是一些浏览器插件,可以通过它们实施安全策略。因此,NaCl 客户端安装和运行过程不需要特殊权限。Xax 的结构相对复杂,它的浏览器插件称为 Xax Monitor。Xax Monitor 包含一个 web proxy,浏览器的 HTTP 流量均要经过它。当 Xax Monitor 发现有 Xax 应用的链接时,它会从远程下载 Xax 应用。Xax Monitor 将下载来的应用代码与 PAL(Platform Abstraction Layer)模块连接,作为本地进程(称为“picoprocess”)运行。picoprocess 通过共享内存与 Xax Monitor 交互,由 Xax Monitor 为其执行封装过的、有限的、安全的系统调用(称为“xaxcalls”)。Xax Monitor 同时作为本地的 web server,通过 HTTP 消息与浏览器通信,处理浏览器到 picoprocess 的输入输出。Xax 使用系统特定的机制(Linux 的 ptrace 或 Windows 的虚拟设备驱动)来保证安全,在 Windows 下安装时需要超级用户的权限。

NaCl 修改了一套 C/C++ 工具链,开发人员下了大量工夫让这套工具链生成的二进制代码安全可靠。其中包括严格的指令对齐、禁用系统调用和中断(只能通过 IMC 间接调用系统服务)、安全的跳转指令等。使用自己的加载器,使得不含系统调用的二进制代码可以跨操作系统加载执行(限于 x86 平台)。Xax 完成的工作类似,生成代码安全方面没有像 NaCl 那样严格控制,而是通过在运行时使用 Linux 的 ptrace 或 Windows 的虚拟设备驱动来阻止恶意添加的系统调用,同时接管内存分配工作,安全地管理堆上数据分配。

Xax 所谓的跨体系结构,目前是在 x86 和 PowerPC 平台上分别做了 ABI(Application Binary Interface)各异的实现,因此运行在不同体系结构上的应用的二进制代码并不能互相兼容,只是说 Xax 机制已能在不同的体系结构上成功实现。作者提出可以用 Binary rewriting 的方法使得 x86 代码在其它平台上翻译执行,做到真正的跨体系结构,不知道现在实现没有。

NaCl 的图形输出与本地程序渲染基本无异,用户体验较好,官方给出的 Quake 示例运行得很流畅(下图是在我的 Ubuntu 9.04 / Firefox 3.5 上运行的截图)。而对于 Xax,浏览器只能通过 HTTP 与连接到 Xax Monitor 的 picoprocess 通信,浏览器中的应用界面目前只能使用 HTML、Javascript 等已有技术渲染。论文中给出的 OpenGL 3D 示例使用 PNG 贴图的方式模拟动画输出,达到了 8.8 fps,用户体验比 NaCl、ActiveX 差一些。但相信加强浏览器插件的能力可以改善效果。

Quake with NaCl

由于 Xax 没有提供下载试用,所以不方便对比二者实际的编程难度和用户体验。个人感觉从用户角度而言,NaCl 似乎是一项更有吸引力的技术,简单地说它就是安全的、跨操作系统和浏览器的 ActiveX。而 Xax 在部署方式(权限)和界面交互效果方面还有欠缺。从开发人员角度来说,使用 NaCl 或 Xax 开发新应用或移植遗留应用都需要把原来使用系统调用的地方修改成调用 NaCl 可信服务模块或 xaxcalls,同时需要重写界面和 I/O 相关代码。NaCl 对代码有更严格的要求,比如不能使用部分不安全的标准库函数、不能滥用不安全的内嵌汇编指令等。而 Xax 的论文认为向 Xax 移植遗留应用是一件程序化的事,只要按照几个步骤去做,很多修改的代码可以复用。估计类似的步骤也可以应用于 NaCl,从 Quake 的成功移植可以看出 NaCl 在这方面应该不差。