Tetsuo Handa
from-****@I-lov*****
2007年 9月 5日 (水) 23:30:36 JST
熊猫です。 8/24に2回目のLKML投稿を行いましたが、 予想以上に反応が少ない状況です。反応が少ない理由が 真面目にソースコードを読もうとしているためなのか、 AppArmor の議論の繰り返しを嫌って投稿を避けているのか、 夏期休暇中でオフラインなだけなのかが判らない所が苦しいです。 TOMOYO 1.5 をリリースする前に TOMOYO 2.1 を使って 処理が正しいかどうかを専門家に確認しておきたい箇所があったのですが、 http://lkml.org/lkml/2007/9/5/98 によると (処理が正しいかどうか以前に)受信後にフィルタリングするという方法自体 どうにかできないのかという返事のようです。 すぐに処理が正しいかどうかの議論が始まることは期待できそうに無いので、 もうリリースの準備を始めることにします。 TOMOYO 1.4.2 のバグフィックスを行ったものを 1.4.3 としてリリースし、 1.4.3 に開発会議やこのmlで議論してきた仕様変更を加えたものを 1.5.0 としてリリースしたいと思います。 パッチ( ccs-patch-\*.txt )の作り方は以下のようになります。 カーネル 2.6 系のパッチは 1.4.3 と 1.5.0 で全く同一の内容、 カーネル 2.4 系のパッチは Documentation/Configure.help 以外は 1.4.3 と 1.5.0 で同一の内容になります。 1.4.2 用のパッチと比較して、 1.4.3 および 1.5.0 用のパッチは 以下の点が異なります。 (1) fs/namespace.c に関して if (CheckMountPermission(dev_name, dir_name, type_page, &flags)) return -EPERM; という行を if ((retval = CheckMountPermission(dev_name, dir_name, type_page, &flags)) < 0) return retval; に変更してください。 (2) net/core/datagram.c に関して #include ブロックの後に以下の行を挿入してください。 /***** TOMOYO Linux start. *****/ #include <linux/tomoyo.h> #include <linux/tomoyo_socket.h> /***** TOMOYO Linux end. *****/ 関数 skb_recv_datagram() の中の、 skb = skb_dequeue(&sk->sk_receive_queue); という処理の後に 以下の行を挿入してください。 /***** TOMOYO Linux start. *****/ if ((error = CheckSocketRecvDatagramPermission(sk, skb, flags)) < 0) goto no_packet; /***** TOMOYO Linux end. *****/ (3) net/socket.c に関して 関数 sock_recvmsg() の中の以下の行を削除してください。 /***** TOMOYO Linux start. *****/ if (ret >= 0 && CheckSocketRecvMsgPermission(sock, (struct sockaddr *) msg->msg_name, msg->msg_namelen)) { ret = -EAGAIN; /* Hope less harmful than -EPERM. */ } /***** TOMOYO Linux end. *****/ (4) fs/proc/proc_misc.c に関して printk("Hook version: VERSION DATE\n"); のようにパッチのバージョンとパッチの作成日を更新してください。 1.4.3 および 1.5.0 で修正されるバグは以下の3点です。 (1) CheckMountPermission() が -EPERM ではなく正しいエラーコードを返すようにする。 これは、 /sbin/init が SELinux がサポートされているカーネルかどうかを調べるために selinuxfs のマウントを要求しますが、 SELinux がサポートされていないカーネルの場合 -EPERM を返してしまっていました。 /etc/selinux/config で SELINUX=enforcing と 指定されていた場合、 /sbin/init は selinuxfs のマウント要求が -EPERM を返すと そこでパニックを起こしてしまうため、システムを起動できなくなるという問題がありました。 この問題は CheckMountPermission() が -EPERM ではなく -ENODEV を返すことにより 解消されました。 (2) allow_argv0 ... if if ... という指定を正しく処理できるようにする。 allow_argv0 の2番目のパラメータとして if という単語を指定し、 さらに if 節も指定した場合、ポリシーパーサが正しく処理できませんでした。 この問題は、 FindConditionPart() が最後の if 以降を返せるようにすることで 解消されました。 (3) read() などでパケットを受信した場合にもパケットフィルタリングが機能するようにする。 1.4.2 までは UDP パケットおよび RAW パケットを受信するために read() システムコールや address フィールドに NULL を指定した recvmsg() システムコールで 受信した場合、送信元アドレスによるパケットフィルタリングが機能しませんでした。 また、 MSG_PEEK フラグを指定して recv() システムコールを呼び出した場合、 パケットフィルタリングを行っても受信キューからは削除されないため、 MSG_PEEK フラグを指定せずに recv() システムコールを呼び出すまで 次のパケットを受信キューから取り出せなくなるという問題もあることが判明しました。 これらの問題は、パケットフィルタリングを行う箇所をもっと低いレイヤーに移動させ、 パケットフィルタリングにより( MSG_PEEK フラグが指定されている場合でも) 受信キューから削除されるように修正することで解消されました。 また、 1.5.0 では以下のように仕様が変更されます。 (1) カーネルコマンドラインに init= でポリシーローダを指定しないで済むようにする。 1.4.x までは init=/.init という形式でポリシーローダを明示的に実行させるように する必要がありました。しかし、 1.5.0 では /sbin/init の実行が要求された時に 自動的にポリシーローダを呼び出し、その終了を待って /sbin/init の実行を始めるように 変更されました。この変更により、 grub の設定ファイルで init= を追加する必要が なくなりました。 (2) ポリシーローダのパス名を /.init から /sbin/ccs-init に変更する。 / ディレクトリ直下にプログラムを置きたくないという要望に応えるため、 ポリシーローダを / ディレクトリ直下ではなく /sbin/ ディレクトリ直下に 置くようにしました。 (3) /proc/ccs/ 以下の配置を見直す。 1.4.x までは /proc/ccs/ の下に用途毎にディレクトリを作成していましたが、 1.5.0 ではフラットな配置になりました。 1.0.x との互換性のために残されていた /proc/ccs/info/mapping を廃止しました。 /proc/ccs/status は /proc/ccs/profile に名称変更されました。 (4) initializer ディレクティブを廃止する。 今後は initialize_domain ディレクティブを使ってください。 (5) マウント操作のアクセス許可チェック方法を変更する。 1.4.x までは「マウントするデバイス」「マウントポイント」「ファイルシステム」 「強制的に有効化/無効化するマウントオプション」という4要素を用いて 先頭の3要素が一致したら4要素目を反映してから許可するという形の指定をしていましたが、 1.5.0 では「マウントするデバイス」「マウントポイント」「ファイルシステム」 「マウントオプション」の4要素を用いて全要素が一致した場合のみ許可するという 形の指定に変更されました。 そのため、例えば「 /tmp/ に tmpfs をマウントする場合には自動的に noexec オプションを 有効にした上で許可する」という指定は、「 /tmp/ に tmpfs を noexec オプションを指定して マウントする場合だけ許可する」という指定に置き換わります。 (6) ツールのパス名を /root/ccstools/ から /usr/lib/ccs/ に変更する。 / パーティションに置くファイルの数を最小限にしたいという要望に応えるため、 ポリシーローダである /sbin/ccs-init 以外のツールは /root/ccstools/ ではなく /usr/lib/ccs/ ディレクトリに置くようにしました。 (7) /etc/ccs/ 以下の配置を見直す。 1.4.x まではポリシーファイルの拡張子は .txt でしたが、 1.5.0 では .conf に変更されました。 /etc/ccs/status.txt は /etc/ccs/profile.conf に名称変更されました。 (8) ポリシーエディタでカラー表示ができるようにする。 1.5.0 では editpolicy に行単位で色が付きました。 環境変数で色の指定が行えるようになると良いかもしれませんね。 (9) ポリシーエディタで冗長なアクセス許可を検出できるようにする。 まだ試験的な機能ですが、Domain Policy Editor の画面で O キーを押すと カーソル行で指定されたアクセス許可に包含されるアクセス許可に & マークが表示されるようになりました。この機能を使うと、 冗長なアクセス許可を効率よく削除していくことができます。 (10) loadpolicy が標準入力からの読み込みをサポートするようにする。 主に TOMOYO GUI で使うことを前提とした仕様変更ですが、 ポリシーを /etc/ccs/ ディレクトリからではなく標準入力から 読み込めるようになりました。 なお、 TOMOYO 2.1.0 では /proc/ccs/ が /proc/tomoyo/ に、 /etc/ccs/ が /etc/tomoyo/ に、 /sbin/ccs-init が /sbin/tomoyo-init に なっているという点を除いて TOMOYO 1.5.x と同様であり、 TOMOYO 1.5.x と TOMOYO 2.1.x で同じツールを使えます。 ドキュメントは以下の場所で閲覧可能です。 http://tomoyo.sourceforge.jp/ja/1.5.x/ http://tomoyo.sourceforge.jp/ja/2.1.x/