Capsicum is a lightweight OS capability and sandbox framework.

UNIXやWindowsの基本的なセキュリティモデルはDAC(Discretionary Access Control, 任意アクセス制御)かMAC(Mandatory Access Control, 強制アクセス制御)に分類できる。DACは自分でアクセス権限を設定することができるもので、自分をほかのユーザからプロテクトする用途に向いている。DACは管理者がアクセス権限を設定しユーザは変更できない。強力なアクセス制御をしたい場合に向いている。

DACとMACはファイルやプロセス単位での制御になっているため、プロセスの中でいくつもの異なる処理をするようなケースにおけるアクセス制御には向いていない。たとえば古いFirefoxのようにすべての処理を単一プロセスでこなしているような場合、プロセス内部で個別に細かくアクセス制御をするといったことはできない。レンダリング処理のコードにはこの権限、JavaScript処理のコードにはこの権限、といった設定は基本的にはできない。

そういったケースでは通常、アプリケーションを複数のプロセスに分離して、それぞれのプロセスにアクセス制御をかける。古くからある手法で、最近ではChromeやOpenSSHがこうしたテクニックを使った代表的なアプリケーションのひとつといえる。この方法はDAC/MACの機能を活用し広く使われているテクニックだが、プログラマの技量に依存する面が多く実装が難しいほか、実装上の穴からセキュリティリスクを分離しきれないケースがあるという問題がある。

こうした問題を解決する新しいセキュリティメカニズムCapsicum (キャプシカム) (論文PDF)が、そろそろ広くユーザの手に届きそうだ。このタイミングでどういったものかを把握しておきたい技術だ。これはUNIXのMAC/DACと、FreeBSDのJailを組み合わせたような機能を、アプリケーションそのものに対して適用するというもの。アプリケーション内部を分割して細かい制御を可能にする。

Capsicumは2つの新しい概念を導入する。ケーパビリティモードとケーパビリティだ。プロセスは新しいモードであるケーパビリティモードという状態に入る。そこからケーパビリティの設定を行う、というのが基本的な仕組みとなる。外部からコマンドで操作するという類のものではなく、プログラミングレベルで利用するサンドボックス機能だ。

  • ケーパビリティモード
  • ケーパビリティ

プロセスがケーパビリティモードに入ると、プロセスはファイルシステム、プロセスID、Sysctl、プロトコルアドレス、IPC、システムクロック、CPUセットなどグローバルなネームスペースにアクセスできなくなる。いくつかのioctlや特定の操作もできない。まるでアプリケーションだけがJailの中にはいったような状況になる。このJail状態はここから派生するプロセスに引き継がれるほか、クリアもできない。クリアができないあたりはDACのようだ。

次にケーバビリティを設定する。どの操作を許可するかを設定するわけだ。実行時に自分で設定できるあたりはMACのようだ。ファイルディスクリプタやメモリマッピングにおいて、どの処理を許可するかを設定していくことになる。今のところ60ほどのマスクが用意されている。すべて自分で細かく実装することもできるが、より簡単に実装できるようにしたライブラリlibcapsicumも提供されている。

Windows ACLs/SIDs、MAC OS X Seatbelt、SELinux、Linux seccompなど、サンドボックス技術はほかにいくつもある。実際、ChromeはこれらOSに特有のサンドボックス機能を活用して実装されている。こうしたサンドボックス技術と比べたCapsicumの特徴は次のとおり。

  • MACやDAC、Jailなど既存のセキュリティ技術と衝突しない。これまでの技術がカバーしていない部分を補う側面が強い。
  • 既存のUNIX APIを強化する作りになっており導入しやすい。
  • ほかのサンドボックス技術を使った場合と比較して実装にかかるコーディング量が少なくて済む。

Capsicumの論文には、実際にtcpdump、dhclient、gzip、ChromiumにCapsicumを適用したケースが紹介されており、なぜ適用したのか、どういった効果があるのかが紹介されている。Capsicumの実装はFreeBSD 9.0へのマージが計画されているため、FreeBSD 9.0のリリース後には簡単に試せるようになる。実装におけるポイントやベンチマークなどより細かい情報はCapsicum: practical capabilities for UNIX (PDF)にまとまっている。