サンドボックス化された API(SAPI)は、確立された Sandbox2 プロジェクトをベースに構築されています。このページでは、SAPI の設計アーキテクチャと主なコンセプトについて説明します。
概要
SAPI は、C/C++ ライブラリをサンドボックス化するためのツールと、サンドボックス化されたバージョンの C/C++ ライブラリとの通信に必要な API をデベロッパーに提供するように設計されています。
この図は、SAPI サンドボックス化された C/C++ ライブラリのアーキテクチャを示しています。
SAPI は、SAPI ライブラリとホストコード間の手動および自動(カスタム ポインタ属性に基づく)メモリ同期(配列、構造体)用のプリミティブも提供します。
最後に、高レベルの Transactions API により、SAPI ライブラリのモニタリングが可能になり、ライブラリが失敗した場合(セキュリティ違反、クラッシュ、リソースの枯渇など)、ライブラリが再起動されます。
Sandbox2
オープンソース プロジェクト Sandbox2 は、Google のセキュリティ エンジニアによって開発および保守されており、SAPI で使用されるコア サンドボックス テクノロジーです。Sandbox2 には、サンドボックス ポリシー、Executor、Sandboxee の 3 つの主要コンポーネントが含まれています。
サンドボックス ポリシー
サンドボックス ポリシーは、サンドボックス化されたライブラリの制限付き実行環境を定義します。これは、実行できるシステムコールを明確にすることで実現されます。SAPI は Sandbox2 と同じメカニズムを使用します。サンドボックス ポリシーの設計と定義の方法について詳しくは、サンドボックス ポリシーのセクションと Sandbox2 のスタートガイドのページをご覧ください。
SAPI はデフォルトのポリシーを使用します。または、sandbox.h ヘッダー ファイルで定義し、sapi_library ビルドルールで引数として渡すことで、専用のサンドボックス ポリシーを使用することもできます。
サンドボックス化されたライブラリ
これは、Sandbox2 が提供する制限付きサンドボックス環境で実行されるサンドボックス化された C/C++ ライブラリです。最終的に、サンドボックス化されたライブラリは、ホストコードで使用できる必要な機能を公開します。
サンドボックス化されたライブラリは sapi_library ビルドルールでビルドされます。このルールでは、制限付き実行環境を定義するカスタマイズされたサンドボックス ポリシーを指定できます。ライブラリによっては、ラッパーまたはスタブコードの作成が必要になる場合があります(libcurl を参照)。ただし、SAPI バージョンの準備中に C/C++ ライブラリのソースコードを変更する必要はありません。
SAPI オブジェクトと RPC スタブ
SAPI オブジェクトは、サンドボックス ライブラリの API を公開する C++ オブジェクトです。ホストコードからの呼び出しを RPC スタブに転送します。RPC スタブは、サンドボックス ライブラリとともに SAPI ライブラリに埋め込まれています。
これらの 2 つの要素は、sapi_library()
ビルドルールを使用してビルドシステムによって自動的に生成されます。SAPI は、Google の Bazel と CMake の 2 つのビルドシステムをサポートしています。
ホストコード
ホストコードは、SAPI ライブラリが提供するロジックを実装するものです。これは、サンドボックス化されていないバージョンの C/C++ ライブラリを使用する場合に必要になります。そのため、ホストコードは SAPI ライブラリによってエクスポートされた関数を呼び出し、サンドボックスにデータを渡し、サンドボックスからデータを受け取ります。
ホストコードは、SAPI ライブラリを使用するように適応させる必要があります。特に、ライブラリは別のサンドボックス プロセスに存在するため、ライブラリの関数を呼び出すことはできません。そのため、SAPI は SAPI ライブラリへの呼び出しをプロキシする SAPI オブジェクトを作成するツールを提供します。
コンセプト
Bazel ビルドルール
SAPI プロジェクトには、C/C++ ライブラリをサンドボックス化するための 2 つの Bazel ビルドルールが用意されています。
sapi_library()
- C/C++ ライブラリを Sandbox2 Sandboxee としてサンドボックス化するために必要なすべての出力を生成します。ビルド出力は、ホストコード バイナリのビルドに使用されるcc_binary()
ルールの依存関係として使用できます。sapi_interface()
- ホストコード バイナリに含めることができるヘッダーを自動生成します。
ビルドルールの詳細については、ビルドルールをご覧ください。
変数
SAPI には、SAPI 型と呼ばれる特別な型がいくつか用意されています。これらは、ホストコードで使用することをおすすめします。SAPI タイプが必要となる主な理由は、ホストコードとサンドボックス化されたライブラリ間のプロセス(つまりメモリ)の分離です。
このトピックの詳細な説明と、一般的に使用される SAPI タイプの概要については、変数をご覧ください。
トランザクション
上記で説明したように、サンドボックス化されたライブラリへの API 呼び出しはすべて RPC レイヤを介して渡されます。このレイヤで障害を処理するには、適切なエラー処理を実装する必要があります。SAPI Transaction モジュールは、サンドボックス ライブラリへのすべての呼び出しが RPC レベルの問題なく完了するか、関連するエラーとともに返されることを保証するために必要なメカニズムを提供します。
このトピックの詳細については、トランザクションをご覧ください。
スタートガイド
スタートガイドのページを読んで、最初のサンドボックス API プロジェクトを設定します。