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

2009/07/16 | 22:20 | 分类:Web与移动平台 | 标签: | 1,182次阅读

  Native Client(简称 NaCl)和 Xax 分别是 Google 和 Microsoft 近一年来开展的有关在 web 浏览器中安全执行本地代码的研究性工作。它们都已有实验原型,其功能类似于现在的 ActiveX,但相比只能在 IE 中运行的 ActiveX,二者都支持跨操作系统、跨浏览器运行(Xax 还声称可以跨体系结构),同时具备比 ActiveX 更完善的安全模型。这类在本地系统直接运行的代码相比 Flash、Silverlight、Java Applet 等虚拟机、JIT 机制,在性能、功能灵活性方面有优势,也便于移植遗留应用。
  NaCl 是开源的,其项目主页提供了大量的文档和示例程序,并开放了讨论区。加之 Google IO 大会的宣传,它得到了行业和媒体相对较多的关注,不少人认为它会成为“ActiveX 杀手”。而 Xax 在网上只有一个简单的论文页面,官方没有提供实验产品和更详细的资料下载,因此网络上关注它的文章很少,可能只在学术界为人知晓。
  NaCl 和 Xax 已发表的论文分别是:
  ● Native Client: A Sandbox for Portable, Untrusted x86 Native Code
  ● Leveraging Legacy Code to Deploy Desktop Applications on the Web
  从论文可以看出两项工作的侧重点有所不同。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 差一些。但相信加强浏览器插件的能力可以改善效果。
浏览器中安全执行本地代码——Google NaCl 与 Microsoft Xax
  由于 Xax 没有提供下载试用,所以不方便对比二者实际的编程难度和用户体验。个人感觉从用户角度而言,NaCl 似乎是一项更有吸引力的技术,简单地说它就是安全的、跨操作系统和浏览器的 ActiveX。而 Xax 在部署方式(权限)和界面交互效果方面还有欠缺。从开发人员角度来说,使用 NaCl 或 Xax 开发新应用或移植遗留应用都需要把原来使用系统调用的地方修改成调用 NaCl 可信服务模块或 xaxcalls,同时需要重写界面和 I/O 相关代码。NaCl 对代码有更严格的要求,比如不能使用部分不安全的标准库函数、不能滥用不安全的内嵌汇编指令等。而 Xax 的论文认为向 Xax 移植遗留应用是一件程序化的事,只要按照几个步骤去做,很多修改的代码可以复用。估计类似的步骤也可以应用于 NaCl,从 Quake 的成功移植可以看出 NaCl 在这方面应该不差。

《程序员的自我修养》是有学习价值的

2009/05/23 | 14:20 | 分类:计算机科学与编程 | 标签: | 1,634次阅读

  不久前收到了博文视点寄来的新书——《程序员的自我修养——链接、装载与库》。比较巧的是,我这段时间正在从事一个涉及多语言互操作的项目,那些天还在看一些有关C++语言设计和实现原理的文献,这本《程序员的自我修养》和我最近的工作还是多多少少有点联系的。
  有的人可能认为读博士的人不应该再去关注这些面向程序员、纠结于技术细节的书了,而要专心于自己的研究领域,做偏科学、偏理论的事。这是有道理的,博士教育和硕士教育的差异即在此,漂泊在茫无涯际的技术海洋很可能让本应该专注于一个方向的人不知所向。但是我们也要反思,自己的基础是否足够扎实?对计算机原理的理解是否超越了那些具体技术的层面?自己是否真的具备了从事科研的素质?我的导师在他的科普作品《电脑启示录》(中篇 硅谷的秘密)中曾提到作为计算机科研人员应该具备的基本素质,并例举了几个用来考察这些素质的问题,诸如:从计算机开机到操作系统等待用户输入,经历的一系列流程是什么?在浏览器里敲入一个网址到网页呈现给用户,期间又有哪些工作细节?这些过程看似稀疏平常,其中的大道理在本科计算机课程中也都或多或少地介绍过,然而要精确地表达每个步骤,更重要地是说明每个步骤为什么要这样设计、为什么会这样实现、其中的科学依据是什么,往往不是每个计算机专业毕业生都能说清楚的。这类问题常常能从侧面反映一个从业人员的理论功底及实践经验。《程序员的自我修养》所阐述的也正是同一类的问题:一个程序由硬盘上目标文件、可执行文件变成内存中的进程体、CPU中的指令流,整个过程的来龙去脉是什么,有什么原理、诀窍、讲究和因果联系。
  在计算机领域从事不同具体工作的科研、技术人员,静下心来分析一下这些平时被各种层面的接口掩盖了的机制是有好处的。初用VC++编程的时候,也许你会奇怪,监视窗口为什么要输出一串“烫”字;干Linux工程时,仅仅链接了几个标准库文件就把程序搞崩溃了,你会认为这是链接器或标准库的bug,还是自己没有弄明白它们的机理?如果你在计算机学科的其它方面有过一些细致的了解,你又会发现,像自举引导、延迟绑定等共性的方法,时间与空间转换、策略与机制分离等共性的原则在编译、链接、装载过程中也都有生动的体现。而即使你是做研究的,方向与程序原理相隔甚远,看看这些计算机领域内实现相对成熟、应用相对普遍的、原理相对通用的问题,对自己的工作也很有启发意义。
  尽管这本书有待市场的考验,但它研究的问题确属计算机学科中的经典。把理解链接、装载与库作为程序员的自我修养是否合适?我想,它算不上充分条件,不过确实是一个必要条件。不仅对程序员来说必要,对任何一个从事计算机研究与开发的人来说都是有价值的。

复习C++,看了点书

2009/05/01 | 19:48 | 分类:学习随感 | 标签: | 1,566次阅读

  冠仔和晓玮最近找我讨论了不少C++问题,这促使我重新拿起书把C++复习了一阵。大二的时候学习C++,看的是《Thinking in C++》,对那些概念、规则记得比较熟,但往往说不清每种特性在实际中到底有什么用,它们为什么要这样设计。前一段时间挑了《The C++ Programming Language》《C++ Primer》中的部分章节阅读,加之有了几年的工程实践,很多问题也便豁然开朗了。对复习过程最受用的还要算《The Design and Evolution of C++》这本在国内不太流行的书,要知道它的作者同样是C++之父Stroustrup。这本书从技术史的角度阐述了C++的每个特性的设计目的和实现机理,使人对C++一些看似蹩脚的设计不再感到奇怪。它与微软那本《The Old New Thing: Practical Development Throughout the Evolution of Windows》给我们一个共同的启示:在不了解一个事物的历史源由的情况下,不要轻言其设计得愚蠢。像C++和Windows这类相对成熟的产品,每个细节的存在都是有一定道理的。
  为检验自己的复习效果,我又借了本这两年买得很火的《程序员面试宝典》(第二版)来。冠仔一看这书,马上提出了他的反对意见,说这书内容很功利,编写很浮躁,还有一些错误。这也倒好,我可以批判性地阅读,看看自己有没有能力把书中的错误找出来,或者给回答得浮躁的问题一个更好的答案。花了两个半天读完,觉得这本书的瑕疵还真是不少,仅以我重点阅读的“C/C++程序设计”部分,就发现了若干错误或不妥的地方:
  ● 5.2节例题1、2,main()函数的定义不符合标准,要知道“int main()”和“return 0;”是往往考查过程中一个重要的细节;
  ● 5.6节例题1,源代码中出现了中文字面值,而且没有用wchar_t存储也没有用转义,这是一种依赖于编辑器和编译器的不好的编程习惯;
  ● 6.2节扩展知识,C++中标准不支持“不写类型默认为int的定义”,“const bufsize;”的首要错误应该是这一条;
  ● 6.3节例题1,混淆了“位”与“字节”;
  ● 6.3节扩展知识,尽管看上去VC调整后的3个变量只占了连续的9个字节,但运行时栈里还是要遵循对齐的,char所在的字还是有3个字节未用,这和gcc(Dev-C++)没有本质区别,并非减少浪费。要想说明编译器“聪明”,可以多写几个char和int穿插,但这种调整布局的优化VC/gcc都会做,无所谓谁更“聪明”;
  ● 7.2节例题2,“全局区域的值是不能进行修改的”表述有误,应该强调字符串常量保存在只读的数据段,而不是像全局变量那样保存在普通数据段(静态存储区);
  ● 10.2节例题2,对“Test b();”的解释含糊不清,其实它就是一个参数为void、返回为Test对象的函数的声明,把这一点讲出来,答案自然就清楚了;
  其它还有一些没有回答到点子上的问题,就不一一例举了。尽管如此,我还是从中学到了一些在经典教材上没有注意到的问题,比如C和C++下const变量默认连接规则的不同(6.2节)、volatile变量使用时的注意事项(11.2节)等。总体来说,《程序员面试宝典》为面试突击看看还行,但不要把里面的字字句句当圣经——它很多地方经不起推敲。

GNU bash实现机制与源代码简析

2008/05/27 | 21:36 | 分类:Linux与开源 | 标签: | 1,173次阅读

  本文是本人学习shell实现机理,分析GNU bash源代码时总结的笔记性文档。通过分析bash源代码,阐述了其主要功能模块的组织和实现方式,同时对几个特定的工作流程进行了说明。
  查看地址:
http://www.linjian.cn/files/articles/bash_study/bash_linjian.html
http://files.linjian.org/articles/bash_study/bash_linjian.html
  转载本文请注明出处。如发现文中不妥或错误之处,望不吝赐教。

我期望的《编程之美》

2008/04/13 | 13:08 | 分类:学习随感 | 标签: | 725次阅读

  我第一次听说《编程之美——微软技术面试心得》,是在博客堂2007年会上。当时和邹欣先生坐得不远,他简要地介绍了《编程之美》的内容和写作进度。不久前我在电子科技书店看到此书已经上架,于是借来一阅。
  此书的优点无须我多言。算法是计算机程序设计的灵魂,是每个计算机专业学生和从业人员必须具备的基础素质之一。微软把一些看似简单,但蕴含深刻内涵的算法题目作为面试的重要内容,是经过深思熟虑的。
  不过从我个人角度出发,我更希望看到一本讲述与计算机体系结构、操作系统等原理相关的“经典问题”、“面试心得”一类的书籍。就如同《编程之美》第 1.1节的内容,从计算机软硬件实现的角度出发,引出问题,进而提出算法。与从数学问题直接引出算法相比,更贴近研发人员的实际。
  例如竞态条件和死锁、流水线分析和设计等问题,在计算机专业课本中都是生硬的理论和千篇一律的例子。提到读者写者,我们马上就会想到竞态、并发、死锁等问题,但在一个现实的程序或项目中,缺乏经验的编程人员往往不会立刻发现自己遇到的情形恰恰可以套用读者写者模型。从现实程序问题到算法数学原理,需要体系结构模型的过渡。
  算法和工程是分别是研究和开发人员必备的基本能力,我觉得我的这点期望是二者的交融点。

页面存档: 上页 1 2 3 下页