Почему обычный пользователь не может `chown` файла?

75

Почему chownкоманда только для root? Почему пользователи без полномочий root не могут использовать chown для передачи своих файлов?

phleg
источник
не могу понять ваш вопрос Команда chown также может быть использована пользователем без
полномочий
Может быть, я ошибся. Ну, точный вопрос моего профессора был: «Почему перемещение прав от обычного пользователя не разрешено в системах UNIX?» ...
phleg
19
Я думаю , что реальный вопрос: почему не пользователи могут некорневых использовать , chownчтобы раздавать файлы , которыми они владеют. (Я видел системы, в которых, в зависимости от конфигурации файловой системы, вы можете.)
Кит Томпсон
похожие: askubuntu.com/questions/95985/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

96

Большинство систем Unix запрещают пользователям «отдавать» файлы, то есть пользователи могут работать, только chownесли у них есть права целевого пользователя и группы. Поскольку для использования chownтребуется владение файлом или наличие прав root (пользователи никогда не могут присваивать файлы других пользователей), только root может работать, chownчтобы сменить владельца файла на другого пользователя.

Причина этого ограничения заключается в том, что передача файла другому пользователю может привести к возникновению плохих вещей в необычных, но все же важных ситуациях. Например:

  • Если в системе активированы дисковые квоты, Алиса может создать файл, доступный для записи в мире, в каталоге, доступном только ей (чтобы никто другой не мог получить доступ к этому файлу, доступному для записи), а затем запустить, chownчтобы этот файл стал владельцем другого пользователя Билла. После этого файл будет считаться дисковой квотой Билла, даже если файл может использовать только Алиса.
  • Если Алиса передает файл Биллу, нет никаких признаков того, что Билл не создал этот файл. Это может быть проблемой, если файл содержит недопустимые или иным образом компрометирующие данные.
  • Некоторые программы требуют, чтобы их входной файл принадлежал конкретному пользователю для аутентификации запроса (например, файл содержит некоторые инструкции, которые программа будет выполнять от имени этого пользователя). Обычно это небезопасный дизайн, потому что даже если Билл создал файл, содержащий синтаксически правильные инструкции, он, возможно, не намеревался выполнять их именно в это время. Тем не менее, разрешение Алисе создавать файл с произвольным содержимым и принимать его в качестве входных данных от Билла может только усугубить ситуацию.
Жиль "ТАК - перестань быть злым"
источник
3
На предыдущей работе я построил программную систему, которая зависела от невозможности отдавать файлы. Он использовал владение файлом для проверки того, что запрос был отправлен конкретным пользователем. Во время установки он проверял, разрешена ли раздача файлов, и если да, то отказывался продолжать.
Кит Томпсон
2
Еще одна более важная проблема заключается в том, что пользователь может копировать /bin/bash, устанавливать его, а затем chown- кому угодно. Теперь они имеют доступ к оболочке как этот человек.
Патрик
18
@Patrick chownвсегда очищает биты setuid и setgid.
Жиль "ТАК - перестань быть злым"
1
@ Жиль, и по уважительной причине ... если вы можете скопировать двоичный файл оболочки куда-нибудь, вы сможете получить к нему доступ, установить биты setuid / gid на него и назначить ему значение root (или любой другой порядок, который дает вам 6755/0: 0 perms) / Владение) вы можете получить root на этой системе. Ох, пропустил комментарий Патрика, точно.
Hanetzer
Хорошо, но если у меня есть dir ( drwxr-xr-x ring0 ring0 .), в котором у root есть обычный file ( -rw-r--r-- root root file), почему я не могу этого сделать, chown ring0 fileтак как ему все равно разрешено делать, как ring0, cp file x ; rm file ; mv x file(и некоторые необязательные touch sometime file...)?
Кольцо Ø
15

В Linux вам нужна возможность CAP_CHOWN для chown. root предоставляется таким. Обратитесь к: http://vouters.dyndns.org/tima/Linux-OpenVMS-C-Implementing_chown.html за разъяснениями. Если вы намереваетесь предоставить возможность CAP_CHOWN, соберите свой код с помощью libcap-ng или libcap, как показано на: http://vouters.dyndns.org/tima/Linux-PAM-C-Pluggable_Authentication_Modules_programming_example.html, где вам нужно просто заменить CAP_AUDIT_WRITE с CAP_CHOWN.

user1910461
источник
1
+1, потому что вы не должны быть пользователем root. Потому что вам больше не нужно быть пользователем root.
Ctrl-Alt-Delor
1
Иногда вам даже не нужен CAP_CHOWN: unix.stackexchange.com/questions/399975/… Из моего прочтения исходного кода ядра каждой реализации файловой системы поручена проверка разрешений chown. И похоже, что с NFS разрешения проверяются на стороне сервера. И если сервер ... странный ... тогда это возможно.
Майк С
0

Вы можете запустить команду, но она не будет работать, если вы не являетесь пользователем root. Это просто: представьте себе пользователя, который может сменить программное обеспечение на пользователя root. Он может добавить бит setuid и, вуаля, парень - root! Таким образом, использование может добавить бит с помощью chmod, но нет никаких шансов сменить владельца файлов.

Дом
источник
12
Вы не можете добавить бит setuid в файл, который вам не принадлежит, и реализации, которые позволяют отдавать файлы, очищают бит setuid.
Жиль "ТАК - перестань быть злым"
Я думаю, что смысл ответа Дома таков: представьте, если бы вы могли. Тогда будут проблемы. Ваша точка зрения, что вы не можете, это правильно. Но ОП спрашивает "почему?" Очистка бита setuid - это еще одна функция безопасности, которая снова вызывает вопрос «почему?». Который я бы тогда сослался на ответ Dom: ЕСЛИ пользователь мог бы выбирать, и ЕСЛИ пользователь мог бы настроить, то эта комбинация была бы катастрофической. Я думаю, что он делает тонкое замечание, даже если ему немного не хватает.
Майк С.