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

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

Я читал manстраницу chown. Я не понимаю, почему S_ISUIDи S_ISGIDрежим должен быть очищен, когда функция возвращается успешно.

решение1

Я думаю, вы ссылаетесь на эту страницу руководства:

Когда владелец или группа исполняемого файла изменяются непривилегированным пользователем, биты режима S_ISUID и S_ISGID очищаются.

Так почему же они сейчас очищены? Видите ли, они очищаются только в случаеисполняемыйfile. Потому что когда один из битов (SUID/SGID) установлен, непривилегированный пользователь может выполнить файл как новый владелец файла. Это было бы огромной брешью в безопасности.

решение2

Я думаю, вы неправильно поняли man 2 chown:тыне нужно очищать S_ISUIDи S_ISGID, они будут автоматически очищены, когда вы используете эту функцию как непривилегированный пользователь. Если ваша программа работает как rootповедение (в Linux) зависит от версии ядра.

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

Из страницы руководства:

  When  the  owner  or  group  of  an  executable file are changed by an
  unprivileged user the S_ISUID  and  S_ISGID  mode  bits  are  cleared.
  POSIX  does not specify whether this also should happen when root does
  the chown(); the Linux behavior depends on  the  kernel  version.   In
  case  of  a non-group-executable file (i.e., one for which the S_IXGRP
  bit is not set) the S_ISGID bit indicates mandatory  locking,  and  is
  not cleared by a chown().

Связанный контент