开源沙盒 API (SAPI) 项目基于 Google 的 Sandbox2 开源项目而构建,旨在减轻 C/C++ 库的沙盒负担。
沙盒 API 有三大优势:
您可以使用 SAPI 对各个 C/C++ 库进行沙盒化处理,而无需对整个程序进行沙盒化或者更改源代码,以便像使用 Sandbox2 一样对程序的一部分进行沙盒化。因此,使用 SAPI 时,主程序会与 C/C++ 库中的代码执行漏洞隔离。
我们的座右铭是:沙盒一次,随处使用。您可以轻松重复使用使用沙盒 API 的库,从而消除了未来项目的负担。在沙盒化 API 之前,可用于 Google 的沙盒需要对旨在沙盒化的项目的每个新实例执行额外的实现工作,即使它重复使用了相同的软件库也是如此。每次对沙盒进程应用的沙盒 2 政策和其他限制都必须重新实现,而代码可信和不可信部分之间的数据交换机制必须从头开始设计。
每个 SAPI 库都采用严格定义的安全政策,这与典型的沙盒项目不同,后者在安全政策中必须涵盖所有已使用的库的系统调用/资源总量。
SAPI 项目由 Google 沙盒团队设计、开发和维护。它还使用经过现场测试的 Sandbox2。目前,许多内部项目都在使用 SAPI 隔离其生产工作负载。
快速入门
要开始使用沙盒 API,请按以下步骤操作:
- 安装所需的依赖项(假设您运行的是 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 - 克隆并运行 build:
$ git clone https://github.com/google/sandboxed-api && cd sandboxed-api $ bazel build …
- 请尝试以下示例:
$ bazel run //sandboxed_api/examples/stringop:main_stringop
可用文档
如需详细了解沙盒 API,请访问:
沙盒 API 介绍 - 介绍沙盒 API (SAPI) 及其核心概念。
使用入门 - 提供指导,帮助您创建自己的 API SAPI 沙盒版本。
构建规则 - 介绍了如何使用 sapi_library() 构建规则来构建 SAPI 库。
变量 - 讨论将指针传递给简单类型和内存块时需要使用 SAPI 类型。
事务 - 介绍如何使用 SAPI 事务模块来监控函数调用。
术语库
沙盒 2 | Google 开源项目,提供 SAPI 中的沙盒层。 |
沙盒 | 在 Sandbox2 沙盒中执行的二进制文件,请参阅 Sandbox2 文档。在 SAPI 环境中,这是沙盒化的 C/C++ 库。 |
API | 沙盒 API,是 Google 的开源项目,提供用于构建沙盒库的功能。 |
SAPI 库 | 由 SAPI 生成的库,其中包含沙盒库、沙盒 2 代码和 SAPI 运行时代码。 |
SAPI 对象 | 包含在主机代码中的 C++ 对象,它使用 SAPI 类型(而不是原始类型)提供沙盒化接口的接口。 |
SAPI 类型 | SAPI 提供将指针传递给简单类型和内存块时所需的特殊类型。 |
SAPI 事务 | 用于管理运行期间沙盒化库沙盒状态的模块。 |
RPC 桩 | 封装在 Sandbox2 中的远程过程调用 (RPC) 通信存根,用于在 SAPI 对象和沙盒化库之间传递数据。 |
主机代码 | 使用沙盒库并包含 SAPI 对象的代码。 |
为沙盒 API 做贡献
如果您想贡献代码,请阅读 CONTRIBUTING.md 并向我们发送拉取请求。您还可以报告 bug 或提交功能请求。
如果您想要与开发者交流或获得重大产品更新的通知,可以加入我们的 Google 群组:sandboxed-api-users。