[Tomoyo-dev 96] プログラム実行時の argv[0] チェックの見直しについて

Back to archive index

Tetsuo Handa from-****@I-lov*****
2007年 4月 13日 (金) 23:31:08 JST


 熊猫です。



 /proc/ccs/status には MAC_FOR_ARGV0 という項目があります。
これは、プログラム実行時の filename (プログラムへのパス名)と
argv[0] (プログラムへの最初の引数で多くの場合は filename と同一内容)の
組み合わせを制限する機能です。



 BusyBox のように、 argv[0] の内容によって振る舞いを変化させるプログラムが時々あります。
このようなプログラムの場合、ドメイン遷移は filename の内容に基づいて行われ、
振る舞いは argv[0] の内容に基づいて行われるため、
filename と argv[0] が同一内容であることが望まれます。



 現状、 MAC_FOR_ARGV0 のチェック対象は、
「シンボリックリンクを解決する前の filename 」と「 argv[0] 」の組み合わせになっています。
これは、「シンボリックリンクを解決した後の filename 」と「 argv[0] 」の組み合わせにした場合
(1) filename の内容がシンボリックリンクを解決したパス名で書き換えられる
(2)同種のパス名をグループ化するための aggregator キーワードによって filename の内容が書き換えらる
という2つの原因により、 filename と argv[0] が一致しなくなるケースが多発するためです。



 しかし、現在の仕様では次のような問題があることが判明しました。



 TOMOYO Linux ではシンボリックリンクの作成許可を allow_symlink キーワードで与えます。
allow_symlink キーワードにはシンボリックリンク自身のパス名だけを指定するため、
実行可能ファイルへのシンボリックリンクとして作成することを禁止することはできません。

 そのため、 /bin/ls と /bin/cat が /bin/busybox のハードリンクとして存在し、
/home/demo/cat という名前のシンボリックリンクを作成する許可( allow_symlink /home/demo/cat )と
/bin/ls を実行する許可( 1 /bin/ls )が与えられている場合、
/home/demo/cat という名前で /bin/ls へのシンボリックリンクを作成して /home/demo/cat を実行することにより、
/bin/cat として動作させることができてしまいます。

 これは、 argv[0] のチェックが filename = argv[0] = "/home/demo/cat" であるため行われないのに対し、
( alias /bin/ls /home/demo/cat という指定がされていないために
シンボリックリンクを解決する前のパス名である filename = argv[0] = "/home/demo/cat" ではなく)
シンボリックリンクを解決した後のパス名である filename = "/bin/ls", argv[0] = "/home/demo/cat" として
実行許可のチェックとドメイン遷移が行われるからです。

 これを防ぐには、 argv[0] のチェックも filename = "/bin/ls", argv[0] = "/home/demo/cat" として
行う必要があります。「シンボリックリンクを解決した後の filename 」と「 argv[0] 」を比較するようにすれば、
argv[0] のチェックが行われるようになるので、
シンボリックリンク経由で argv[0] の内容を弄ることで /bin/ls の実行許可を用いて /bin/cat として
振る舞わせることを阻止できます。



 副作用として、 /etc/rc\?.d/ ディレクトリにある /etc/init.d/ ディレクトリにあるスクリプトへの
シンボリックリンクを実行する場合に、例えば

filename = "/etc/rc2.d/S99rc.local" , argv[0] = "S99rc.local"

であるために argv[0] のチェックを行わずに済んでいたものが

filename = "/etc/init.d/rc.local" , argv[0] = "S99rc.local"

として argv[0] のチェックを行われるようになるため
/etc/init.d/rc の動作するドメインに対して

allow_argv0 /etc/init.d/rc.local S99rc.local

というアクセス許可を追加してやる必要が発生します。
再学習させるには、 MAC_FOR_ARGV0 を学習モードにする必要がありますが、
MAC_FOR_FILE 等の他の項目には影響はありません。
なお、ほとんどのシンボリックリンクは alias キーワードにより指定済みであるため、
上記の原因1の影響を受けることは無く、追加が必要な allow_argv0 の件数は僅かです。

パッチを添付します。 patch -p1 < patch.txt で適用できます。
他に問題点が無いかは今後考えていきたいと思います。
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: patch.txt
型:         application/octet-stream
サイズ:     1308 バイト
説明:       無し
下载 


tomoyo-dev メーリングリストの案内
Back to archive index