euid, ruid, suid
User Identification Variables
ruid
: реальний ідентифікатор користувача, що позначає користувача, який ініціював процес.euid
: Відомий як ефективний ідентифікатор користувача, він представляє ідентичність користувача, яку система використовує для визначення привілеїв процесу. Зазвичайeuid
відображаєruid
, за винятком випадків, таких як виконання бінарного файлу з SetUID, колиeuid
приймає ідентичність власника файлу, надаючи таким чином певні операційні дозволи.suid
: Цей збережений ідентифікатор користувача є важливим, коли процес з високими привілеями (зазвичай працює як root) тимчасово повинен відмовитися від своїх привілеїв для виконання певних завдань, а потім знову відновити свій початковий підвищений статус.
Important Note
Процес, що не працює під root, може змінювати свій euid
лише для того, щоб відповідати поточному ruid
, euid
або suid
.
Understanding set*uid Functions
setuid
: На відміну від початкових припущень,setuid
в основному змінюєeuid
, а неruid
. Конкретно, для привілейованих процесів він вирівнюєruid
,euid
іsuid
з вказаним користувачем, часто root, ефективно закріплюючи ці ідентифікатори через переважаючийsuid
. Детальну інформацію можна знайти на сторінці man setuid.setreuid
таsetresuid
: Ці функції дозволяють для тонкого налаштуванняruid
,euid
іsuid
. Однак їх можливості залежать від рівня привілеїв процесу. Для процесів, що не є root, зміни обмежуються поточними значеннямиruid
,euid
іsuid
. Натомість, процеси root або ті, що мають можливістьCAP_SETUID
, можуть призначати довільні значення цим ідентифікаторам. Більше інформації можна отримати з сторінки man setresuid та сторінки man setreuid.
Ці функціональні можливості не призначені як механізм безпеки, а для полегшення запланованого операційного потоку, наприклад, коли програма приймає ідентичність іншого користувача, змінюючи свій ефективний ідентифікатор користувача.
Варто зазначити, що хоча setuid
може бути звичайним способом підвищення привілеїв до root (оскільки він вирівнює всі ідентифікатори до root), важливо розрізняти ці функції для розуміння та маніпулювання поведінкою ідентифікаторів користувачів у різних сценаріях.
Program Execution Mechanisms in Linux
execve
System Call
execve
System CallFunctionality:
execve
ініціює програму, визначену першим аргументом. Вона приймає два масиви аргументів,argv
для аргументів іenvp
для середовища.Behavior: Вона зберігає простір пам'яті виклику, але оновлює стек, купу та сегменти даних. Код програми замінюється новою програмою.
User ID Preservation:
ruid
,euid
та додаткові групові ідентифікатори залишаються незмінними.euid
може мати нюанси змін, якщо нова програма має встановлений біт SetUID.suid
оновлюється зeuid
після виконання.Documentation: Детальну інформацію можна знайти на сторінці man execve.
system
Function
system
FunctionFunctionality: На відміну від
execve
,system
створює дочірній процес за допомогоюfork
і виконує команду в цьому дочірньому процесі за допомогоюexecl
.Command Execution: Виконує команду через
sh
зexecl("/bin/sh", "sh", "-c", command, (char *) NULL);
.Behavior: Оскільки
execl
є формоюexecve
, вона працює подібно, але в контексті нового дочірнього процесу.Documentation: Додаткову інформацію можна отримати з сторінки man system.
Behavior of bash
and sh
with SUID
bash
and sh
with SUIDbash
:Має опцію
-p
, що впливає на те, як обробляютьсяeuid
іruid
.Без
-p
bash
встановлюєeuid
наruid
, якщо вони спочатку відрізняються.З
-p
початковийeuid
зберігається.Більше деталей можна знайти на сторінці man bash.
sh
:Не має механізму, подібного до
-p
вbash
.Поведінка щодо ідентифікаторів користувачів не згадується явно, за винятком опції
-i
, що підкреслює збереження рівностіeuid
іruid
.Додаткову інформацію можна знайти на сторінці man sh.
Ці механізми, які відрізняються за своєю роботою, пропонують різноманітні варіанти для виконання та переходу між програмами, з конкретними нюансами в тому, як управляються та зберігаються ідентифікатори користувачів.
Testing User ID Behaviors in Executions
Examples taken from https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, check it for further information
Case 1: Using setuid
with system
setuid
with system
Objective: Розуміння впливу setuid
у поєднанні з system
та bash
як sh
.
C Code:
Компиляція та дозволи:
Аналіз:
ruid
таeuid
спочатку дорівнюють 99 (nobody) та 1000 (frank) відповідно.setuid
вирівнює обидва до 1000.system
виконує/bin/bash -c id
через symlink від sh до bash.bash
, без-p
, коригуєeuid
, щоб відповідатиruid
, в результаті чого обидва стають 99 (nobody).
Випадок 2: Використання setreuid з system
C Code:
Компиляція та дозволи:
Виконання та Результат:
Аналіз:
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