Trusted Solaris 開発ガイド

メッセージ待ち行列ラベルの使用

この例は、Top Secret でメッセージ待ち行列を作成し、そのメッセージを Top Secret 待ち行列に送り、そのメッセージに Top Secret の情報ラベルを与え、fork によりプロセスを作成して、待ち行列からメッセージを取り出します。

親プロセスと子プロセスは、初め、情報ラベル Unclassified を使用して Confidential で動作しています。この例の一部のオペレーションには特権が必要です。コード内のコメントは、第 3 章「特権」で説明している特権ブラケットが必要な位置を示します。

#include <sys/ipc.h>
 #include <sys/types.h>
 #include <tsol/label.h>
 #include <sys/msg.h>

 struct sndmsgbuf{
 	long mtype;
 	char mtext[80];
 } sendmsg;

 main()
 {
 	struct				msgbuf 				*rcvmsg;
 	int									id, retval, error, pid;
 	bclabel_t									cmwlabel;
 	bslabel_t									senslabel;
 	bilabel_t									inflabel;
 	char									*string,*string2, *string3 = "TOP SECRET";

/* メッセージ待ち行列用のメッセージを設定する */
 	sendmsg.mtype = 1;
 	strcpy(sendmsg.mtext, "Hello World!¥n");

/* Top Secret の機密ラベルと情報ラベルを作成する */
/* 有効セット内で sys_trans_label をオン(有効) にする */
 	retval = stobsl("TOP SECRET", &senslabel, NEW_LABEL, &error);
 	retval = stobil(string3, &inflabel, NEW_LABEL, &error);
/* sys_trans_label をオフ (無効) にする */

/* Top Secret のメッセージ待ち行列を作成する */
/* 有効セット内で ipc_mac_write をオン(有効) にする */
 	id = msggetl(IPC_PRIVATE, IPC_CREAT|0666, &senslabel);
/* ipc_mac_write をオフ (無効) にする */

/* Top Secret の情報ラベルを持つメッセージを送る*/
/* 有効セット内で ipc_upgrade_il  をオン (有効) にする */
 	msgsndl(id, (void*)&sendmsg, 80, 0, &inflabel);
/* ipc_upgrade_il  をオフ (無効) にする */

読み取りプロセスの情報ラベルは、メッセージの情報ラベルに浮上します。この例では、fork により作成された confidential で特権のないプロセスは、その情報ラベルをTop Secretに浮上させることはできません。これは、Confidential が Top Secret より優位でないためです。fork により作成されたプロセスは、次の 2 つの方法のいずれかにより特権を使用してデータの消失を防ぐ必要があります。

	pid = fork();
 	if(pid > 0)
 			exit(0);

/* fork で作成されたプロセスの機密ラベルを Top Secrete に設定する */
 	retval = stobsl(string3, &senslabel, NEW_LABEL, &error);
 	getcmwplabel(&cmwlabel);
 	setcsl(&cmwlabel, &senslabel);
/* 有効セット内で proc_setsl をオン (有効) にする */
 	setcmwplabel(&cmwlabel, SETCL_SL);
/* proc_setsl をオフ (無効) にする */

 	rcvmsg = (struct msgbuf *)malloc(sizeof(long) + 80);
 	retval = msgrcvl(id, rcvmsg, 80, 0, 0, &inflabel);

/* プロセスの CMW ラベルを得て、情報ラベルを取り出す */
 	getcmwplabel(&cmwlabel);
 	getcil(&inflabel, &cmwlabel);
 	biltos(&inflabel, &string2, 0, LONG_WORDS);

/* メッセージとプロセスの情報ラベルを出力する */
 	printf("Received message = %s¥n", rcvmsg->mtext);
 	printf("Process information label = %s¥n", string2);
 }

printf 文によって、次のように出力されます。

Received message = Hello World!

Process information label = TOP SECRET