setuid(2) System Calls Manual setuid(2) NAZWA setuid - ustawia identyfikator uzytkownika BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int setuid(uid_t uid); OPIS setuid() ustawia efektywny identyfikator uzytkownika procesu wywolujacego. Jesli proces wywolujacy jest uprzywilejowany (precyzyjniej: jesli proces ma przywilej CAP_SETUID w swojej przestrzeni nazw uzytkownika) ustawiany jest rowniez rzeczywisty UID oraz zapisany set-user-ID. W Linuksie setuid() jest zaimplementowany tak, jak wersja POSIX, z funkcja _POSIX_SAVED_IDS. Pozwala to programom set-user-ID (innym niz root) porzucic wszystkie swoje przywileje uzytkownika, wykonac jakas nieuprzywilejowana prace, a nastepnie odzyskac pierwotny efektywny identyfikator uzytkownika w bezpieczny sposob. Jesli uzytkownik jest rootem albo program jest typu set-user-ID-root, konieczne jest zachowanie specjalnej uwagi: setuid() sprawdza efektywny identyfikator uzytkownika wywolujacego i jesli jest on superuzytkownikiem, wszystkie identyfikatory uzytkownika zwiazane z procesem sa ustawiane na uid. Po tym, gdy to nastapi, program nie bedzie w stanie odzyskac uprawnien roota. Z tego wzgledu program typu set-user-ID-root chcacy tymczasowo porzucic przywileje roota, przyjmujacy tozsamosc uzytkownika nieuprzywilejowanego, a nastepnie odzyskujacy przywileje roota nie moze korzystac z setuid(). Mozna tego dokonac za pomoca seteuid(2). WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane errno, wskazujac blad. Uwaga: sa przypadki, gdy setuid() moze zawiesc nawet wowczas, gdy wywolujacy ma UID 0. Pominiecie sprawdzenia zwrotu niepowodzenia z setuid() jest powaznym zagrozeniem bezpieczenstwa. BLEDY EAGAIN Wywolanie mogloby zmienic rzeczywisty UID wywolujacego (tzn. uid nie pasowalby do rzeczywistego UID wywolujacego), lecz wystapilo tu tymczasowe niepowodzenie w przydzieleniu niezbednych struktur danych jadra. EAGAIN uid nie pasuje do rzeczywistego identyfikatora uzytkownika wywolujacego, a to wywolanie spowodowaloby przekroczenie limitu zasobow RLIMIT_NPROC wywolujacego przez liczbe procesow nalezacych do rzeczywistego ID uzytkownika uid. Od Linuksa 3.1 blad ten juz sie nie pojawia (lecz solidne aplikacje powinny dokonywac jego sprawdzenia); zob. opis EAGAIN w execve(2). EINVAL Identyfikator uzytkownika podany w uid nie jest prawidlowy w tej przestrzeni nazw uzytkownika. EPERM Uzytkownik nie jest uprzywilejowany (Linux: nie ma przywileju CAP_SETUID w swej przestrzeni nazw uzytkownika), a uid nie pasuje do rzeczywistego UID-u lub zapisanego set-user-ID procesu wywolujacego. 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 setuid()) 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 POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4. Nie jest w pelni kompatybilne z wywolaniem z 4.4BSD, ktore ustawia wszystkie identyfikatory uzytkownika: rzeczywisty, zapisany i efektywny. Pierwotne linuksowe wywolania systemowe setuid() obslugiwalo jedynie 16-bitowe identyfikatory grup. Nastepnie, w Linuksie 2.4 dodano setuid32(), obslugujace identyfikatora 32-bitowe. Funkcja opakowujaca setuid() biblioteki glibc obsluguje te warianty pomiedzy wersjami jadra w sposob przezroczysty. UWAGI W Linuksie istnieje koncept identyfikatora uzytkownika systemu plikow, zwykle rownego efektywnemu identyfikatorowi uzytkownika. Wywolanie setuid() ustawia rowniez ID uzytkownika systemu plikow procesu wywolujacego. Zob. setfsuid(2). Jesli uid jest rozny od starego efektywnego UID-u, to procesowi zostanie uniemozliwione pozostawienie zrzutu rdzenia. ZOBACZ TAKZE getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7), user_namespaces(7) TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: 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. setuid(2)