沙箱


英文原文快照


本文档描述了沙箱技术在Fushsia系统中的工作原理。

一个空的进程不具有任何功能

在Fuchsia中,一个新创建的过程不具有任何功能,它无法访问任何内核对象,无法分配内存,甚至无法执行代码。当然,这样的进程不会很有用,所以我们通常需要使用一些初始资源和功能来创建进程。

其中最常见的做法是,进程使用初始堆栈、一些命令行参数、环境变量和一组初始句柄开始执行某些代码,这其中最重要的初始句柄之一是PA_VMAR_ROOT,进程可以使用该句柄将额外的内存映射到其地址空间上。

命名空间是通向外部世界的门户

传入进程的一些初始句柄是进程挂载到namespace的目录,这些句柄允许进程发现并与系统上运行的其他进程通信,包括文件系统和其他服务。有关更多详细的信息,请查看命名空间

赋予进程的命名空间会强烈作用于进程可以对系统发挥的影响。因此,配置进程运行的沙箱相当于配置进程的命名空间。

包和命名空间

在我们当前的实现中,如果进程的二进制文件包含在程序包中,则进程将在沙箱中运行。随着包管理器的发展,这些细节可能会发生变化。

默认情况下,从包运行的组件可以访问两个名称空间:

  • /svc:是来自组件运行环境的一组服务。
  • /pkg:是包含该组件程序包的只读视图。

一个典型的组件将与/svc中的许多服务进行交互,以便在系统中发挥应有的作用。

要在运行时访问这些资源,进程可以使用/pkg命名空间。例如,root_presenter可以使用绝对路径/pkg/data/cursor32.png来访问cursor32.png

配置额外的命名空间

如果进程需要访问额外的资源(例如,设备驱动程序),则程序包可以通过在它自身的组件清单文件(英文原文)中包含sandbox属性来请求访问其他额外的名称。例如,以下meta/sandbox文件可以请求直接访问输入驱动程序:

  1. {
  2. "dev": [ "class/input" ]
  3. }

在当前的实现中,AppMgr用于授权所有此类请求,但随着系统的演化,未来可能会发生变化。

构建程序包

为了构建一个包,请使用gn//build/package.gni中定义的package()宏。有关资源的详细信息,请参阅package()宏的相关文档。

例如,可以参阅https://github.com/fuchsia-mirror/garnet/blob/master/packages/prod/fortunehttps://github.com/fuchsia-mirror/garnet/blob/master/bin/fortune/BUILD.gn文件。