概要

さまざまなシナリオで Sandbox2 を使用する方法とポリシーの作成方法を示すために、いくつかの例を用意しました。

これらは //sandboxed_api/sandbox2/examples にあります。詳細については、以下をご覧ください。

CRC4

CRC4 の例は、CRC4 チェックサムの意図的にバグのある計算です。これは、別のプログラムをサンドボックス化して、そのプログラムと通信する方法を示しています。

  • crc4bin.cc: サンドボックス化するプログラム(サンドボックス化対象)
  • crc4sandbox.cc: 実行するサンドボックス プログラム(つまり、実行者)。

仕組み:

  1. エグゼキュータは、::sandbox2::GetDataDependencyFilePath() を使用してファイルパスから Sandboxee を起動します。
  2. エグゼキュータは、SendBytes() を使用して、通信チャネル Comms を介して Sandboxee に入力を送信します。
  3. Sandboxee は CRC4 を計算し、通信チャネル Comms を介してエグゼキュータに返信を送信します。エグゼキュータは RecvUint32() で返信を受信します。

プログラムが通信(read()write())以外のシステムコールを行うと、ポリシー違反により強制終了されます。

static

静的サンプルは、ソースのないサードパーティ バイナリなど、静的にリンクされたバイナリをサンドボックス化する方法を示しています。つまり、サンドボックス化されることを認識していません。

  • static_bin.cc: Sandboxee は、標準入力から ASCII テキストを大文字に変換する静的 C バイナリです。
  • static_sandbox.cc: ポリシーと上限があり、Sandboxee 入力にファイル記述子を使用する実行プログラム。

仕組み:

  1. 実行プログラムは、CRC4 の場合と同様に、GetDataDependencyFilepath を使用してファイルパスから Sandboxee を起動します。
  2. 制限を設定し、/proc/version でファイル記述子を開き、MapFd を使用して Sandboxee でマッピングされるようにマークします。
  3. このポリシーでは、一部の syscall(open)がポリシー違反により強制終了されるのではなく、エラー(ENOENT)を返すことが許可されます。これは、どのシステムコールが行われるかを変更できないサードパーティ プログラムをサンドボックス化する場合に便利です。代わりに、システムコールを正常に失敗させることができます。

ツール

このツール例は、独自のポリシーを開発して Sandbox2 API を試すためのツールであると同時に、その機能のデモでもあります。

  • sandbox2tool.cc: 次の処理を示す実行ツール:
    • 別のバイナリをサンドボックス化して実行する方法、
    • ファイル システム チェックの設定方法
    • 実行プログラムが Sandboxee を非同期で実行して、出力を段階的に読み取る方法。

実際に試してみる:

Bazel

bazel run //sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

CMake + Ninja

cd build-dir
ninja sandbox2_sandbox2tool && \
./sandbox2_sandbox2tool \
--sandbox2tool_resolve_and_add_libraries \
--sandbox2tool_additional_bind_mounts /etc \
/bin/cat /etc/hostname

Google3(Blaze)

blaze run //third_party/sandboxed_api/sandbox2/examples/tool:sandbox2tool -- \
 --sandbox2tool_resolve_and_add_libraries \
 --sandbox2tool_additional_bind_mounts /etc \
 /bin/cat /etc/hostname

フラグ:

  • --sandbox2tool_resolve_and_add_libraries: Sandboxee に必要なライブラリを解決してマウントする
  • --sandbox2tool_additional_bind_mounts <PATHS> を使用して、Sandboxee で追加のディレクトリを使用できるようにします。
  • --sandbox2tool_keep_env(現在の環境変数を維持するために使用します)
  • --sandbox2tool_redirect_fd1 を使用して Sandboxee STDOUT_FILENO (1) を受け取り、ローカルに出力します。
  • --sandbox2tool_cpu_timeout: CPU タイムアウトを秒単位で設定します。
  • --sandbox2tool_walltime_timeout: 壁時計のタイムアウトを秒単位で設定します
  • --sandbox2tool_file_size_creation_limit: 作成されるファイルの最大サイズを設定します
  • --sandbox2tool_cwd: サンドボックスの現在の作業ディレクトリを設定します。

custom_fork

custom_fork の例は、バイナリを初期化するサンドボックスを作成し、親エグゼキュータからの fork() リクエストを待機する方法を示しています。

このモードでは、他のタイプのサンドボックスと比較してパフォーマンスが向上する可能性があります。このモードでは、Sandboxee の新しいインスタンスを作成する際に、新しいバイナリを実行する必要がなく、既存のバイナリをフォークするだけで済むためです。

  • custom_fork_bin.cc: 新しい Sandboxee を生成するために fork() へのリクエスト(Client::WaitAndFork 経由)を受信するカスタム fork サーバー。
  • custom_fork_sandbox.cc: カスタム フォーク サーバーを起動する実行ファイル。次に、新しい Sandboxee を生成(fork() 経由)するリクエストを(新しい実行プログラム経由で)送信します。

ネットワーク

ネットワーク Namespace はデフォルトで有効になっており、サンドボックス化されたプロセスが外部に接続できないようにします。この例では、この問題に対処する方法を示します。

接続はエグゼキュータ内で初期化され、結果のソケットは ::sandbox2::Comms::SendFD() を介して渡されます。Sandboxee は ::sandbox2::Comms::RecvFD() を使用してソケットを受け取り、このソケットを使用して通常どおりデータを交換できます。

  • network_bin.cc: サンドボックス化するプログラム(サンドボックス化される側)。
  • network_sandbox.cc: 実行するサンドボックス プログラム(つまり、実行者)。

network_proxy

この例では、ネットワーク Namespace を処理する別の方法を示します。内部的には上記の例とまったく同じように動作しますが、より便利な API として公開されています。

Sandboxee は、次の 2 つの方法でネットワーク接続を確立できます。

  • 自動 - 自動ハンドラをインストールし、定期的に接続呼び出しを発行します。
  • manual - NetworkProxyClient を取得し、NetworkProxyClient::Connect を直接使用します。

この例では、両方の方法を示します。connect_with_handler フラグが設定されている場合は自動モードが使用され、それ以外の場合は手動モードが使用されます。

  • network_bin.cc: サンドボックス化するプログラム(サンドボックス化される側)。
  • network_sandbox.cc: 実行するサンドボックス プログラム(実行者)。