from-****@i-lov*****
from-****@i-lov*****
2008年 2月 18日 (月) 10:49:11 JST
熊猫です。 現状(バージョン 1.5.x )ではプログラムを実行するときのパラメータ ( argv[] や envp[] と呼ばれているもの)をチェックする機能がありません。 しかし、 Apache からメールを送信するなどの目的のためにやむを得ず /bin/sh の 実行を許可しなければならない場合があります。そこで、 /bin/sh を実行するときに 例えば /bin/sh -c \"/usr/sbin/sendmail root\" のように argv[1] が \"-c\" であるかどうかを チェックする機能を 1.6.x で追加しようと思っています。 攻撃者がシェルコードを使って /bin/sh を起動するときは 任意のコマンドを実行するために /bin/sh -c \"コマンド\" という形式ではなく /bin/sh という形式で実行しようとするので、 \"-c\" が指定されているかどうかを チェックすることで、シェルコードによる要求かどうかを判断する材料にできると思います。 また、 Samba の trans2open で試したところ、環境変数を一切設定せずに /bin/sh の起動を試みるようにしていることが確認できました。 環境変数の設定のようなあっても無くてもプログラムの起動自体には影響しない処理は 省略されるようです。そこで、環境変数が定義されているかどうかをチェックすることで シェルコードによる要求かどうかを判断する材料にできると思います。 以下のような構文を考えています。 allow_execute /bin/sh if exec.argc=3 exec.argv[1]=\"-c\" 「 /bin/sh -c \"コマンド\"」という形式の場合のみ許可する allow_execute /bin/sh if exec.envp[\"HOME\"]=\"/home/\\*\" 環境変数 HOME が設定されていて、 /home/\\* というパターンに一致する場合のみ許可する allow_execute /bin/sh if exec.envp[\"CERBERUS\"]!=NULL 環境変数 CERBERUS が設定されている場合のみ許可する /etc/security/pam_env.conf を使うと(ログインシェルなどの)環境変数を定義できるので、 /lib/security/pam_env.so の処理が呼ばれたかどうか(呼ばれてからシェルが要求されたのか、 呼ばれる前にシェルが要求されたのか)の判断ができます。 現時点の実装は http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi/trunk/1.6.x/?rev=992&root=tomoyo から取得できます。 コメントやアイデアがありましたらお願いします。 某所: >(readaheadをオフにして起動→実際にアクセスされたファイルをTOMOYOで拾う→/etc/readahead/bootに書き込んでreadachead有効化) なるほど、 readahead だけ狙い撃ちという使い方ですね。 http://tomoyo.sourceforge.jp/ja/1.2/custom-rootfs.html にて TOMOYO を使った必要最小限のファイルだけを含んだ root fs の作成手順と、 http://tomoyo.sourceforge.jp/ja/1.5.x/analysis.html にて システムの振る舞いを観察する手順について書いていますが、 readahead だけなら(取りこぼしがあってもアクセスが拒否されるわけではないので)簡単ですね。