Gentoo Logo

1.  誰でも読めるということ

一般ユーザに、設定ファイルやパスワードへのアクセス権を持たせるべきではありません。 アタッカーが、データベースやWebサイトからパスワードを盗み出し、 それを使ってデータを改変したり、ひどい場合には、データを削除することがあります。 そのため、ファイルパーミッションを適切に設定することが重要になります。 rootだけが使用するファイルであれば、パーミッションを0600に設定し、 chownを用いて適切なユーザにファイルを割り当てて下さい。

1.  誰でも/どのグループでも書き込めるということ

コード表示 1.1: 誰でも書き込めるファイルとディレクトリを検出する

# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; 2>/dev/null >writable.txt
# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \; 2>/dev/null >>writable.txt

これにより、所有者グループもしくは他のユーザにも書き込み権限が割り当てられている全ファイルのパーミッションに関して、 膨大なリストが作成されるはずです。パーミッションをチェックし、 どのユーザでも書き込めるファイルに対し/bin/chmod o-wを実行し、 他のユーザから書き込み権限を削除して下さい。

1.  SUID/SGIDファイル

SUIDもしくはSGIDビットがセットされたファイルは、 所有するユーザもしくはグループ権限で実行されるのであり、 ファイルを実行したユーザの権限で実行されるわけではありません。 通常、これらのビットは、システム管理時にrootとして実行されるべきファイルで用いられます。 これらのファイルにより、ローカル環境でroot権限が乗っ取られることにもなりかねません(もし、 セキュリティホールが存在すれば)。 これらは危険であり、SUIDもしくはSGIDビットがセットされたファイルは、 必ず回避されるぺきです。これらのファイルを使用しないのであれば、 chmod 0を実行するか、 もしくは関連するパッケージをunmergeすべきです(equeryを使用して、 属するパッケージをチェックして下さい。まだインストールしていなければ、 単にemerge gentoolkitとタイプするだけです)。別の方法としては、 chmod -sを実行して、SUIDビットを単に削除して下さい。

コード表示 1.1: setuidファイルを検出する

# find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \; 2>/dev/null >suidfiles.txt

これにより、全てのSUID/SGIDファイルに関してリスト化されたファイルが作成されます。

コード表示 1.1: setuidバイナリのリスト

/bin/su
/bin/ping
/bin/mount
/bin/umount
/var/qmail/bin/qmail-queue
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/crontab
/usr/bin/chage
/usr/bin/expiry
/usr/bin/sperl5.6.1
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/procmail
/usr/bin/suidperl
/usr/lib/misc/pt_chown
/usr/sbin/unix_chkpwd
/usr/sbin/traceroute
/usr/sbin/pwdb_chkpwd

デフォルトでは、Gentoo Linuxは、それほど多くのSUIDファイルを含みません (これは、何をインストールしたかにもよりますが)。しかし、 上記のようなリストを実行結果から取得するかもしれません。 多くのコマンドは一般ユーザから使用されるべきではなく、rootからのみ使用されるべきです。 pingmountumountchfnchshnewgrpsuidperlpt_chown、そしてtracerouteに対し、chmod -sを実行し、 SUIDビットを削除して下さい。なお、suqmail-queue、 もしくはunix_chkpwdに対しては、該当ビットを削除しないで下さい。 これらのファイルに対し、setuidを削除するとsuできなくなり、 メールを受信できなくなります。該当ビットを削除することで(そうしても、問題無い場合)、 一般ユーザ(もしくは、アタッカー)が、 これらのファイルを通してrootアクセス権を取得できる可能性を排除します。

筆者のシステムにおけるSUIDファイルは、supasswdgpasswdqmail-queueunix_chkpwd、 そしてpwdb_chkpwdのみです。但し、Xを動かしているなら、 より多くのSUIDファイルが必要となるかもしれません。なぜなら、 Xでは、SUIDで昇格するアクセス権が必要になるからです。

1.  SUID/SGIDバイナリとハードリンク

ファイルは、指し示すリンクが全く無い場合のみ、 削除されたと考えられます。これは、 奇妙な考え方だと思われるかもしれませんが、以下のようなファイル名を考えて下さい。 /usr/bin/perlが、実際にはデータが格納されるinodeに対するリンクです。 いくつものリンクが、そのファイルを指し示しているかもしれず、それら全てが消えるまで、 そのファイルは存在することになります。

ユーザが、nosuidnoexecでマウントされていないパーティションに、 アクセスできるのであれば(例えば、/tmp/home、 もしくは/var/tmpが、分割されたパーティションでなければ)、 SUIDもしくはSGIDバイナリに対して、 ユーザがハードリンクを作成しないよう注意すべきです。そうしなければ、 Portageアップデート後、ユーザが古いバージョンにまだアクセスできてしまうでしょう。

警告: Portageから残っているハードリンクに関して警告を受け取り、 SUID/SGIDファイルの実行を許可されたパーティションに、ユーザが書き込める場合は、 このセクションを注意深く読んで下さい。 プログラムのバージョンを古いままにさせることで、ユーザの内1人が、 アップデートを巧みに逃れようとしているかもしれません。 ユーザが自身のSUIDファイルを作成できなかったり、 ダイナミックローダを使用し(noexecでマウントされているパーティション)プログラムを実行できるのみであれば、 心配しなくても大丈夫です。

注意: ファイルに対しリンクを作成する場合、ユーザにはファイルの読み取り権限は必要ありません。 必要なのは、そのファイルを含むディレクトリへの読み取り権限だけです。

ファイルが、どれくらいリンクを持っているのか確認するには、statコマンドを使用できます。

コード表示 1.1: Statコマンド

$ stat /bin/su    
  File: `/bin/su'
  Size: 29350           Blocks: 64         IO Block: 131072 regular file
Device: 900h/2304d      Inode: 2057419     Links: 1
Access: (4711/-rws--x--x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2005-02-07 01:59:35.000000000 +0000
Modify: 2004-11-04 01:46:17.000000000 +0000
Change: 2004-11-04 01:46:17.000000000 +0000

複数のリンクからなるSUID/SGIDファイルを検出するには、findを使用できます。

コード表示 1.1: 複数のリンクからなるSUID/SGIDバイナリファイルを検出する

$ find / -type f \( -perm -004000 -o -perm -002000 \) -links +1 -ls

ページの更新日 2006年 9月 16日

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.