euid, ruid, suid
Змінні ідентифікації користувача
ruid
: Реальний ідентифікатор користувача вказує на користувача, який ініціював процес.euid
: Відомий як ефективний ідентифікатор користувача, він представляє ідентичність користувача, яку використовує система для визначення привілеїв процесу. Загалом,euid
відображаєruid
, за винятком випадків, коли виконується бінарний файл SetUID, деeuid
припускає ідентичність власника файлу, надаючи певні операційні дозволи.suid
: Цей збережений ідентифікатор користувача є ключовим, коли високопривілейований процес (зазвичай запущений як root) повинен тимчасово відмовитися від своїх привілеїв для виконання певних завдань, лише щоб пізніше повернутися до свого початкового підвищеного статусу.
Важлива примітка
Процес, який не працює під root, може змінювати свій euid
, щоб відповідати поточному ruid
, euid
або suid
.
Розуміння функцій set*uid
setuid
: На відміну від початкових припущень,setuid
в основному змінюєeuid
, а неruid
. Зокрема, для привілейованих процесів він вирівнюєruid
,euid
таsuid
з вказаним користувачем, часто root, ефективно закріплюючи ці ідентифікатори через перевизначенняsuid
. Детальні відомості можна знайти на сторінці setuid man.setreuid
таsetresuid
: Ці функції дозволяють докладне налаштуванняruid
,euid
таsuid
. Однак їх можливості залежать від рівня привілеїв процесу. Для процесів, які не є root, модифікації обмежені поточними значеннямиruid
,euid
таsuid
. На відміну від цього, root-процеси або ті, які мають можливістьCAP_SETUID
, можуть призначати довільні значення цим ідентифікаторам. Додаткову інформацію можна отримати на сторінці setresuid man та на сторінці setreuid man.
Ці функціональності призначені не як засіб безпеки, а для полегшення задуманого операційного процесу, наприклад, коли програма приймає ідентичність іншого користувача, змінюючи свій ефективний ідентифікатор користувача.
Зокрема, хоча setuid
може бути загальним вибором для підвищення привілеїв до root (оскільки він вирівнює всі ідентифікатори до root), важливо розрізняти ці функції для розуміння та маніпулювання поведінкою ідентифікаторів користувача в різних сценаріях.
Механізми виконання програм в Linux
Системний виклик execve
execve
Функціональність:
execve
запускає програму, визначену першим аргументом. Він приймає два масиви аргументів,argv
для аргументів таenvp
для середовища.Поведінка: Він зберігає простір пам'яті викликаючого, але оновлює стек, купу та сегменти даних. Код програми замінюється новою програмою.
Збереження ідентифікатора користувача:
ruid
,euid
та додаткові ідентифікатори груп залишаються незмінними.euid
може мати нюансові зміни, якщо у новій програмі встановлено біт SetUID.suid
оновлюється зeuid
після виконання.Документація: Докладну інформацію можна знайти на сторінці
execve
man.
Функція system
system
Функціональність: На відміну від
execve
,system
створює дочірній процес за допомогоюfork
та виконує команду в цьому дочірньому процесі за допомогоюexecl
.Виконання команди: Виконує команду через
sh
за допомогоюexecl("/bin/sh", "sh", "-c", command, (char *) NULL);
.Поведінка: Оскільки
execl
є формоюexecve
, він працює аналогічно, але в контексті нового дочірнього процесу.Документація: Додаткові відомості можна отримати на сторінці
system
man.
Поведінка bash
та sh
з SUID
bash
та sh
з SUIDbash
:Має опцію
-p
, яка впливає на те, якeuid
таruid
обробляються вbash
.Без
-p
bash
встановлюєeuid
наruid
, якщо вони спочатку відрізняються.З
-p
початковийeuid
зберігається.Докладнішу інформацію можна знайти на сторінці
bash
man.sh
:Не має механізму, подібного до
-p
вbash
.Поведінка щодо ідентифікаторів користувача не згадується явно, за винятком опції
-i
, яка підкреслює збереження рівностіeuid
таruid
.Додаткову інформацію можна знайти на сторінці
sh
man.
Ці механізми, відмінні у своїй роботі, пропонують широкий спектр варіантів для виконання та переходу між програмами, з конкретними нюансами у керуванні та збереженні ідентифікаторів користувача.
Тестування поведінки ідентифікаторів користувача під час виконання
Приклади взяті з https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, перевірте їх для отримання додаткової інформації
Сценарій 1: Використання setuid
з system
setuid
з system
Мета: Розуміння ефекту setuid
в поєднанні з system
та bash
як sh
.
Код на C:
Компіляція та дозволи:
Аналіз:
ruid
таeuid
спочатку рівні 99 (nobody) та 1000 (frank) відповідно.setuid
вирівнює обидва на 1000.system
виконує/bin/bash -c id
через символічне посилання з sh на bash.bash
, без-p
, налаштовуєeuid
для відповідностіruid
, що призводить до того, що обидва стають 99 (nobody).
Випадок 2: Використання setreuid з system
C Код:
Компіляція та дозволи:
Виконання та Результат:
Аналіз:
setreuid
встановлює як ruid, так і euid на 1000.system
викликає bash, який зберігає ідентифікатори користувачів через їх рівність, ефективно працюючи як frank.
Сценарій 3: Використання setuid з execve
Мета: Дослідження взаємодії між setuid та execve.
Виконання та Результат:
Аналіз:
ruid
залишається 99, але euid встановлено на 1000, відповідно до ефекту setuid.
Приклад коду на мові C 2 (Виклик Bash):
Виконання та Результат:
Аналіз:
Хоча
euid
встановлено на 1000 за допомогоюsetuid
,bash
скидає euid наruid
(99) через відсутність-p
.
Приклад коду на мові C 3 (Використання bash -p):
Виконання та Результат:
Посилання
Last updated