オープンソースの Sandboxed API(SAPI)プロジェクトは、Google の Sandbox2 オープンソース プロジェクトを基盤としており、C/C++ ライブラリのサンドボックス化の負担を軽減することを目的としています。
サンドボックス化された API には、主に次の 3 つのメリットがあります。
Sandbox2 のようにプログラム全体をサンドボックス化したり、プログラムの一部をサンドボックス化するためにソースコードを変更したりする必要はありません。SAPI では、個々の C/C++ ライブラリをサンドボックス化できます。その結果、SAPI を使用すると、メイン プログラムは C/C++ ライブラリのコード実行の脆弱性から分離されます。
Google のモットーは「一度サンドボックス化すれば、どこでも使用できる」です。サンドボックス化された API でサンドボックス化されたライブラリは簡単に再利用できるため、今後のプロジェクトの負担が軽減されます。Sandboxed API の前は、Google で使用できるサンドボックスでは、同じソフトウェア ライブラリを再利用する場合でも、サンドボックス化するプロジェクトの新しいインスタンスごとに実装作業を追加する必要がありました。サンドボックス化されたプロセスに適用される Sandbox2 ポリシーやその他の制限は、毎回再実装する必要があり、コードの信頼できる部分と信頼できない部分間のデータ交換メカニズムは、ゼロから設計する必要がありました。
各 SAPI ライブラリは、厳密に定義されたセキュリティ ポリシーを利用します。これは、セキュリティ ポリシーが使用されるすべてのライブラリの syscall/リソース フットプリント全体をカバーする必要がある一般的なサンドボックス プロジェクトとは対照的です。
SAPI プロジェクトは、Google Sandbox チームのメンバーによって設計、開発、保守されています。また、フィールド テスト済みの 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 - クローンを作成してビルドを実行します。
$ 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 Transaction モジュールを使用して関数呼び出しをモニタリングする方法について説明します。
用語集
Sandbox2 | SAPI でサンドボックス レイヤを提供する Google のオープンソース プロジェクト。 |
Sandboxee | Sandbox2 サンドボックスで実行されるバイナリ。Sandbox2 のドキュメントをご覧ください。SAPI のコンテキストでは、これはサンドボックス化された C/C++ ライブラリです。 |
SAPI | サンドボックス化された API: サンドボックス化されたライブラリを構築する機能を提供する Google のオープンソース プロジェクト。 |
SAPI ライブラリ | SAPI によって生成されたライブラリ。サンドボックス ライブラリ、Sandbox2 コード、SAPI ランタイム コードが含まれます。 |
SAPI オブジェクト | ホストコードに含まれる C++ オブジェクト。元の型ではなく SAPI 型を使用して、サンドボックス ライブラリへのインターフェースを提供します。 |
SAPI のタイプ | SAPI は、単純な型とメモリブロックへのポインタを渡すときに必要な特殊な型を提供します。 |
SAPI トランザクション | 実行間でサンドボックス化されたライブラリのサンドボックス ステータスを管理するために使用されるモジュール。 |
RPC スタブ | Sandbox2 でラップされ、SAPI オブジェクトとサンドボックス化されたライブラリ間でデータを渡すために使用されるリモート プロシージャ コール(RPC)通信スタブ。 |
ホストコード | サンドボックス ライブラリを使用し、SAPI オブジェクトを含むコード。 |
サンドボックス化された API への貢献
投稿をご希望の場合は、CONTRIBUTING.md をお読みになり、pull リクエストをお送りください。バグの報告や機能のリクエストも受け付けています。
デベロッパーと話したり、プロダクトの主な更新について通知を受け取ったりするには、Google グループ sandboxed-api-users に参加することをおすすめします。