今回はケーパビリティを取得するためのcap_new(2)の使い方の基本を紹介します。まず、前回作成したソースコードを少しだけ拡張して、テキストファイルの内容を読み込んで、標準出力に出力するようにします。簡易版cat(1)といったところです。ここでは「read.c」として用意しておきます。
コンパイルして実行するとその通りの動作をします。
次に、ファイルディスクリプタを開いたあとでケーパビリティモードに入った場合、そのファイルディスクリプタが使用できるのかどうかを確認します。ファイルは「read-cap.c」としておきます。
次のように動作していることが確認できます。ケーパビリティモードに入る前に用意したファイルディスクリプタはそのまま利用でき。
次にcap_new(2)でケーパビリティを作成して利用する基本的な方法を説明します。cap_new(2)には既存のファイルディスクリプタと、どの権限を与えるのかの指定を与えます。下記の例ではCAP_READとCAP_SEEKを許可しています。どのシステムコールを許可するのか指定するようなものです。
もとのファイルディスクリプタは、ケーパビリティを取得したあとには使いませんので、通常はdup(2)で複製したファイルディスクリプタを渡しておき、ケーパビリティ取得後にはclose(2)しておくのが通例といえます。ファイルは「read-cap2.c」としておきます。
実行すると次のように動作します。
これがcap_new(2)の基本的な使い方です。cap_new(2)で権限を絞り込み、cap_enter(2)でケーパビリティモードに入ってより制限の厳しい状況で動作する、これがCapsicumの提供する基本的なセキュリティ機能となります。