この例は、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