Provided by: manpages-pl-dev_4.28.0-2_all 

NAZWA
setuid - ustawia identyfikator użytkownika
BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)
SKŁADNIA
#include <unistd.h>
int setuid(uid_t uid);
OPIS
setuid() ustawia efektywny identyfikator użytkownika procesu wywołującego. Jeśli proces wywołujący jest
uprzywilejowany (precyzyjniej: jeśli proces ma przywilej CAP_SETUID w swojej przestrzeni nazw
użytkownika) ustawiany jest również rzeczywisty UID oraz zapisany set-user-ID.
W Linuksie setuid() jest zaimplementowany tak, jak wersja POSIX, z funkcją _POSIX_SAVED_IDS. Pozwala to
programom set-user-ID (innym niż root) porzucić wszystkie swoje przywileje użytkownika, wykonać jakąś
nieuprzywilejowaną pracę, a następnie odzyskać pierwotny efektywny identyfikator użytkownika w bezpieczny
sposób.
Jeśli użytkownik jest rootem albo program jest typu set-user-ID-root, konieczne jest zachowanie
specjalnej uwagi: setuid() sprawdza efektywny identyfikator użytkownika wywołującego i jeśli jest on
superużytkownikiem, wszystkie identyfikatory użytkownika związane z procesem są ustawiane na uid. Po tym,
gdy to nastąpi, program nie będzie w stanie odzyskać uprawnień roota.
Z tego względu program typu set-user-ID-root chcący tymczasowo porzucić przywileje roota, przyjmujący
tożsamość użytkownika nieuprzywilejowanego, a następnie odzyskujący przywileje roota nie może korzystać z
setuid(). Można tego dokonać za pomocą seteuid(2).
WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane errno, wskazując
błąd.
Uwaga: są przypadki, gdy setuid() może zawieść nawet wówczas, gdy wywołujący ma UID 0. Pominięcie
sprawdzenia zwrotu niepowodzenia z setuid() jest poważnym zagrożeniem bezpieczeństwa.
BŁĘDY
EAGAIN Wywołanie mogłoby zmienić rzeczywisty UID wywołującego (tzn. uid nie pasowałby do rzeczywistego
UID wywołującego), lecz wystąpiło tu tymczasowe niepowodzenie w przydzieleniu niezbędnych struktur
danych jądra.
EAGAIN uid nie pasuje do rzeczywistego identyfikatora użytkownika wywołującego, a to wywołanie
spowodowałoby przekroczenie limitu zasobów RLIMIT_NPROC wywołującego przez liczbę procesów
należących do rzeczywistego ID użytkownika uid. Od Linuksa 3.1 błąd ten już się nie pojawia (lecz
solidne aplikacje powinny dokonywać jego sprawdzenia); zob. opis EAGAIN w execve(2).
EINVAL Identyfikator użytkownika podany w uid nie jest prawidłowy w tej przestrzeni nazw użytkownika.
EPERM Użytkownik nie jest uprzywilejowany (Linux: nie ma przywileju CAP_SETUID w swej przestrzeni nazw
użytkownika), a uid nie pasuje do rzeczywistego UID-u lub zapisanego set-user-ID procesu
wywołującego.
WERSJE
Różnice biblioteki C/jądra
Na poziomie jądra, identyfikatory użytkownika i grupy są atrybutami przynależnymi wątkowi. Jednak POSIX
wymaga, aby wszystkie wątki procesu dzieliły te same poświadczenia. Implementacja wątkowania NPTL
obsługuje wymagania POSIX za pomocą funkcji opakowujących dla różnych wywołań systemowych zmieniających
UID-y i GID-y procesów. Te funkcje opakowujące (w tym te dla setuid()) wykorzystują technikę opartą na
sygnałach aby zapewnić, że gdy jeden wątek zmieni swe poświadczenia, wszystkie inne wątki procesu również
to uczynią. Więcej szczegółów w podręczniku nptl(7).
STANDARDY
POSIX.1-2008.
HISTORIA
POSIX.1-2001, SVr4.
Nie jest w pełni kompatybilne z wywołaniem z 4.4BSD, które ustawia wszystkie identyfikatory użytkownika:
rzeczywisty, zapisany i efektywny.
Pierwotne linuksowe wywołania systemowe setuid() obsługiwało jedynie 16-bitowe identyfikatory grup.
Następnie, w Linuksie 2.4 dodano setuid32(), obsługujące identyfikatora 32-bitowe. Funkcja opakowująca
setuid() biblioteki glibc obsługuje te warianty pomiędzy wersjami jądra w sposób przezroczysty.
UWAGI
W Linuksie istnieje koncept identyfikatora użytkownika systemu plików, zwykle równego efektywnemu
identyfikatorowi użytkownika. Wywołanie setuid() ustawia również ID użytkownika systemu plików procesu
wywołującego. Zob. setfsuid(2).
Jeśli uid jest różny od starego efektywnego UID-u, to procesowi zostanie uniemożliwione pozostawienie
zrzutu rdzenia.
ZOBACZ TAKŻE
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7), user_namespaces(7)
TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ
ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-
list@lists.sourceforge.net.
Linux man-pages 6.9.1 2 maja 2024 r. setuid(2)