Обычно в unix-подобных операционных системах права собственности на файлы и каталоги основаны на стандартных uid (user-id) и gid (group-id) пользователя, который их создал. То же самое происходит при запуске процесса: он запускается с эффективным идентификатором пользователя и идентификатором группы пользователя, который его запустил, и с соответствующими привилегиями. Это поведение можно изменить с помощью специальных разрешений.
Бит setuid
При использовании бита setuid описанное выше поведение изменяется таким образом, что при запуске исполняемого файла он запускается не с привилегиями запустившего его пользователя, а с привилегиями владельца файла. Так, например, если у исполняемого файла установлен бит setuid, а его владельцем является root, то при запуске обычным пользователем он будет запущен с привилегиями root. Должно быть понятно, почему это представляет потенциальный риск для безопасности, если не использовать его правильно.
Примером исполняемого файла с набором прав setuid является passwd, утилита, которую мы можем использовать для изменения пароля для входа в систему. Мы можем проверить это с помощью команды ls:
1 2 | ls -l /bin/passwd -rwsr-xr-x. 1 root root 27768 Feb 11 2023 /bin/passwd |
Как определить бит setuid? Как вы наверняка заметили, глядя на вывод команды выше, бит setuid представлен буквой s вместо x исполняемого бита. Символ s означает, что исполняемый бит установлен, иначе вы бы увидели заглавную букву S. Это происходит, когда биты setuid или setgid установлены, а исполняемый бит нет, показывая пользователю несоответствие: биты setuid и setgit не имеют эффекта, если исполняемый бит не установлен. Бит setuid не влияет на каталоги.
Бит setgid
В отличие от бита setuid, бит setgid действует как на файлы, так и на каталоги. В первом случае файл, для которого установлен бит setgid, при выполнении не запускается с привилегиями группы пользователя, который его запустил, а запускается с привилегиями группы, которой принадлежит файл: другими словами, идентификатор группы процесса будет совпадать с идентификатором группы файла.
При использовании в каталоге бит setgid изменяет стандартное поведение таким образом, что группа файлов, созданных внутри каталога, будет принадлежать не пользователю, который их создал, а самому родительскому каталогу. Это часто используется для облегчения совместного использования файлов (файлы могут быть изменены всеми пользователями, входящими в указанную группу). Как и setuid, бит setgid можно легко обнаружить (в данном случае на тестовом каталоге):
1 2 | ls -ld test drwxrwsr-x. 2 egdoc egdoc 4096 Nov 1 17:25 test |
На этот раз s присутствует на месте исполняемого бита в групповом секторе.
Sticky bits (Липкий бит)
sticky bit работает по-другому: хотя он не влияет на файлы, при его использовании в каталоге все файлы в этом каталоге могут быть изменены только их владельцами. Типичный случай использования этого бита - каталог /tmp. Обычно этот каталог доступен для записи всем пользователям системы, поэтому для того, чтобы один пользователь не мог удалить файлы другого, устанавливается липкий бит:
1 2 | ls -ld /tmp drwxrwxrwt. 14 root root 300 Nov 1 16:48 /tmp |
В этом случае владелец, группа и все остальные пользователи имеют полные права на каталог (чтение, запись и выполнение). Липкий бит идентифицируется буквой t, которая указывается там, где обычно указывается исполняемый бит x, в разделе "другое". Опять же, строчная буква t означает, что исполняемый бит также присутствует, в противном случае вы бы увидели заглавную букву T.
Как установить специальные биты
Как и обычные разрешения, специальные биты могут быть назначены с помощью команды chmod, используя числовой или ugo/rwx формат. В первом случае биты setuid, setgid и sticky представлены соответственно значениями 4, 2 и 1. Так, например, если мы хотим установить бит setgid для каталога, мы выполним команду:
1 | chmod 2775 test |
Этой командой мы установили бит setgid для каталога (обозначенного первым из четырех чисел) и предоставили полные привилегии его владельцу и пользователям, входящим в группу, к которой принадлежит каталог, плюс разрешение на чтение и выполнение для всех остальных пользователей (помните, что бит execute для каталога означает, что пользователь может войти в него по cd или использовать ls для просмотра его содержимого).
Другой способ установить биты специальных разрешений - использовать синтаксис ugo/rwx:
1 | chmod g+s test |
Чтобы применить бит setuid к файлу, мы должны выполнить следующие действия:
1 | chmod u+s file |
В то время как для применения sticky bit:
1 | chmod o+t test |
Использование специальных разрешений может быть очень полезным в некоторых ситуациях, но при неправильном использовании они могут привести к серьезным уязвимостям, поэтому подумайте дважды, прежде чем использовать их.