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