Files
dedinit.ru/content/posts/20260215 setuid bits/index.md
T

140 lines
5.7 KiB
Markdown

---
title: "Что такое setuid биты?"
date: 2026-02-15T21:32:16+03:00
draft: false
tags: ["linux"]
categories: ["linux"]
cover:
image: "hero.svg"
---
**Setuid** (Set User ID) — это специальный атрибут прав доступа в Linux/Unix, который позволяет пользователю выполнять программу **с правами владельца этой программы**, а не с правами самого пользователя.
### **Простая аналогия:**
Представьте, что в офисе есть сейф, который может открывать только начальник. Обычным сотрудникам вход запрещен. Но начальник дает секретарю особый пропуск (setuid-бит), с помощью которого секретарь может открыть сейф, хотя сам не является начальником.
## **Для чего нужны setuid биты?**
### **Основные случаи использования:**
1. **Смена пароля (`/usr/bin/passwd`)**
```bash
ls -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`
2. **Команда `sudo` (`/usr/bin/sudo`)**
```bash
ls -la /usr/bin/sudo
-rwsr-xr-x 1 root root 232416 фев 9 2024 /usr/bin/sudo
```
- Позволяет выполнять команды от имени root
- Без setuid sudo не сможет повысить привилегии
3. **Другие примеры:**
- `ping` — требует root для создания сетевых сокетов
- `su` — переключение на другого пользователя
- `mount/umount` — монтирование файловых систем
## **Как распознать setuid биты?**
### **Визуальное обозначение:**
```bash
# Обычный файл
-rwxr-xr-x # нет setuid
# Файл с setuid (s вместо x в позиции владельца)
-rwsr-xr-x # есть setuid
# Файл с setgid (s вместо x в позиции группы)
-rwxr-sr-x # есть setgid
```
Буква **`s`** в позиции execute (x) означает, что установлен setuid/setgid бит.
### **Как просмотреть все файлы с setuid:**
1. **Поиск по всей системе:**
```bash
sudo find / -type f -perm -4000 -ls 2>/dev/null
```
2. **Только в стандартных директориях:**
```bash
sudo find /usr/bin /usr/sbin /bin /sbin -type f -perm -4000 -ls
```
3. **С подробной информацией:**
```bash
# С владельцем и правами
sudo find /usr -type f -perm -4000 -exec ls -la {} \; 2>/dev/null
# Или более компактно
sudo find /usr/bin -type f -perm -4000 | xargs ls -la
```
4. **Числовое представление:**
```bash
stat /usr/bin/sudo | grep Access
```
Setuid бит = **4000** в восьмеричной системе (4 = setuid, 2 = setgid, 1 = sticky bit)
## **Как установить/убрать setuid бит:**
### **Символический способ:**
```bash
# Установить setuid
sudo chmod u+s /path/to/file
# Убрать setuid
sudo chmod u-s /path/to/file
```
### **Числовой способ:**
```bash
# Установить (4755 = setuid + 755 права)
sudo chmod 4755 /path/to/file
# Убрать (755 = обычные права)
sudo chmod 755 /path/to/file
```
## **Почему это важно для безопасности?**
### **Риски:**
1. **Вредоносные программы** могут использовать setuid для получения root-доступа
2. **Ошибки в setuid-программах** — частая причина взломов
3. **Лишние setuid биты** расширяют поверхность атаки
### **Аудит безопасности:**
```bash
# Найти все setuid файлы для проверки
sudo find / -type f -perm -4000 -ls 2>/dev/null | sort
# Сравнить с "чистой" системой
# Неожиданные setuid файлы должны настораживать
```
## **Практический пример из моей практики:**
Я где-то ошибся и сделал своего пользвоателя владельцем /usr/, слом судо и пока пытался починить выполнил `find /usr -type d -exec chmod 755 {} \;`, это не затронуло файлы. Но когда следом сделал:
```bash
sudo find /usr -type f -exec chmod 644 {} \;
```
Эта команда **сбросила setuid биты** на всех файлах, включая `sudo`, `passwd` и другие. Поэтому `sudo` опять перестал работать.
**Правильно было бы:**
```bash
# Сначала сохранить список setuid файлов
sudo find /usr -type f -perm -4000 > /tmp/setuid_backup.txt
# Потом менять права
sudo find /usr -type f -exec chmod 644 {} \;
# И восстановить setuid биты из сохраненного списка
while read file; do
sudo chmod 4755 "$file"
done < /tmp/setuid_backup.txt
```