Чи може процес суперпользователя змінити реальний ідентифікатор користувача та ідентифікатор групи процесу, не збігаючись з тими у файлі паролів?


11

Від APUE

Реальний ідентифікатор користувача та реальний ідентифікатор групи процесу визначають, хто ми є насправді. Ці два поля взяті з нашого запису в полі пароля при вході в систему. Зазвичай ці значення не змінюються під час сеансу входу, хоча для суперпользовательського процесу є можливість їх змінити.

Чи може процес суперпользователя змінити реальний ідентифікатор користувача та реальний ідентифікатор групи процесу, щоб співвідношення між реальним ідентифікатором користувача та реальним ідентифікатором групи не збігалося з таким у файлі паролів? Наприклад, якщо користувач Timне є членом групи oceanв файлі паролів, може процес суперкористувача змінити реальний ідентифікатор користувача і реальний ідентифікатор групи процесу , щоб бути Timі oceanвідповідно?


5
Тут є одне важливе уточнення: процес, що працює з привілеями суперпользователя, може змінювати свій власний UID та GID, а не інший.
filbranden


База даних про користувачів є суто користувачем. Ядро дбає лише про UID та GID, а не про базу даних користувачів або групи.
炸鱼 薯条 德里克

Відповіді:


15

Так, суперпользовательский процес може змінити свій реальний ідентифікатор користувача та реальний ідентифікатор групи на будь-яке значення, яке воно бажає. Значення в /etc/passwdі /etc/shadowє конфігурацією для того, які значення слід встановлювати, але не обмеження можливих значень.

Редагувати №1

Це означає, що такі програми, як loginчитатимуть значення з файлів, значить, це файли конфігурації або вхідні файли. Вони не є обмеженням того, що може зробити програма. Процес суперпользователя може передавати ядро ​​будь-яке значення, і ядро ​​не перевірятиме жодні файли.

Програма може зателефонувати

setgid (54321);
setuid (12345);

і це спрацює, навіть якщо жоден ідентифікатор не згадується в жодному файлі.


9

Файл паролів та файл групи не читаються, вони зчитуються лише під час входу в систему, щоб встановити реальний ідентифікатор користувача та реальний ідентифікатор групи.

У ядрі нічого не згадується про ці файли. Логін повинен відкрити файли, обробити їх і встановити два ідентифікатори. Можна писати інакше, щоб отримати ці посвідчення особи з іншого місця. Напр. З мережевої бази даних.

Будь-який процес з можливістю CAP_SETUID може встановлювати ці ідентифікатори, root має цю можливість.

Модель безпеки в Unix, частина реалізована в ядрі, а частина реалізована в процесі, який працює з підвищеними можливостями (наприклад, як root).


Зверніть увагу , що /etc/passwdі /etc/groupтакож читати ls, psі будь-яку іншу програму , яка повинна переводити імена користувачів / груп в / з ідентифікаторів користувачів / груп. (Вони можуть зробити це через бібліотеку, ніж знають про альтернативні способи зберігання цих даних.)


1
Вони ( /etc/passwd, /etc/groups) також читаються процесами, які хочуть відображати або обробляти імена користувачів замість внутрішніх числових ідентифікаторів, наприклад, psта ls.
Йонас Шефер

3

Крім усього іншого, мета /etc/passwdполягає в тому, щоб перевести ім’я користувача в UID користувача . Якщо вам не байдуже, що таке UID bob, цей файл вам не потрібен. Якщо ви просто хочете перейти на довільний UID / GID, використовуйте відповідні системні дзвінки:

int setuid(uid_t uid);
int setgid(gid_t gid);

Зауважте, що привілейований процес із функціямиCAP_SETUID та CAP_SETGID можливостями (який зазвичай має кореневий процес) може змінювати лише власний UID та GID, а не інший запущений процес.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.