再現段階:
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でテストされました。
答え1
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.
答え2
これは意図的に設計された動作であり、標準動作です。引用する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実行可能ファイルが生成されます。これは大きなセキュリティホールです。