web-dev-qa-db-ja.com

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でテスト済み

14
Germar

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.
17
jlliagre

これは仕様によるものであり、標準の動作です。 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実行可能ファイルを作成します。