setreuid(2) System Calls Manual setreuid(2) NAZWA setreuid, seteuid - ustawia rzeczywisty i/lub efektywny identyfikator uzytkownika lub grupy BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int setreuid(uid_t ruid, uid_t euid); int setregid(gid_t rgid, gid_t egid); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): setreuid(), setregid(): _XOPEN_SOURCE >= 500 || /* Od glibc 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE OPIS setreuid() ustawia rzeczywisty i efektywny identyfikator uzytkownika procesu wywolujacego. Podanie wartosci -1 dla rzeczywistego lub efektywnego ID uzytkownika wymusza na systemie pozostawienie tego ID niezmienionym. Nieuprzywilejowane procesy moga jedynie ustawic efektywny identyfikator uzytkownika na identyfikatory uzytkownika: rzeczywisty, efektywny lub zachowany set-user-ID. Nieuprzywilejowani uzytkownicy moga ustawic ustawic jedynie rzeczywisty identyfikator uzytkownika na identyfikatory uzytkownika: rzeczywisty lub efektywny. Jesli rzeczywisty ID uzytkownika jest ustawiony (tj. ruid nie jest rowny -1) lub efektywny ID uzytkownika jest ustawiany na wartosc rozna od poprzedniego rzeczywistego ID uzytkownika, to zachowanemu set-user-ID zostanie nadana wartosc nowego efektywnego ID uzytkownika. Zupelnie analogicznie setregid() ustawia rzeczywisty i efektywny identyfikator grupy biezacego procesu, a wszystko powyzej nadal obowiazuje po zmianie slowa ,,uzytkownik" na ,,grupa". WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane errno, wskazujac blad. Uwaga: sa przypadki, gdy setreuid() moze zawiesc nawet wowczas, gdy wywolujacy ma UID 0. Pominiecie sprawdzenia zwrotu niepowodzenia z setreuid() jest powaznym zagrozeniem bezpieczenstwa. BLEDY EAGAIN Wywolanie mogloby zmienic rzeczywisty UID wywolujacego (tzn. ruid nie pasowalby do rzeczywistego UID wywolujacego), lecz wystapilo tu tymczasowe niepowodzenie w przydzieleniu niezbednych struktur danych jadra. EAGAIN ruid nie pasuje do rzeczywistego UID wywolujacego, a to wywolanie spowodowaloby przekroczenie limitu zasobow RLIMIT_NPROC wywolujacego przez liczbe procesow nalezacych do rzeczywistego ID uzytkownika ruid. Od Linuksa 3.1 blad ten juz sie nie pojawia (lecz solidne aplikacje powinny dokonywac jego sprawdzenia); zob. opis EAGAIN w execve(2). EINVAL Jeden lub wiecej docelowych identyfikatorow uzytkownika lub grupy jest nieprawidlowych w tej przestrzeni uzytkownika. EPERM Proces wywolujacy nie jest uprzywilejowany (w Linuksie: nie ma wymaganego przywileju (ang. capability) w swojej przestrzeni nazw uzytkownika: CAP_SETUID w przypadku setreuid() albo CAP_SETGID w przypadku setregid()), a zazadano zmian innych niz (i) zamiana efektywnego ID uzytkownika (grupy) z rzeczywistym lub (ii) ustawienie jednej z tych wartosci na podstawie drugiej, lub (iii) ustawienie efektywnego ID uzytkownika (grupy) na podstawie wartosci zachowanego set-user-ID (zapisanego set-group-ID). WERSJE POSIX.1 nie okresla wszystkich zmian identyfikatorow uzytkownika, ktore Linux dopuszcza w przypadku procesow nieuprzywilejowanych. Dla setreuid(), efektywny ID uzytkownika moze zostac ustawiony na identyczny jak rzeczywisty ID uzytkownika lub zapisany set-user-ID i nie jest okreslone, czy proces nieuprzywilejowany moze ustawic rzeczywisty ID uzytkownika na rzeczywisty ID uzytkownika, efektywny ID uzytkownika lub zapisany set-user-ID. Dla setregid(), rzeczywisty ID grupy moze zostac zmieniony na wartosc rzeczywistego ID grupy lub zapisanego set-group-ID. Dokladne detale tego, jakie zmiany identyfikatorow sa mozliwe, roznia sie miedzy implementacjami. POSIX.1 nie okresla wplywu, jaki maja te wywolania na zapisany set-user-ID i zapisany set-group-ID. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, 4.3BSD (pojawilo sie pierwotnie w 4.2BSD). Ustawianie efektywnego ID uzytkownika (grupy) na podstawie zachowanego set-user-ID (zapisanego set-group-ID) jest mozliwe poczynajac od Linuksa 1.1.37 (1.1.38). Oryginalne, linuksowe wywolania setreuid() i setregid() obslugiwaly tylko 16-bitowe identyfikatory uzytkownika i grupy. Nastepnie w Linuksie 2.4 dodano setreuid32() i setregid32(), obslugujace 32-bitowe identyfikatory. Funkcje opakowujace setreuid() i setregid() biblioteki glibc obsluguja te warianty wywolan w roznych wersjach jadra w sposob przezroczysty dla uzytkownika. Roznice biblioteki C/jadra Na poziomie jadra, identyfikatory uzytkownika i grupy sa atrybutami przynaleznymi watkowi. Jednak POSIX wymaga, aby wszystkie watki procesu dzielily te same poswiadczenia. Implementacja watkowania NPTL obsluguje wymagania POSIX za pomoca funkcji opakowujacych dla roznych wywolan systemowych zmieniajacych UID-y i GID-y procesow. Te funkcje opakowujace (w tym te dla setreuid() i setregid()) wykorzystuja technike oparta na sygnalach aby zapewnic, ze gdy jeden watek zmieni swe poswiadczenia, wszystkie inne watki procesu rowniez to uczynia. Wiecej szczegolow w podreczniku nptl(7). ZOBACZ TAKZE getgid(2), getuid(2), seteuid(2), setgid(2), setresuid(2), setuid(2), capabilities(7), credentials(7), user_namespaces(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.8 2 maja 2024 r. setreuid(2)