chownはsetuidビットを削除します:バグまたは機能?

chownはsetuidビットを削除します:バグまたは機能?

再現段階:

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 foojoeに属するsetuid実行可能ファイルが生成されます。これは大きなセキュリティホールです。

関連情報