Setuid (Set User ID) — это специальный атрибут прав доступа в Linux/Unix, который позволяет пользователю выполнять программу с правами владельца этой программы, а не с правами самого пользователя.
Простая аналогия:
Представьте, что в офисе есть сейф, который может открывать только начальник. Обычным сотрудникам вход запрещен. Но начальник дает секретарю особый пропуск (setuid-бит), с помощью которого секретарь может открыть сейф, хотя сам не является начальником.
Для чего нужны setuid биты?
Основные случаи использования:
Смена пароля (
/usr/bin/passwd)1 2ls -la /usr/bin/passwd -rwsr-xr-x 1 root root 68208 апр 8 10:15 /usr/bin/passwd- Обычный пользователь должен менять свой пароль
- Пароли хранятся в защищенном файле
/etc/shadow, доступном только root - Setuid позволяет
passwdвременно получить права root для записи в/etc/shadow
Команда
sudo(/usr/bin/sudo)1 2ls -la /usr/bin/sudo -rwsr-xr-x 1 root root 232416 фев 9 2024 /usr/bin/sudo- Позволяет выполнять команды от имени root
- Без setuid sudo не сможет повысить привилегии
Другие примеры:
ping— требует root для создания сетевых сокетовsu— переключение на другого пользователяmount/umount— монтирование файловых систем
Как распознать setuid биты?
Визуальное обозначение:
| |
Буква s в позиции execute (x) означает, что установлен setuid/setgid бит.
Как просмотреть все файлы с setuid:
Поиск по всей системе:
1sudo find / -type f -perm -4000 -ls 2>/dev/nullТолько в стандартных директориях:
1sudo find /usr/bin /usr/sbin /bin /sbin -type f -perm -4000 -lsС подробной информацией:
1 2 3 4 5# С владельцем и правами sudo find /usr -type f -perm -4000 -exec ls -la {} \; 2>/dev/null # Или более компактно sudo find /usr/bin -type f -perm -4000 | xargs ls -laЧисловое представление:
1stat /usr/bin/sudo | grep AccessSetuid бит = 4000 в восьмеричной системе (4 = setuid, 2 = setgid, 1 = sticky bit)
Как установить/убрать setuid бит:
Символический способ:
| |
Числовой способ:
| |
Почему это важно для безопасности?
Риски:
- Вредоносные программы могут использовать setuid для получения root-доступа
- Ошибки в setuid-программах — частая причина взломов
- Лишние setuid биты расширяют поверхность атаки
Аудит безопасности:
| |
Практический пример из моей практики:
Я где-то ошибся и сделал своего пользвоателя владельцем /usr/, слом судо и пока пытался починить выполнил find /usr -type d -exec chmod 755 {} \;, это не затронуло файлы. Но когда следом сделал:
| |
Эта команда сбросила setuid биты на всех файлах, включая sudo, passwd и другие. Поэтому sudo опять перестал работать.
Правильно было бы:
| |