沙箱FAQ

转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox_FAQ.html

全书地址
Chromium中文文档 for https://www.chromium.org/developers/design-documents
持续更新ing,欢迎star
gitbook地址:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//
github地址: https://github.com/ahangchen/Chromium_doc_zh

什么是沙箱?

沙箱是一个允许沙箱进程创建的C++库,沙箱进程是一种运行在非常限制性的环境中的进程。沙箱进程可以唯一自由使用的资源是CPU周期和内存。例如,沙箱进程不能写磁盘或者显示他们自己的窗口。它们真正能做的事情由一种明确的策略锁控制。Chromium渲染器都是沙箱化进程。

沙箱可以保护什么,不能保护什么?

沙箱限制了运行在沙箱中的代码的bug的危害。这些bug不能在用户的账号中安装持久性的恶意软件(因为写文件系统被禁止),这些bug也不能读取或者从用户的设备中盗取任何文件。

(在Chromium中,渲染器进程是沙箱化的,它们处于这种保护中。Chromium插件还没有运行在沙箱中,因为许多插件的设计基于这样一个假设:它们对本地系统有着完全的访问权限。另外也要注意,Chromium渲染器进程与系统相隔离,但还未与网络相隔离。所以,基于域名的数据隔离还未提供)。

沙箱不能为系统组件(比如系统内核正在运行的组件)中的bug提供任何保护。

沙箱像JVM?

恩,有点像...除了你必须为Java沙箱的优点重写代码以使用Java。在我们的沙箱中,你可以向你现有的C/C++应用程序添加沙箱。由于代码并非执行于虚拟机中,你可以得到原生的速度,以及对Windows API的直接访问。

我需要安装驱动或者内核模块吗?用户需要有管理员身份吗?

不用。沙箱是一个纯用户模式库,任何用户可以运行沙箱化进程。

如果没有虚拟机,你该怎样用C++实现沙箱?

我们为Windows安全模型划分等级。在Windows里,没有进行系统调用的话,代码不能执行任何形式的I/O(无论是磁盘,键盘,还是显示器)。在大多数系统调用里,Windows执行一些安全检查。沙箱会设置好环境,这样你不愿沙箱化进程执行的动作就会因安全检查而失败。在Chromium中,沙箱就是这样,因此所有访问检查都会失败。

所以一个沙箱化进程(比如渲染器)是如何完成任务的?

某些交流通道会显式暴露给沙箱化进程;这些进程可以从这些通道进行读写。优先级更高的进程可以使用这些通道代表沙箱化进程执行一些动作。在Chromium中,优先级更高的进程通常是指浏览器进程。

Vista没有类似的功能吗?

有的,它被成为信用等级(ILs)。沙箱检测Vista并使用信用等级。主要的不同在于沙箱在Windows XP下良好运行。我们知道的唯一使用信用等级的程序是IE7。换言之,沙箱库会帮你完成对新的Vista安全特性进行分级。

这看起来很干净。我可以在自己的程序里使用沙箱吗?

可以。沙箱对Chromium浏览器没有任何重度依赖,它就是设计用于面向Internet的应用程序。主要的障碍在于你要把你的程序分成至少两个交互进程。一个进程具有比较高的优先级,执行I/O,与用户进行交互;另一个进程基本上没有什么优先权力,并执行不受信任的数据处理。

需要做很多工作吗?

可能需要。但这是值得的,如果你的程序需要处理任意的不受信任的数据时更是如此。你的代码中可能有的任何缓冲溢出或者格式解码缺陷不会自动导致恶意代码对整台计算机造成危害。沙箱不是一个安全银弹,但对于那些恶意使用来说,沙箱是一道强大的最后屏障。

我需要了解什么陷阱吗?

你首先需要记住,你只需要将你完全可控的代码或者完全理解的代码沙箱化。沙箱化第三方代码可能非常困难。例如,你可能不知道第三方代码需要创建临时文件或者弹出警告对话框;除非你显式允许,这些操作不会成功执行。更进一步,第三方组件可以用你预料之外的新形式更新最终用户的设备。

COM, Winsock, 或DirectX在这里又如何? — 我可以使用它们吗?

在绝大多数情况下,不可以。我们不推荐在锁定前使用它们(但也只能在锁定前使用它们)。一旦一个沙箱化进程被锁定,使用Winsock,COM,或者DirectX不是会产生故障就是会彻底失败。

在锁定前是什么意思?沙箱化进程不是从一开始就锁定了的吗?

不是,沙箱化进程并非从一开始就是处于保护之中。沙箱在进程调用LowerToken()后才开始生效。这允许进程启动时有一段时间沙箱化进程可以自由地管理关键资源,加载库,或者读取配置文件。进程需要在它开始与不受信任的数据交互前尽快调用LowerToken()。

注意:如果你的进程被恶意软件感染了,任何在调用LowerToken()后的仍然开放的操作系统句柄会被恶意软件滥用。所以我们不鼓励调用COM或者其他重量级API,它们会为了将来的调用效率遗留一些开放的句柄。

所以你可以调用什么API?

并没有安全API的权威列表。通常,你应该结构化你的代码,这样沙箱化代码可以从管道或共享内存读写或者用其他方式操作数据。在Chromium中,整个WebKit代码都是用这种方式运行的,输出大部分是网页渲染后的位图。你可以将Chromium作为你自己的基于内存或基于管道的IPC的灵感来源。

恶意软件不可以感染管道或共享内存另一端的处理吗?

是的,如果另一端有bug的话,它可以。关键在于,编写和分析一个正确的IPC机制比编写一个web浏览器引擎要简单得多。所以我们将IPC代码做得尽可能简单,并且交由另一端去review。

【Chromium中文文档】沙箱FAQ的更多相关文章

  1. 【Chromium中文文档】Chrome/Chromium沙箱 - 安全架构设计

    沙箱 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox.ht ...

  2. 【Chromium中文文档】OS X 沙箱设计

    OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...

  3. 【Chromium中文文档】进程模型

    进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Process_ ...

  4. 【Chromium中文文档】插件架构

    插件架构 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Plugin_A ...

  5. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  6. 【Chromium中文文档】线程

    线程 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading. ...

  7. 【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?

    安全浏览 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/SafeBrow ...

  8. 【Chromium中文文档】Profile架构(看看谷歌家的重构)

    进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Profile_ ...

  9. 【Chromium中文文档】多进程资源加载

    多进程资源加载(需要更新) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture ...

随机推荐

  1. linux系统学习笔记:文件、目录、用户

    本篇主要从stat函数开始,逐个说明stat结构的每一个成员,以此来了解文件的所有属性.同时将说明修改这个属性的各个函数. 一.文件 使用stat函数族得到和文件有关的信息结构. #include & ...

  2. xml 文件的增删改查

    序列化和反序列化helper using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. android的reference table的问题

    写得android程序总是崩溃,感觉像是内存泄露,但是检查代码发现该释放的都释放了.最终无奈,删除了接口函数中的调用,只使用下面的测试代码. JNIEXPORT jboolean JNICALL Ja ...

  4. 解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

    因为最近更新的PHP版本,写sql语句,忽然发现不能用了,上网查了一些原因,找到几个方法如下: 1.禁止php报错 display_errors = on 改成 display_errors = of ...

  5. 程序员都会的 35 个 jQuery 小技巧

    收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("cont ...

  6. BaseActivity的定义——作为所有Activity类的父类

    public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener { prote ...

  7. 创建一个Hello World模块

    这篇文章描述了怎样为Orchard建立一个非常小的模块,它只显示一个"Hello World"页面. 另一个模块[Module]的简单例子,你可以从这找到:Quick Start ...

  8. URL,URLConnection,HttPURLConnection的使用

    URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象.其对象主要通过URL的openconnection方法获得. 值得注意的是:1.openConnectio ...

  9. 注册flash.ocx inno setup (转)

    ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "xx模块" #de ...

  10. 安装oracle客户端(navicat for oracle)

    本文使用Navicat for Oracle工具连接oracle 安装的过程我就不在此赘述,跟一般软件的安装过程类似.下面主要讲解Navicat的配置. 1.启动该工具,出现如下的开始界面,单击“连接 ...