沙箱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. [转载]浅析Windows安全相关的一些概念

    Session 我们平常所说的Session是指一次终端登录, 这里的终端登录是指要有自己的显示器和鼠标键盘等, 它包括本地登录和远程登录.在XP时代每次终端登录才会创建一个Session,但是在Vi ...

  2. Java代理模式——静态代理模式

    一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计 ...

  3. MySQL的表分区(转载)

    MySQL的表分区(转载) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了600万条,那么就可以根据入库日期将表 ...

  4. 使用bootstrap时,选项框出现的意外效果,怎么办?

    <label for="" style="float:right;margin-right:10%;">     <input type=&q ...

  5. Flask把变量注册到模板中

    使用python的Flask框架时,参考<Flask Web开发>一书时,发现书中可以在全局使用Permission.FOLLOW变量. 但是自己在尝试是,确提示变量没有定义.经过搜索,找 ...

  6. Repository仓储 UnitofWork

    Repository仓储 UnitofWork 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 本章我们来创建仓储类Repository 并且引入 UnitOfWork 我对 ...

  7. perl tk说明

    介绍: perl/Tk(也被称为pTK) 是一个模块和代码的收集,尝试 简单的配置Tk 8 部件工具包到强大的词素文文字, 动态内存,I/O, 和面向对象,它是一种解释脚本语言 来制作部件和程序 使用 ...

  8. codevs1166 矩阵取数游戏

    题目描述 Description [问题描述] 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均 为非负整数.游戏规则如下: 1. 每次取数时须从每行各取走一个 ...

  9. HDOJ-1003 Max Sum(最大连续子段 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...

  10. hdu 2157 How many ways_ 矩阵快速幂

    题意:略 直接矩阵乘法就行了 #include <iostream> #include<cstdio> #include<cstring> using namesp ...