早間義博
yossi****@yedo*****
2011年 5月 29日 (日) 17:15:06 JST
早間です。 ドメインの作成についての説明を読んでいくらか判りました。 domain.policy.conf を見たところ、説明のとおり /usr/bin/perl と /usr/bin/perl5.12.3 を含むドメインがありました。 domain.policy.conf の全ドメインの中で /usr/bin/perl を含むものを 全部抽出したところ /usr/bin/perl5.12.3 をドメイン中に含むものは /usr/bin/swatch /usr/sbin/logwatch.pl のサブドメインだけです。両者とも perl で作成されているのですが domain_policy.conf を見ると /usr/bin/swatch /usr/sbin/logwatch.pl ともに allow_execute /usr/bin/perl5.12.3 があり、その他は allow_execute /usr/bin/perl でした。 再び allow_execute とドメインにある /usr/bin/perl5.12.3 を /usr/bin/perl に変更しました。 前回すべての/usr/bin/perl5.12.3 を /usr/bin/perl に変更したときに swatch ではトラブルを起こしているので swatch は learninng モードに 変更しました。swatch は再起動しました。再起動前には WARNING もでま したが再起動した後は WARNING はでていません。 再起動後、domain_policy.conf を再ロードしました。 # tomoyo-loadpolicy fd swatch 再起動 # tomoyo-loadpolicy fd と言う処理です。 tomoyo-editpolicy で見た状況では /usr/bin/perl5.12.3 を含むドメ インは作られていません。 (何回も r を押してみました。いくたびも雪の深さを尋ねけり) perl のコマンド( #! /usr/bin/perl が第1行目のコマンド) には allow_read /usr/bin/perl5.12.3 が必ず入っています。 allow_read に付いては allow_read /usr/bin/perl への変更は出来ないでしょうか。 同様に python やその他の symlink されているコマンドについて特性を調 べれば比較的安全な emerge 対策が出来るものと思われます。 -- 早間 > プログラムの実行について誤解されているといけないので説明しておきます。 > > TOMOYO でいうところのプログラムの実行とは、 execve() というシステムコールを > 呼び出して現在のプロセスイメージを上書きして制御権を移行させることです。 > TOMOYO は、 execve() に渡されたパス名に基づいて、ドメイン遷移を行います。 > > Linux でいうところのプログラムの実行とは、 DAC パーミッションの execute ビット > が設定されていないと失敗する操作全般を指します。これには、 execve() という > システムコールに渡されたプログラムをロードすることだけでなく、 #! などで指定 > されたプログラムをロードすることも含んでいます。例えば > > $ ( echo '#! /bin/sh' ; echo 'echo hello' ) > /tmp/test.sh > $ chmod 755 /tmp/test.sh > > として作成されたプログラム /tmp/test.sh を実行する方法は2つあります。 > > 1つは、 > > $ /bin/sh /tmp/test.sh > > のように実行する方法です。 /bin/sh は # で始まる行をコメント行として無視する > ような仕様になっているため、 /bin/sh は /tmp/test.sh の1行目の内容を無視して > 2行目の echo hello を実行します。 > > もう1つは、 > > $ /tmp/test.sh > > のように実行する方法です。このように実行すると、カーネルは /tmp/test.sh の > 先頭行が #! /bin/sh であることを検知し、制御権を移行させるプログラムとして > /tmp/test.sh ではなく /bin/sh をロードし、あたかも /bin/sh /tmp/test.sh という > 形で実行されたかのように振る舞います。そのため、前者の実行方法と同様の結果が > 得られます。 > > しかし、 TOMOYO では、前者のように実行した場合と後者のように実行した場合とを > 区別しています。前者のように実行された場合には TOMOYO は /bin/sh が実行された > ものとしてドメイン遷移を行うのに対し、後者のように実行された場合には TOMOYO は > /tmp/test.sh が実行されたものとしてドメイン遷移を行います。これは、 /bin/sh や > /usr/bin/perl などをインタプリタとして使用するプログラムに対するドメインを > 区別できるようにするための仕様です。 > > 早間義博 さんは書きました: > > 多くのコマンドを perl で作成し、常駐している関係でこの選択肢は採用 > > したくありません。 > > どちらの方法( $ /usr/bin/perl /usr/bin/swatch なのか $ /usr/bin/swatch > なのか)で実行しているのかを教えてください。それによって答えは変わります。 > > > > > 上記説明を読み間違えているのでしょうか。私は > > (1) <kernel> /usr/bin/kterm で > > allow_execute /usr/bin/perl > > と指定する。 > > そのように指定するのは /usr/bin/kterm から /usr/bin/perl を実行する場合です。 > #! /usr/bin/perl で始まるプログラム(例えば /usr/bin/swatch )を > /usr/bin/kterm から実行する場合、 /usr/bin/perl や /usr/bin/perl5.12.3 ではなく > /usr/bin/swatch を指定します。 > > > (2) /usr/bin/perl5.12.3 が実行されるときドメイン名は > > 「シンボリックリンク解決前」のパス名 /usr/bin/perl が使用され > > るので > > <kernel> /usr/bin/kterm /usr/bin/perl > > となる。 > > > それは、 /usr/bin/kterm から /usr/bin/perl を実行する場合の話です。 > #! /usr/bin/perl で始まるプログラムを /usr/bin/kterm から実行する場合、 > あるいは、 /usr/bin/kterm から /usr/bin/perl5.12.3 を実行する場合には > 該当しません。 > > > と理解しました。そこで、 > > (3) domain_policy.conf のすべての > > /usr/bin/perl5.12.3 > > を > > /usr/bin/perl > > に通常のエディタで書き換えました。 > > 全てを無条件に書き換えるのは間違いです。 > > /usr/bin/swatch や /usr/bin/perl ではなく /usr/bin/perl5.12.3 を実行する場合、 > /usr/bin/perl5.12.3 に対する allow_execute がチェックされます。また、 > #! /usr/bin/perl で始まるプログラムを実行する場合、 /usr/bin/perl5.12.3 に対する > allow_read がチェックされます。 > > > (4) tomoyo-loadpolicy fd を用いて /usr/bin/perl5.12.3 の無い > > domain_policy をロードしました。 > > > 前述したとおり、全てを無条件に書き換えるのは間違いです。 > > > ドメインや allow_execute に > > /usr/bin/perl5.12.3 > > が学習されず、ドメインやallow_execute に > > /usr/bin/perl5.12.3 > > が入り込まないことを願っていました。 > > > > いずれにしても、結果が予測と違っていたので他の選択肢を探すことにな > > ります。 > > > > どうしてそうなってしまうのかこちらでも再現するために > install-amd64-minimal-20110421.iso から環境を構築しようとしましたが、 swatch を > インストールできなかったので代わりに livedvd-x86-amd64-32ul-11.0.iso を > ダウンロード中です。 > > とりあえず、 Gentoo では /usr/bin/perl が /usr/bin/perl5.12.3 への > シンボリックリンクとして提供されているという状況を、 Fedora などと同様に > /usr/bin/perl5.12.3 のハードリンクとして提供する( unlink /usr/bin/perl ; > ln /usr/bin/perl5.12.3 /usr/bin/perl )ように修正すれば、 > /usr/bin/perl5.12.3 が入ることは無くなるものと予想しています。 > > _______________________________________________ > tomoyo-users mailing list > tomoy****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/tomoyo-users >