この節で説明する特権マクロとシステムコールは、ファイル特権セットの取得と設定を行います。次のプログラムには、この章のすべての例で使用されるヘッダーファイルと変数宣言が含まれます。また、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 つしかない場合には、区切り文字は使用しません。