9月末または10月のリリースが予定されているFreeBSD 9.
- New capability from capability
既存のケーパビリティをベースに新しいケーパビリティを作成することもできます。ここで注目すべきは、
既存のケーパビリティが持っていない権限を新しく付与することはできない、 ということです。権限を狭くしていくことはできますが、 広げることはできません。 たとえば次のように読み書きを与えたケーパビリティから、
読み込みのみを許可したケーばビリティを作成してみます。ファイルは 「read-cap4. 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> int main(void) { int fd, cap, cap2, len; char bf[BUFSIZ]; fd = open("COPYRIGHT", O_ RDWR); if (-1 == fd) err(EX_ NOPERM, "open error: %d", errno); // 読み書きを許可してケーパビリティを作成 cap = cap_ new(dup(fd), CAP_ READ | CAP_ WRITE | CAP_ SEEK); if (-1 == cap) err(EX_ NOPERM, "cap_ new(1) error: %d", errno); close(fd); cap_ enter(); // ケーパビリティモードに入ってから、今度は // 読み込みのみを許可したケーパビリティを // さらに作成する。 cap2 = cap_ new(dup(cap), CAP_ READ | CAP_ SEEK); if (-1 == cap2) err(EX_ NOPERM, "cap_ new(2) error: %d", errno); close(cap); len = read(cap2, bf, BUFSIZ); if (-1 == len) err(EX_ NOPERM, "read error: %d", errno); printf("%s\n", bf); return 0; } 読み込み処理が実行されることがわかります。この使い方は問題ありません。
% clang read-cap4.
c % ./ a. out | head -3 # $FreeBSD: head/ COPYRIGHT 216848 2010-12-31 18:07:16Z bz $ # @(#)COPYRIGHT 8. 2 (Berkeley) 3/ 21/ 94 % 次に、
読み込みのみを許可したケーパビリティから、 書き込みも許可したケーパビリティを作成してみます。 「read-cap5. 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> int main(void) { int fd, cap, cap2, len; char bf[BUFSIZ]; 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(); // ケーパビリティに入ってから、今度は逆に // 書き込み許可を持ったケーパビリティをつくってみようと // してみる。 cap2 = cap_ new(dup(cap), CAP_ READ | CAP_ WRITE | CAP_ SEEK); if (-1 == cap2) err(EX_ NOPERM, "cap_ new(2) error: %d", errno); close(cap); len = read(cap2, bf, BUFSIZ); if (-1 == len) err(EX_ NOPERM, "read error: %d", errno); printf("%s\n", bf); return 0; } 次のように実行は実現しません。
% clang read-cap5.
c % ./ a. out | head -3 a. out: cap_ new(2) error: 93: Capabilities insufficient % ケーパビリティは権限を減らす方向へのみ新しく作成することができます。必要な処理が終わったら、
不要な権限は削除していくということができます。