再現する手順:
germar@Host:~$ cd /tmp/
germar@Host:/tmp$ touch test && chmod u+s test && ls -la test
-rwSr--r-- 1 germar germar 0 Nov 2 20:11 test
germar@Host:/tmp$ chown germar:germar test && ls -la test
-rw-r--r-- 1 germar germar 0 Nov 2 20:11 test
Debian squeezeおよびUbuntu 12.04でテスト済み
Chownのドキュメントによるとバグではありません:
$ info coreutils 'chown invocation'
The `chown' command sometimes clears the set-user-ID or set-group-ID
permission bits. This behavior depends on the policy and functionality
of the underlying `chown' system call, which may make system-dependent
file mode modifications outside the control of the `chown' command.
For example, the `chown' command might not affect those bits when
invoked by a user with appropriate privileges, or when the bits signify
some function other than executable permission (e.g., mandatory
locking). When in doubt, check the underlying system behavior.
これは仕様によるものであり、標準の動作です。 POSIX標準 の引用:
適切な特権を持つプロセスによってchownが呼び出されない限り、通常のファイルのset-user-IDビットとset-group-IDビットは、正常に完了するとクリアされます。他のファイルタイプのset-user-IDおよびset-group-IDビットはクリアされる場合があります。
(ちなみに、s
はスティッキーではなく、setuid(またはグループ列のsetgid)です。)
この動作は 基になるシステムコール の動作に従います(一部のシステムでは、setxidビットは実行可能ファイルに対してのみクリアされます)。
Setuidビットを削除する理由は、所有者を変更すると、プロセスの実効ユーザーIDになるユーザーも変更されるためです。特に、ユーザーがファイルを配布できるシステムでは、cp /bin/sh foo; chmod u+s foo; chown joe foo
は、巨大なセキュリティホールであるjoeに属するsetuid実行可能ファイルを作成します。