FreeBSD Daily Topics

2011年9月8日Capsicumを知る - ケーパビリティを取得するcap_new(2) その2

9月末または10月のリリースが予定されているFreeBSD 9.0-RELEASEには新しいセキュリティ機能「Capsicum」が登場します。FDTではしばらく概念的な説明や、実際の実装例などを紹介して「Capsicum」の機能を紹介していきます。

How to use cap_new(2)?

では、実際にcap_new(2)で与えた権限以外の処理をさせてみます。次のように「read-cap3.c」ファイルを用意します。ケーパビリティを作成する段階で読み込みだけを許可しておき、ケーパビリティモードに入ってから書き込みをしてみます。

read-cap3.cファイル
#include h>
#include h>
#include h>
#include h>
#include h>
#include h>
#include h>
#include capability.h>

int
main(void)
{
	int fd, cap, len;
        char bf[BUFSIZ], bf2[] = "a";

	fd = open("COPYRIGHT", O_RDWR);
	if (-1 == fd)
		err(EX_NOPERM, "open error: %d", errno);

	// 読み込みだけを許可したケーパビリティを作成
	cap = cap_new(dup(fd), CAP_READ | CAP_SEEK);
	if (-1 == cap)
		err(EX_NOPERM, "cap_new error: %d", errno);

	close(fd);

	cap_enter();

	// 書きこんでみる
	len = write(cap, bf2, 1);
	if (-1 == len)
		err(EX_NOPERM, "write error: %d", errno);

	return 0;
}

次のように、書き込みは許可されていないので処理できません。

% clang read-cap3.c 
% ./a.out 
a.out: write error: 93: Capabilities insufficient
%

この使い方だと既存のopen(2)時にリードオンリーの指定をするのとあまりかわりませんが、基本的な使い方ということで紹介しておきました。次はもうちょっとCapsicumっぽい使い方を取り上げます。

おすすめ記事

記事・ニュース一覧