9月末または10月のリリースが予定されているFreeBSD 9. Capsicumはデフォルトのカーネルでは有効になっていません。9. Capsicumが有効になると、 まず最初に、 次のようなソースコードを作成します。これを 次のようにコンパイルして実行します。期待通りの動きをしていることを確認できます。 次に、 このプログラムをコンパイルして実行すると、 これがCapsicumの提供するケーパビリティの基本的な使い方です。この場合、 プログラミングはFreeBSDのユーザランドのコマンドなどを参考にしながら、
include GENERIC
ident CAPS
# enable Capsicum
options CAPABILITIES
options CAPABILITY_MODE
cd /usr/src/
make KERNCONF=CAPS buildkernel
make KERNCONF=CAPS installkernel
reboot
% sysctl -a | grep capa
kern.features.security_capabilities: 1
kern.features.security_capability_mode: 1
%
cp /COPYRIGHT ./
chmod u+w ./COPYRIGHT
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sysexits.h>
int
main(void)
{
int fd;
fd = open("COPYRIGHT", O_RDWR);
if (-1 == fd)
err(EX_NOPERM, "open error: %d", errno);
printf("open succeed: %d\n", fd);
return 0;
}
% clang open.c
% ./a.out
open succeed: 3
%
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <err.h>
#include <errno.h>
#include <sysexits.h>
#include <sys/capability.h>
int
main(void)
{
int fd;
cap_enter(); // この行に注目。ケーパビリティモードに入ります。
fd = open("COPYRIGHT", O_RDWR);
if (-1 == fd)
err(EX_NOPERM, "open error: %d", errno);
printf("open succeed: %d\n", fd);
return 0;
}
% clang open-cap.c
% ./a.out
a.out: open error: 94: Not permitted in capability mode
%