ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

/etc/passwd ファイルを一般ユーザが更新できる理由

$ ls -la /etc/passwd
-rw-r--r-- 1 root root 951 2010-07-04 23:46 /etc/passwd

パスワードファイルは root ユーザなのに、一般ユーザもパスワード変更は可能。

$ ls -la /usr/bin/passwd
-rwsr-xr-x 1 root root 28480 2007-02-27 16:53 /usr/bin/passwd

passwd コマンドの所有者のアクセス権は「r:読み取り権」「w:書き込み権」と、実行権が「x」ではなく「s:SUID(Set User ID)」になっている。
グループとその他ユーザは「x:実行権」が設定されており、実行権を持つユーザがコマンドを実行した場合は「所有者権限で実行」したものとして扱う。
つまり passwd コマンドは所有者の実行権限が「s」なので一般ユーザが実行しても root 権限で実行したこと扱いになり root ユーザが持つ /etc/passwd ファイルに書き込むことができる。


知らなんだ。。

派生して GUID

グループのアクセス権を適用する SUID (Set Group ID) は、ディレクトリに設定しておけば、そのディレクトリ以下に誰がファイルを作成しても所有グループがディレクトリの所有者になる。
共有ディレクトリとして使うときに役立つらしい。

ちなみにディレクトリに SUID と GUID の両方を設定すればどのユーザでファイルを作っても所有者に書き換えられるんじゃ?と思ったけど変わるのはグループだけでした。

さらに飛び火して /tmp

/tmp にはスティッキービットが設定されている。スティッキービットってなんだ、一発で変換できないし。

$ ls -ld /tmp
drwxrwxrwt 2 root root 4096 2010-07/04 23:48 /tmp

スティッキービットが設定されると、書き込み権限があったとしても自分以外のユーザが作成したファイルを削除できないらしい。
試してみたら、一般ユーザ同士では削除できず、root なら消せる動きでした。
へー。