root権限で動作するプログラムやバックドアを素早く発見する
システム内で悪意を持ったユーザーがroot権限を獲得する方法の1つとして、脆弱性
のあるSUID、SGIDの与えられたプログラムに対する攻撃があります。例えばSUID、
SGIDの与えられたプログラムとしてpasswdコマンドがあります。一般ユーザーがパ
スワードを変更するためには、rootによって所有されるパスワードファイルを変更する
必要があるため、passwdコマンドをroot権限で実行させる必要があります。そのため
passwdプログラムには、ファイルの所有者の権限で動作させるためのSUIDビットが設定されています。
同様にSGIDビットが設定されている場合は、そのファイルのグループ権限で動作します。
ls -lを実行することで以下のようにSUIDビットが設定されているかどうかを確認することができます。
-r-s--x--x 1 root root 16336 Feb 13 2003 /usr/bin/passwd
所有者の実行ビット(x)の代わりに、stickyビット(s)が設定されていることに注意
してください。これはSUIDビットが設定されているファイルであることを意味していま
す。
困ったことに不完全にコーディングされたSUIDあるいはSGIDビットを持つプログ
ラムの存在は、ユーザーに対してより高い権限を得るチャンスを与えてしまいます。ま
た、すでにroot権限を入手した攻撃者がバックドアとしてSUIDビットを与えた実行
ファイルを紛れ込ませる可能性があります。これらを発見するために、システム上の
SUIDやSGIDビットを持ったファイルを調査する必要があります。これは以下のように
簡単に実行することができます。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec ls -la {} \;
ただし実際のところ、SUIDビットの脅威はシェルスクリプトである場合が多く、それ
らを利用したバックドアは何気ないファイルを装っているでしょう。またほとんどのOS
はシェルスクリプトに設定されたSUIDやSGIDビットを無視します。
もしもシステム上のSUIDやSGIDビットが設定されたスクリプトを発見するのであ
れば、以下のように-execオプションを変更し、ELF(実行型バイナリ)ファイルを除
外するためコマンドを、パイプ(|)と共に追加します。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec file {} \; | grep -v ELF
また上記の例とは逆に実行型バイナリを表示させるなら以下のようにコマンドを実行します。
# find / \( -perm -4000 -o -perm -2000 \) -type f -exec file {} \; | grep ELF
ほとんどのOSはELF形式の実行ファイルですが、そうでない場合はgrepコマンド
のELFオプションの部分を、稼動中のOSやアーキテクチャで使われているバイナリ
フォーマットに応じて書き換えます。例えば、古いバージョンのLinuxはa.out、AIXは
XCOFFを使用しています。
findコマンドでSUIDやSGIDビットが設定されたファイルを見つけたなら、続けて
fileコマンドを使用して詳細に検査するとよいでしょう。Mac OS Xのバイナリに対し
てfileコマンドを実行した結果を以下に示します。
$ file /bin/sh
/bin/sh: Mach-O executable ppc
cronコマンドを使用すれば1日に1回コマンドを実行させて、結果をファイルに出力
させることも可能です。例えば、次のcrontabのエントリはSUIDやSGIDビットが設定
されたファイルを探し、1日前のリストと比較して相違点があれば、/var/log/sidlogファ
イルに記録します。
また、以下のように実行すると、/var/log/sidlogにSUIDとSGIDファイルのリストを
出力します。
0 4 * * * find / \( -perm -4000 -o -perm -2000 \) -type f > \
/var/log/sidlog.new && diff /var/log/sidlog.new /var/log/sidlog && \
mv /var/log/sidlog.new /var/log/sidlog