Czy proces administratora może zmienić rzeczywisty identyfikator użytkownika i identyfikator grupy procesu, nie pasując do tych w pliku haseł?

11

Z APUE

Rzeczywisty identyfikator użytkownika i rzeczywisty identyfikator grupy procesu określają, kim naprawdę jesteśmy. Te dwa pola są pobierane z naszego wpisu w pliku haseł, gdy się logujemy. Zwykle wartości te nie zmieniają się podczas sesji logowania, chociaż istnieją sposoby na ich zmianę przez administratora.

Czy proces administratora może zmienić rzeczywisty identyfikator użytkownika i rzeczywisty identyfikator grupy procesu, tak aby relacja między rzeczywistym identyfikatorem użytkownika a rzeczywistym identyfikatorem grupy nie zgadzała się z tymi w pliku haseł? Na przykład, jeśli użytkownik Timnie jest członkiem grupy oceanna pliku haseł, można proces superuser zmienić rzeczywisty identyfikator użytkownika oraz identyfikator grupy rzeczywistego procesu bycia Timi oceanodpowiednio?

Tim
źródło
5
Tutaj ważne wyjaśnienie: proces działający z uprawnieniami administratora ma możliwość zmiany własnego identyfikatora UID i identyfikatora GID, a nie innego procesu.
filbranden
Baza danych informacji o użytkownikach jest wyłącznie obszarem użytkownika. Jądro dba tylko o UID i GID, a nie o bazę danych użytkowników lub grup.
炸鱼 薯条 德里克

Odpowiedzi:

15

Tak, proces superużytkownika może zmienić swój rzeczywisty identyfikator użytkownika i rzeczywisty identyfikator grupy na dowolną żądaną wartość. Wartości w /etc/passwdi /etc/shadowsą konfiguracji jakie wartości powinny być ustawione, ale nie ograniczenie możliwych wartości.

Edytuj nr 1

Oznacza to, że programy takie jak loginodczytują wartości z plików, więc pliki są plikami konfiguracyjnymi lub wejściowymi. Nie są ograniczeniami tego, co program może zrobić. Proces administratora może przekazać dowolną wartość do jądra, a jądro nie sprawdzi żadnych plików.

Program może zadzwonić

setgid (54321);
setuid (12345);

i to zadziałałoby, nawet jeśli żaden z identyfikatorów nie jest wymieniony w żadnym pliku.

RalfFriedl
źródło
9

Plik haseł i plik grupy nie są odczytywane, są one odczytywane tylko przez proces logowania, aby ustawić prawdziwy identyfikator użytkownika i prawdziwy identyfikator grupy.

Jądro nie wspomina o tych plikach. Login musi otworzyć pliki, przetworzyć je i ustawić dwa identyfikatory. Można je zapisać inaczej, aby uzyskać te identyfikatory skądinąd. Np. Z sieciowej bazy danych.

Każdy proces z funkcją CAP_SETUID może ustawić te identyfikatory, root ma tę możliwość.

Model bezpieczeństwa w Uniksie jest częściowo zaimplementowany w jądrze, a część zaimplementowany w procesie działającym z podwyższonymi możliwościami (np. Jako root).


Należy pamiętać, że /etc/passwdi /etc/groupsą czytane przez ls, psi każdy inny program, który musi tłumaczyć nazwy użytkownika / grupy do / z identyfikatorów użytkownika / grupy. (Mogą to zrobić za pośrednictwem biblioteki, niż wie o alternatywnych metodach przechowywania tych szczegółów).

ctrl-alt-delor
źródło
1
Oni ( /etc/passwd, /etc/groups) są odczytywane przez procesy, które chcą pokazać lub nazwy użytkowników proces zamiast wewnętrznych identyfikatorów numerycznych, np psi ls.
Jonas Schäfer,
3

Między innymi celem /etc/passwdjest przetłumaczenie nazwy użytkownika na identyfikator użytkownika . Jeśli nie obchodzi Cię identyfikator UID boba, nie potrzebujesz tego pliku. Jeśli chcesz zmienić na dowolny identyfikator UID / GID, użyj odpowiednich wywołań systemowych:

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

Zauważ, że uprzywilejowany proces z funkcjamiCAP_SETUID i (który zwykle ma proces root) może zmieniać tylko swój własny identyfikator UID i GID, a nie inny uruchomiony proces.CAP_SETGID

las
źródło