サンドボックス化された API の説明

Sandboxed API(SAPI)は、確立された Sandbox2 プロジェクトをベースにして構築されています。このページでは、SAPI の設計アーキテクチャと主なコンセプトについて説明します。

概要

SAPI は、サンドボックス化用の C/C++ ライブラリを準備するためのツールや、サンドボックス化されたバージョンの C/C++ ライブラリとの通信に必要な API をデベロッパーに提供することを目的としています。

次の図は、SAPI サンドボックス化された C/C++ ライブラリのアーキテクチャを示しています。

SAPI の図

SAPI には、SAPI ライブラリとホストコードとの間での手動および自動(カスタム ポインタ属性に基づく)メモリ同期(配列、構造体)のためのプリミティブも用意されています。

最後に、ハイレベル トランザクション API を使用すると、SAPI ライブラリのモニタリングが可能になり、(セキュリティ違反、クラッシュ、リソースの枯渇などが原因で)SAPI ライブラリが失敗すると、ライブラリを再起動できます。

Sandbox2

オープンソース プロジェクト Sandbox2 は、Google のセキュリティ エンジニアによって開発、保守され、SAPI で使用されているサンドボックス化の中核技術です。Sandbox2 には、サンドボックス ポリシーエグゼキュータSandboxee という 3 つの主要コンポーネントが含まれています。

サンドボックス ポリシー

サンドボックス ポリシーは、サンドボックス化されたライブラリの制限付き実行環境を定義します。これは、実行できるシステムコールを明確にすることで実現されます。SAPI は Sandbox2 と同じメカニズムを使用します。サンドボックス ポリシーの設計と定義の方法について詳しくは、サンドボックス ポリシーのセクションと Sandbox2 のスタートガイドをご覧ください。

SAPI はデフォルトのポリシーを使用します。または、sandbox.h ヘッダー ファイルで定義し、sapi_library ビルドルールで引数として渡すことで、専用のサンドボックス ポリシーを使用することもできます。

サンドボックス化されたライブラリ

これはサンドボックス化された C/C++ ライブラリで、Sandbox2 に用意されている制限付きサンドボックス環境で実行されます。最終的には、ホストコードが使用できる必須機能が、サンドボックス化されたライブラリによって公開されます。

サンドボックス化されたライブラリは、sapi_library ビルドルールで構築されています。このルールでは、制限付きの実行環境を定義するカスタマイズされたサンドボックス ポリシーを指定できます。ライブラリによっては、ラッパーまたはスタブコードの記述が必要になる場合があります(libcurl をご覧ください)。ただし、SAPI バージョンの準備中に C/C++ ライブラリのソースコードを変更する必要はありません。

SAPI オブジェクトと RPC スタブ

SAPI オブジェクトは、サンドボックス化されたライブラリの API を公開する C++ オブジェクトです。ホストコードからの呼び出しを、サンドボックス化されたライブラリとともに SAPI ライブラリに埋め込まれている RPC スタブに転送します。

これら 2 つの要素は、ビルドシステムが sapi_library() ビルドルールを使用して自動的に生成します。SAPI は、Google の BazelCMake の 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 プロジェクトを設定します。