开源沙盒化 API (SAPI) 项目基于 Google 的 Sandbox2 开源项目构建,旨在减轻 C/C++ 库的沙盒化负担。
沙盒化 API 有三个主要优势:
使用 SAPI,您可以沙盒化单个 C/C++ 库,而不必像在沙盒中那样对整个程序进行沙盒化,也不必更改源代码才能对程序的某些部分进行沙盒化处理。因此,在使用 SAPI 时,主程序与 C/C++ 库中的代码执行漏洞是隔离开来的。
我们的工作准则是:一次沙盒,随时随地使用。使用沙盒化 API 沙盒化的库可以轻松重复使用,免除未来项目的负担。在沙盒化 API 推出之前,可供 Google 使用的沙盒要求对要沙盒化的项目的每个新实例进行额外的实现,即使该项目重复使用了相同的软件库,也是如此。对沙盒化进程应用的 Sandbox2 政策和其他限制每次都必须重新实施,而且代码可信部分和不可信部分之间的数据交换机制也必须从头开始设计。
与典型的沙盒项目不同,每个 SAPI 库都采用严格定义的安全政策,在典型的沙盒项目中,安全政策必须涵盖所有使用的库的总系统调用/资源占用量。
SAPI 项目由 Google 沙盒团队的成员设计、开发和维护。它还使用了经过现场测试的 Sandbox2。目前,许多内部项目使用 SAPI 隔离其生产工作负载。
快速入门
如需上手使用 Sandboxed 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 - 克隆并运行构建:
$ 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) 及其核心概念。
使用入门 - 提供相关指导,帮助您创建自己的 SAPI 沙盒化 API 版本。
构建规则 - 介绍如何使用 sapi_library() 构建规则构建 SAPI 库。
变量 - 讨论将指针传递给简单类型和内存块时所需的 SAPI 类型的使用。
事务 - 介绍如何使用 SAPI 事务模块监控函数调用。
术语库
Sandbox2 | 在 SAPI 中提供沙盒层的 Google 开源项目。 |
沙盒模式 | 如需了解在 Sandbox2 沙盒中执行的二进制文件,请参阅 Sandbox2 文档。 在 SAPI 环境中,这是沙盒化 C/C++ 库。 |
SAPI | Sandboxed API 是 Google 开源项目,提供构建沙盒化库的功能。 |
SAPI 库 | 由 SAPI 生成的库,包含沙盒化库、Sandbox2 代码和 SAPI 运行时代码。 |
SAPI 对象 | 主机代码中包含的 C++ 对象,它使用 SAPI 类型(而不是原始类型)提供与沙盒化库的接口。 |
SAPI 类型 | SAPI 提供将指针传递给简单类型和内存块时所需的特殊类型。 |
SAPI 事务 | 用于管理沙盒化库的两次运行之间的沙盒状态的模块。 |
RPC 存根 | 远程过程调用 (RPC) 通信桩封装在 Sandbox2 中,用于在 SAPI 对象和沙盒化库之间传递数据。 |
主机代码 | 使用沙盒化库并包含 SAPI 对象的代码。 |
为沙盒化 API 贡献代码
如果您想贡献数据,请阅读 CONTRIBUTING.md 并向我们发送拉取请求。您还可以报告 bug 或提交功能请求。
如果您希望与开发者沟通或接收关于重大产品更新的通知,可以加入我们的 Google 网上论坛:sandboxed-api-users。