Короткий ответ
SUID заставляет исполняемый файл запускаться с правами владельца файла (а не запускающего пользователя), SGID — с правами группы файла (а для каталога — что новые файлы внутри наследуют группу каталога), sticky bit на каталоге разрешает удалять файлы внутри только их владельцу, даже если каталог доступен на запись всем (классический пример — /tmp).
Как это работает подробнее
Ядро проверяет эти биты при exec() и chmod: при установленном SUID на бинарнике эффективный UID процесса при запуске становится равным UID владельца файла независимо от того, кто его запустил — это позволяет, например, обычному пользователю выполнить passwd, которому нужны права root для изменения /etc/shadow, не давая пользователю root-доступ напрямую.
Пример кода
commands.sh
find / -xdev -perm -4000 -type f 2>/dev/null
chmod u+s /usr/local/bin/custom-tool # пример установки SUIDЧто использовать на практике
- Практика. SUID-бинарники — частая цель для эскалации привилегий: если такой файл имеет уязвимость или неправильно обрабатывает окружение/аргументы, его можно использовать для получения root; поэтому список SUID-файлов в системе стоит периодически аудировать и минимизировать (find / -perm -4000), оставляя только действительно необходимые.
Подводные камни
- Риск. Частая ошибка — установить SUID на собственный скрипт или бинарник «для удобства», не оценив, что любая уязвимость (например, command injection через переменные окружения) в таком файле сразу даёт атакующему привилегии владельца файла, часто root.