setresuid(2) System Calls Manual setresuid(2) NAZWA setresuid, setresgid - ustawia rzeczywisty, efektywny i zachowany identyfikator uzytkownika lub grupy BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #define _GNU_SOURCE /* Zob. feature_test_macros(7) */ #include int setresuid(uid_t ruid, uid_t euid, uid_t suid); int setresgid(gid_t rgid, gid_t egid, gid_t sgid); OPIS setresuid() ustawia dla biezacego procesu rzeczywisty i efektywny identyfikator uzytkownika (UID) oraz wartosc zachowanego set-user-ID. Proces nieuprzywilejowany moze zmienic swoj rzeczywisty UID, efektywny UID i zachowany set-user-ID na jeden z nastepujacych: biezacy rzeczywisty UID, biezacy efektywny UID lub biezacy zachowany set-user-ID. Proces uprzywilejowany (w Linuksie -- majacy przywilej CAP_SETUID (ang. capatility)) moze ustawic rzeczywisty UID, efektywny UID i zachowany set-user-ID na dowolne wartosci. Jezeli ktorykolwiek z parametrow jest rowny -1, to odpowiadajaca mu wartosc nie jest zmieniana. Niezaleznie od zmian rzeczywistego UID, efektywnego UID i zachowanego set-user-ID, UID systemu plikow jest zawsze ustawiany na taka sama wartosc, jaka ma (byc moze nowy) efektywny UID. Analogicznie, setresgid() ustawia rzeczywisty identyfikator grupy (GID), efektywny GID i zachowany set-group-ID biezacego procesu (i zawsze ustawia GID systemu plikow na wartosc efektywnego GID), z takimi samymi ograniczeniami dla procesow nieuprzywilejowanych. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane errno, wskazujac blad. Uwaga: sa przypadki, gdy setresuid() moze zawiesc nawet wowczas, gdy wywolujacy ma UID 0. Pominiecie sprawdzenia zwrotu niepowodzenia z setresuid() 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 procesem uprzywilejowanym (nie ma koniecznego przywileju w swojej przestrzeni nazw uzytkownika) i probowal ustawic niedozwolona wartosc ktoregos z identyfikatorow. W przypadku setresuid() koniecznym przywilejem jest CAP_SETUID; w przypadku setresgid() jest to CAP_SETGID. WERSJE 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 setresuid() i setresgid()) 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). STANDARDY Brak. HISTORIA Linux 2.1.44, glibc 2.3.2. HP-UX, FreeBSD. Oryginalne, linuksowe wywolania setresuid() i setresgid() obslugiwaly tylko 16-bitowe identyfikatory uzytkownika i grupy. Nastepnie w Linuksie 2.4 dodano setresuid32() i setresgid32(), obslugujace 32-bitowe identyfikatory. Funkcje opakowujace setresuid() i setresgid() biblioteki glibc obsluguja te warianty wywolan w roznych wersjach jadra w sposob przezroczysty dla uzytkownika. ZOBACZ TAKZE getresuid(2), getuid(2), setfsgid(2), setfsuid(2), setreuid(2), setuid(2), capabilities(7), credentials(7), user_namespaces(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Robert Luberda 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.15 17 maja 2025 r. setresuid(2)