軽量高速なケーパビリティ/サンドボックス機能Capsicum
FreeBSDはFreeBSD 10.0から新しいセキュリティ機能Capsicumを導入しました。Capsicumはケーパビリティと呼ばれるリソース保護モデルの実装系です。Capsicumの動作についてはCapsicumの研究者であり開発者でもあるRobert N.M. Watson氏のプレゼンテーション資料の次の図がわかりやすいでしょう。
図の左側が従来のソフトウェアです。ここではgzipを引き合いに出しています。従来のgzipはmain()のループ処理と展開処理は単一のプロセスの中で、従来通りの権限で実行されます。これにCapsicumを適用したものが右側の図です。
Capsicumを適用したgzipでは、自分自身をmain()ループ処理と展開処理の2つのプロセスに分離して実行します。そして、展開処理に関してはケーパビリティモードと呼ばれるサンドボックス化された環境で処理を実行します。ケーパビリティモードではリソースへのアクセスが著しく制限されています。
従来のUNIXのプロセスモデルを壊すことなくケーパビリティを実現しているところがCapsicumの最大のポイントです。FreeBSD 10.1ではdhclient、bpf、rwho、kdump、uniq、procstat、cap_mkdb、rwhod、ctld、iscsid、tcpdump、ntpd、auditdistd、hastdなどのコマンドがすでにCapsicumを使って動作するように書き換わっています。今後さらに多くのコマンドやライブラリがCapsicumを使ってより安全に動作するように変更される見通しです。Capsicumに関してはcapsicum(4)オンラインマニュアルにも簡単な説明がありますので読んでみてください。
CHERIケーパビリティモデル
ケーパビリティの機能をアドレス空間におけるメモリ保護に適用する取り組みがCHERI(Capability Hardware Enhanced RISC Instructions)です。従来の仮想メモリの仕組みは何が問題になるかといえば、メモリアクセスに関する保護機能が提供されていないという点にあります。この部分にケーパビリティの概念を導入して、メモリアクセスに保護機能を導入しようというのがCHERIのアイディアです。
実装的にいえば、従来C言語でデータへのポインタとなっている部分を、ケーパビリティ(ここではメモリ領域のメタデータのような役割を持った固定長のデータ。保護の種類やデータのタイプ、データ長やオフセットなどの情報を持っている)にすべて置き換えるというものです。
データへのポインタでは想定外の範囲にアクセスしたときに不正アクセスを検出することが難しいのですが、このようにすべてのポインタにケーパビリティを付加しておけば、その範囲を超える領域にアクセスしようとした場合に不正アクセスとして検出できるようになります。
このセキュリティ機能を実装したオペレーティングシステムが「CheriBSD」です。FreeBSD 9.0からフォークしたオペレーティングシステムで、FreeBSD/MIPSをベースにしています。
CHERIハードウェア/ソフトウェア
CheriBSDの取り組みが面白いのは、ソフトウェアのみならずハードウェア(プロセッサ部分)に関しても開発しているところにあります。研究者らはCapsicumなどの開発を通じ、現在主流のプロセッサが提供している機能では、コンパートメンタリゼーション(区画化、独立化)の機能を実現するためにトリッキーな手段を使わざるを得ないことに気がついたとしています。
これを受けてプロセッサ側にも適切な命令セットを実装し、よりスマートにメモリ空間内のアクセスの区画化を実現しようという取り組みが進められています。
研究開発にはMIPS R4000スタイルのBluespec FPGAをベースに開発されたBERIと呼ばれるハードウェアが使われていますので、CheriBSDとしてはFreeBSD/MIPSを拡張する形で開発が行われています。ソースコードはCTSRD-CHERI/cheribsdで公開されています。GitHubのFreeBSDリポジトリから派生しているので、過去のFreeBSDのコミットログなどと地続きになっているあたりも面白いところです。
今後の開発内容のひとつにほかのアーキテクチャへの移植という項目も挙げられているので、場合によってはFreeBSD/amd64でもCHERIの機能が利用できるようになる日が来るかも知れません。
コンパイラレベルでCHERIに対応
CHERIの実装はコンパイラ/ツールチェーンレベルから対応が進められています。開発の初期段階では個別に手を入れて対応可能かどうか模索し、次の段階ではコンパイラのレベルでデータへのポインタを自動的にケーパビリティおよびケーパビリティを使用するコードに変換するといったことをやっています。
CHERIは従来の仮想メモリのモデルを崩すことなく、そこにうまくはまり込んでいるところが大きな特徴です。しかも、得られるセキュリティ上の利点と比較して発生する負荷が無視できるほど小さいという特徴があるとされています。
このところさまざまなソフトウェアで重大なセキュリティ脆弱性の発見が続いています。オペレーティングシステムレベルでこうしたセキュリティ脆弱性が存在する場合でもその影響が小さいものになるような仕組みが求められています。メモリアクセスを保護する仕組みはCHERIに限らずほかにも研究開発が進められていますので、最終的にどの方法がFreeBSDカーネルへマージされるかはわからないところがありますが、CheriBSDは関係している開発者を見る限り、FreeBSDカーネルにマージされる可能性が高い取り組みの一つといえるように思います。