chown удаляет бит setuid: ошибка или функция?

14

Действия по воспроизведению:

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

Germar
источник
Делает это на Fedora 17 тоже.
BenjiWiebe

Ответы:

17

Не ошибка в соответствии с документацией 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.
jlliagre
источник
Спасибо jlliagre. Я не знал info coreutilsраньше. Я только прочитал man-страницу и искал в Интернете.
Джермар
12

Это по замыслу, и это стандартное поведение. Цитируя стандарт POSIX :

Если процесс chown не вызывается процессом с соответствующими привилегиями, биты set-user-ID и set-group-ID обычного файла должны удаляться после успешного завершения; биты set-user-ID и set-group-ID других типов файлов могут быть очищены.

( sэто setuid (или setgid в столбце группы), кстати, не липкий.)

Это поведение соответствует поведению основного системного вызова (за исключением того, что в некоторых системах биты setxid очищаются только для исполняемых файлов).

Причина удаления бита setuid заключается в том, что смена владельца также меняет того, каким пользователем будет эффективный идентификатор пользователя процесса. В частности, в системах, где пользователь может выдать файл, cp /bin/sh foo; chmod u+s foo; chown joe fooбудет создан исполняемый файл setuid, принадлежащий joe, гигантская дыра в безопасности.

Жиль "ТАК - перестань быть злым"
источник
Голосование за придирку! SUID / SGID - это не «липкий» бит!
Джим Деннис
Отличное замечание о последствиях безопасности для SUID / SGID. Меня беспокоило поведение, пока я не прочитал это предложение. Я бы добавил, однако, что я никогда не видел, чтобы chown не очищал биты, даже при запуске от имени root. Мне любопытно, что означают "соответствующие привилегии".
Огромный супермен
1
@vastlysuperiorman На классической платформе Unix «соответствующие привилегии» означают ID пользователя 0. Но POSIX позволяет системам определять свои собственные политики безопасности. Например, для многих операций в Linux «соответствующие привилегии» реализованы как возможность (которую только root получает по умолчанию). В этом конкретном случае подавляет биты setxid для chown независимо от привилегий, как большинство, если не все варианты Unix. Но слой POSIX в Windows может работать по-другому.
Жиль "ТАК - перестань быть злым"