什么是沙盒化 API?

开源的 Sandboxed API (SAPI) 项目基于 Google 的 Sandbox2 开源项目构建,旨在减轻 C/C++ 库沙盒化的负担。

沙盒化 API 具有三大主要优势:

  • 与 Sandbox2 不同,SAPI 不会沙盒化整个程序,也不需要更改源代码才能沙盒化程序的一部分,而是可以沙盒化单个 C/C++ 库。因此,借助 SAPI,主程序可以免受 C/C++ 库中代码执行漏洞的影响。

  • 我们的工作座右铭是:在沙盒中测试一次,随处使用。使用沙盒化 API 进行沙盒处理的库可以轻松重复使用,从而减轻未来项目的负担。在推出 Sandboxed API 之前,Google 可用的沙盒需要针对每个新项目实例(即使该实例重复使用相同的软件库)进行额外的实现工作,才能实现沙盒化。每次都必须重新实现应用于沙盒进程的 Sandbox2 政策和其他限制,并且必须从头开始设计代码的可信部分和不可信部分之间的数据交换机制。

  • 每个 SAPI 库都使用严格定义的安全政策,这与典型的沙盒项目不同,在沙盒项目中,安全政策必须涵盖所有已用库的总 syscall/资源占用空间。

SAPI 项目由 Google 沙盒团队的成员设计、开发和维护。它还使用了经过实地测试的 Sandbox2。目前,许多内部项目都在使用 SAPI 来隔离其生产工作负载。

快速入门

如需开始使用沙盒化 API,请按以下步骤操作:

  1. 安装所需的依赖项(假设您运行的是 Debian 10 Buster):
    $ echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | 
    sudo tee /etc/apt/sources.list.d/bazel.list $ wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install -qy build-essential linux-libc-dev bazel python3
    python3-pip libclang-7-dev $ pip3 install clang
  2. 克隆并运行 build:
    $ git clone https://github.com/google/sandboxed-api && cd sandboxed-api
    $ bazel build 
  3. 不妨试试以下示例
    $ bazel run //sandboxed_api/examples/stringop:main_stringop

可用文档

如需详细了解沙盒化 API,请点击以下链接:

  • 沙盒化 API 说明 - 介绍了沙盒化 API (SAPI) 及其核心概念。

  • 使用入门 - 提供指南,帮助您创建 API 的自有 SAPI 沙盒版本。

  • 构建规则 - 说明如何使用 sapi_library() 构建规则来构建 SAPI 库。

  • 变量 - 讨论了在将指针传递给简单类型和内存块时所需的 SAPI 类型的使用。

  • 事务 - 说明如何使用 SAPI 事务模块来监控函数调用。

术语库

Sandbox2 Google 开源项目,可在 SAPI 中提供沙盒层。
Sandboxee 在 Sandbox2 沙盒中执行的二进制文件,请参阅 Sandbox2 文档。 在 SAPI 的上下文中,这是沙盒化的 C/C++ 库。
SAPI 沙盒化 API,Google 开源项目,提供用于构建沙盒化库的功能。
SAPI 库 由 SAPI 生成的库,包含沙盒库、Sandbox2 代码和 SAPI 运行时代码。
SAPI 对象 包含在宿主代码中,使用 SAPI 类型(而非原始类型)提供沙盒库接口的 C++ 对象。
SAPI 类型 SAPI 提供在将指针传递给简单类型和内存块时所需的特殊类型。
SAPI 交易 用于管理沙盒化库在运行之间的沙盒状态的模块。
RPC 桩 封装在 Sandbox2 中并用于在 SAPI 对象和沙盒化库之间传递数据的远程过程调用 (RPC) 通信桩。
主机代码 使用沙盒库并包含 SAPI 对象的代码。

为沙盒化 API 做贡献

如果您想贡献代码,请阅读 CONTRIBUTING.md 并向我们发送拉取请求。您还可以报告 bug 或提交功能请求。

如果您想与开发者交流或接收有关重大产品更新的通知,不妨加入我们的 Google 群组:sandboxed-api-users