沙箱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. jquery ajax 跨域提交(附IE浏览器解决方案)

    后台输出内容之前需要指定header("Access-Control-Allow-Origin: *"); post 之前 jQuery.support.cors = true; ...

  2. Apache+php+mysql win7 64位安装的几个注意事项

    网上一堆安装教程,所以不赘述具体安装过程,只说注意事项.新手推荐phpstudy 如果想单个安装,那么以下是我两三年内多次在win winserver环境下配置Apache环境的一点注意事项,下载连接 ...

  3. android 遇到的细节 FAQ

    1.ListView 设置addHead 在3.0与之前版本若在:setAdapter之后添加,运行报错.4.0以后不报错 2.ListView  Adapter    getView函数忘记返回vi ...

  4. 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)

    前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...

  5. codeforces gym 100463I Yawner

    //这题挂得让我怀疑我最近是不是做了什么坏事 题意:一个人有两个集合,先在其中一个集合选一个数x,然后向右走x布,然后再在另一个集合里选一个数y,向左走y步,问是否能走完数轴上所有点. 解:显然是求g ...

  6. linux之SQL语句简明教程---COUNT

    在上一页有提到,COUNT 是函数之一.由于它的使用广泛,我们在这里特别提出来讨论.基本上,COUNT 让我们能够数出在表格中有多少笔资料被选出来.它的语法是: SELECT COUNT(" ...

  7. hdu 1078 FatMouse and Cheese_记忆搜索

    做这类型的搜索比较少,看懂题意花了半天 题意:给你个n*n的图,老鼠一次最远走k步,老鼠起初在(0,0),每次偷吃的东西必须比之前偷吃的要大. #include<iostream> #in ...

  8. Tengine笔记2:通过IP、域名、端口实现虚拟主机

    一.通过端口创建虚拟主机 案例:通过端口访问两个不同的页面 将/usr/local/tengine-2.1.0/html/index.html内的内容改为 Welcom to port1 然后在/op ...

  9. hdu 5569 matrix(简单dp)

    Problem Description Given a matrix with n rows and m columns ( n+m ,) and you want to go to the numb ...

  10. PHP 多input file文件上传

    前台html jquery代码 后台PHP处理 前台html <form id="form" method="post" enctype="mu ...