この節で説明する特権マクロとシステムコールは、ファイル特権セットの取得と設定を行います。次のプログラムには、この章のすべての例で使用されるヘッダーファイルと変数宣言が含まれます。また、execfile (実行可能ファイル) に対するファイル特権セットの設定と取得を行うコードも含まれます。この execfile は、後で exec() により使用され、プロセス特権セットに何が起きるかを表示します。
setfpriv(1) システムコールは、execfile に強制特権セットと許容特権セットを設定し、file_setpriv 特権を要求します。file_setpriv 特権は executable の強制セットに含まれるため、この特権は実行中に許可セットで使用できます。デフォルトでは、有効セットは許可セットと同じです。また、すべての有効特権は、特権のブラケット化の準備のために明示的にオフにされるまでは、オンのままです。このコードにおける file_setpriv の使用は、特権のブラケット化 (「有効な特権のブラケット化」を参照) が有効にならないかぎり、セキュリティガイドラインに従いません。
/* cc priv.c -o executable -ltsol */ #include <tsol/priv.h> #include <sys/types.h> #include <errno.h> #include <stdio.h> /* 大域変数*/ extern int errno; char buffer [3*1024]; main() { char *priv_names = "file_mac_write$proc_setid"; char *string; char *privilege; char *file = "/export/home/zelda/executable"; char *execfile = "/export/home/zelda/execfile"; priv_set_t priv_set, priv_get, permitted_privs, saved_privs; int length = sizeof(buffer); int retval; pid_t pid; /* 後で exec() に使用する */ char *argv[8] = {"execfile"}; /* 特権セットのデータ構造を初期化する */ PRIV_EMPTY(&priv_get); PRIV_EMPTY(&priv_set); /* 許容された特権をオフ(無効) にする。詳細は本文を参照 */ retval = setfpriv(execfile, PRIV_SET, PRIV_ALLOWED, &priv_get);
/* 特権セット構造体内で、Priv_names に指定した特権を */ /* 表明し、execfile に割り当てる。特権の表明のやり方については */ /* 本文を参照 */ if((string = str_to_priv_set(priv_names, &priv_set, "$")) != NULL) printf("string = %s errno = %d¥n", string, errno); retval = setfpriv(execfile,PRIV_ON, PRIV_ALLOWED, &priv_set); /* 許容された特権セットに特権が含まれていることを確認する */ retval = getfpriv(execfile, PRIV_ALLOWED, &priv_get); priv_set_to_str(&priv_get, '$', buffer, &length); printf("execfile Allowed = %s¥n", buffer); /* 特権セットのデータ構造体を初期化する */ PRIV_EMPTY(&priv_set); PRIV_EMPTY(&priv_get); /* 特権セット構造体で file_mac_write を表明する */ PRIV_ASSERT(&priv_set, PRIV_FILE_MAC_WRITE); /* 強制された特権セットを execfile ファイルに対して有効にする */ retval = setfpriv(execfile, PRIV_ON, PRIV_FORCED, &priv_set); /* 強制された特権セットに特権が含まれていることを確認する */ retval = getfpriv(execfile, PRIV_FORCED, &priv_get); priv_set_to_str(&priv_get, `$', buffer, &length); printf("execfile Forced =%s¥n", buffer); }
printf 文により、execfile に対するファイル特権セットが次のように出力されます。
execfile Allowed = file_mac_write$proc_setid
execfile Forced = file_mac_write
この出力は、ドル記号 (「$」) を使用して許容される特権を分離しています。この区切り文字は、priv_set_to_str(3) に対する呼び出しで指定されます。セット内に特権が 1 つしかない場合には、区切り文字は使用しません。