FreeBSD Daily Topics
2011年9月13日 Capsicumを知る - ケーパビリティモードはfork()したプロセスにも継承 その2
この記事を読むのに必要な時間:およそ 1 分
9月末または10月のリリースが予定されているFreeBSD 9.
- Capability mode going into a child process
Capsicumの実装例としてもう1つだけ紹介しておきます。昨日掲載したソースコードで,
今度は子プロセスでケーパビリティの権限を拡張しようとしてみます。ここでは 「read-cap-process3. c」 として用意しました。 #include <stdlib.
h> #include <stdio. h> #include <fcntl. h> #include <unistd. h> #include <err. h> #include <errno. h> #include <sysexits. h> #include <sys/ capability. h> #include <sys/ types. h> #include <sys/ wait. h> int main(void) { int fd, cap, cap2, len, stat; char bf[BUFSIZ]; pid_ t pid; 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(1) error: %d", errno); close(fd); cap_ enter(); pid = fork(); if (-1 == pid) err(EX_ NOPERM, "fork error: %d", errno); if (0 == pid) { // 権限を広げる方向へケーパビリティを作成してみる cap2 = cap_ new(dup(cap), CAP_ READ | CAP_ WRITE | CAP_ SEEK); if (-1 == cap2) err(EX_ NOPERM, "cap_ new(2) error: %d", errno); close(cap2); len = read(cap2, bf, BUFSIZ); if (-1 == len) err(EX_ NOPERM, "read error: %d", errno); printf("%s\n", bf); fflush(NULL); sleep(10); } else if (0 < pid) { sleep(10); } return 0; } 実行すると次のようになります。当然ですがケーパビリティのエラーとしてはじかれます。
% clang read-cap-process3.
c % ./ a. out | head -3 a. out: cap_ new(2) error: 93: Capabilities insufficient % 数回に渡ってCapsicumの実装例を紹介してきました。実施,
実装するのはcap_ new(2)とcap_ enter(2)くらいのもので, その実装はとてもシンプルなものです。
バックナンバー
FreeBSD Daily Topics
- 2011年9月30日 FreeBSD 1.x系とFreeBSD 10.x系ダブルディジット問題について
- 2011年9月29日 FreeBSD 9.0-BETA3登場
- 2011年9月28日 FreeBSD 10.0-CURRENT登場,ベータ版は3の登場間もなく
- 2011年9月27日 ZFS活用シリーズ - より詳しい情報と説明
- 2011年9月22日 ZFS活用シリーズ - scrubで直らない問題の修正(zdb - 修復編)
- 2011年9月21日 ZFS活用シリーズ - scrubで直らない問題の修正(zdb - 状況調査編)
- 2011年9月20日 ZFS活用シリーズ - scrubで直らない問題の修正(zdb版)
- 2011年9月16日 ZFS活用シリーズ - scrubで直らない問題の修正(アドホック版)
- 2011年9月15日 ZFS活用シリーズ - scrubを使う
- 2011年9月14日 Capsicumを知る - 積極的なセキュリティ強化