Sandbox2 の設計は、よく知られた確立されたテクノロジー、ポリシー フレームワーク、2 つのプロセス(Sandbox Executor と Sandboxee)を基盤としています。
関連テクノロジー
以降のセクションでは、Sandbox2 の基盤レイヤを構築するテクノロジーについて説明します。
Linux 名前空間
Linux 名前空間は、オペレーティング システム レベルの仮想化を提供しようとする試みです。複数のユーザー空間は互いに独立して実行されているように見えますが、単一のカーネル インスタンスを共有します。Sandbox2 は、次の種類の名前空間を使用します。
- IPC
- ネットワーク(
PolicyBuilder::AllowUnrestrictedNetworking()
を呼び出して明示的に無効にした場合を除く) - マウント(ファイル システム ツリーのカスタムビューを使用)
- PID
- ユーザー(
PolicyBuilder::AllowUnsafeKeepCapabilities()
を呼び出して明示的に無効にした場合を除く) - UTS
Linux 名前空間の詳細については、Wikipedia または関連する man ページをご覧ください。
IPC
Sandbox2 では、Sandbox Executor と信頼できない Sandboxee の間で任意のデータを交換できます。Type-Length-Value(TLV)メッセージ、ファイル記述子の受け渡し、トークンとハンドルによる認証情報の交換をサポートします。
Seccomp-BPF
Sandbox2 は、セキュア コンピューティング モード(seccomp)の拡張機能である seccomp-bpf を使用します。これにより、Berkeley Packet Filter(BPF)ルールを使用してシステムコールをフィルタリングできます。
seccomp は、プロセスのシステムコールを exit
、sigreturn
、read
、write
のみを許可するように制限する Linux カーネル機能です。プロセスが別のシステムコールを実行しようとすると、プロセスは終了します。seccomp-bpf 拡張機能は、seccomp よりも柔軟性があります。seccomp-bpf は、固定のシステムコール群を許可する代わりに、システムコール データに対して BPF プログラムを実行し、プログラムの戻り値に応じて、システムコールの実行、システムコールをスキップしてダミー値を返す、プロセスの終了、シグナルの生成、またはトレーサーへの通知を行います。
ptrace
ptrace(プロセス トレース)システムコールは、トレーサー プロセスがトレース プロセスの実行を監視および制御できるようにする機能を提供します。トレーサー プロセスは、一度アタッチされたトレースを完全に制御できます。ptrace の詳細については、Wikipedia または関連する man ページをご覧ください。
サンドボックス ポリシー
サンドボックス ポリシーは、サンドボックスの最も重要な部分で、Sandboxee が実行できるアクションと実行できないアクションを指定します。サンドボックス ポリシーは 2 つの部分に分かれています。
- Syscall ポリシー
- 名前空間の設定
デフォルトの Syscall ポリシー
デフォルトのポリシーは、常に危険なシステムコールをブロックし、ユーザーが指定した拡張ポリシーよりも優先されます。
拡張 Syscall ポリシー
拡張システムコール ポリシーは、PolicyBuilder クラスを使用して作成できます。このクラスは、ポリシーの可読性を向上させるためのいくつかのコンビニエンス ルール(AllowStaticStartup
、AllowDynamicStartup
、AllowOpen
など)を定義します。
システムコールをさらに制限する場合や、より複雑なルールが必要な場合は、AddPolicyOnSyscall
と AddPolicyOnSyscalls
を使用して未加工の BPF マクロを指定できます。crc4 の例では、このメカニズムを利用して、read
、write
、close
システムコールの引数を制限しています。
一般に、サンドボックス ポリシーを厳しくするほど、コード内に存在する脆弱性の悪用はポリシーによって制限されるため、より良い結果が得られます。プログラムの通常動作に必要なシステムコールと引数を正確に指定できれば、コード実行の脆弱性を悪用する攻撃者も同じ制限を受けます。
厳密なサンドボックス ポリシーでは、標準の入出力ファイル記述子に対する読み取りと書き込みを除くすべてのシステムコールを拒否できます。このサンドボックス内では、プログラムが入力を受け取り、処理して、出力を返すことができます。ただし、プロセスが他のシステムコールを実行しようとすると、ポリシー違反により終了します。したがって、プロセスが侵害されても(悪意のあるユーザーによるコード実行)、不正な出力(エグゼキュータやその他の担当者による正しく処理する必要がある)の生成以上の悪質な動作は行えません。
名前空間の設定
PolicyBuilder オブジェクトは、ファイルシステムに関する Sandboxee の個別のビューを設定するためにも使用されます。単一ファイル(AddFile
/ AddFileAt
)、ディレクトリ全体(AddDirectory
/ AddDirectoryAt
)、一時ストレージ(AddTmpfs
)を、Sandboxee の環境にマッピングできます。また、AddLibrariesForBinary
を使用すると、指定された動的にリンクされた実行可能ファイルに必要なすべてのライブラリを自動的にマッピングできます。
コマンドライン フラグ
任意の Sandbox2 ポリシーを無効にするには、次のいずれかのコマンドライン フラグを指定します。これらのフラグはテスト目的に使用します(Extended Syscall ポリシーの改良時など)。
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
サンドボックス エグゼキュータ
サンドボックス エグゼキュータは、サンドボックス化されていないプロセスです。Sandboxee にアタッチされる ptrace トレーサー プロセス(ptrace トレース プロセス)です。また、サンドボックス エグゼキュータは、Sandboxee を追跡してステータス情報を提供する Monitor インスタンスも設定して実行します。
Sandbox2 では、スタンドアロン、Sandbox2 Forkserver、Custom Forkserver の 3 つの実行モードを使用できます。forkserver を使用する場合、Sandboxee は Sandbox Executor の子プロセスとして作成されます。ここでは、これらのモードについて詳しく説明します。
サンドボックス担当
Sandboxee は、サンドボックス ポリシーで定義された制限付きのサンドボックス環境で実行されるプロセスです。サンドボックス エグゼキュータは、IPC 経由でポリシーを Sandboxee に送信します。その後、Sandboxee がポリシーを適用します。このポリシーに違反した場合は、特に設定されていない限り、プロセスが終了します(サンドボックス ポリシーをご覧ください)。