Add new post about setuid bits
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
---
|
||||
title: "Что такое setuid биты?"
|
||||
date: 2026-02-15T21:32:16+03:00
|
||||
draft: false
|
||||
tags: ["linux"]
|
||||
categories: ["linux"]
|
||||
---
|
||||
|
||||
|
||||
**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
|
||||
```
|
||||
Reference in New Issue
Block a user