Tetsuo Handa
from-****@I-lov*****
2011年 5月 29日 (日) 13:14:55 JST
プログラムの実行について誤解されているといけないので説明しておきます。 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 が入ることは無くなるものと予想しています。