重现步骤:
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 可执行文件,这是一个巨大的安全漏洞。