この例は、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 つの方法のいずれかにより特権を使用してデータの消失を防ぐ必要があります。
ipc_mac_read と proc_nofloat 特権を使用し、上位読み取り処理を有効にし、情報ラベルの浮上を停止する
proc_setsl 特権を使用し、必須アクセスが許容されるように、読み取りプロセスの機密ラベルを Top Secret に変更する (コードを参照)
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