setfsuid(2) System Calls Manual setfsuid(2) NAZWA setfsuid - ustawia identyfikator uzytkownika uzywany przy sprawdzeniach na poziomie systemu plikow BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include [[przestarzale]] int setfsuid(uid_t fsuid); OPIS W Linuksie, proces moze posiadac zarowno identyfikator uzytkownika systemu plikow jak i efektywny identyfikator uzytkownika. (Typowo linuksowy) identyfikator uzytkownika systemu plikow sluzy do sprawdzania uprawnien przy dostepie do obiektow systemu plikow, natomiast efektywny identyfikator uzytkownika jest uzywany do roznych innych sprawdzen uprawnien (zob. credentials(7)). Zwykle wartosc identyfikatora uzytkownika systemu plikow dla procesu jest taka sama, jak jego wartosc efektywnego identyfikatora uzytkownika. Jest tak, poniewaz przy kazdej zmianie efektywnego identyfikatora uzytkownika jadro zmienia rowniez identyfikator uzytkownika systemu plikow na taki sam, jak nowa wartosc efektywnego ID uzytkownika. Proces moze spowodowac, ze wartosc jego ID uzytkownika systemu plikow zacznie odbiegac od jego efektywnego ID uzytkownika korzystajac z setfsuid(), w celu zmiany jego ID uzytkownika systemu plikow na wartosc podana w fsuid. Bezposrednie wywolania do setfsuid() i setfsgid(2) sa (byly) zwykle stosowane tylko przez programy takie jak linuksowy serwer NFS, ktory musi zmienic identyfikator uzytkownika i grupy sluzacy do dostepu do pliku, bez zmieniania odpowiadajacych mu rzeczywistych i efektywnych identyfikatorow uzytkownika i grupy. Zmienienie normalnego identyfikatora uzytkownika dla programu takiego jak serwer NFS jest (bylo) zagrozeniem bezpieczenstwa, ktore moze prowadzic do wystawienia go na dzialanie niechcianych sygnalow (jednak problem ten jest tylko historyczny; zob. nizej). setfsuid() powiedzie sie tylko, jesli wywolujacy jest superuzytkownikiem lub jesli fsuid pasuje do rzeczywistego identyfikatora uzytkownika wywolujacego, efektywnego identyfikatora uzytkownika, zapisanego set-user-ID lub aktualnego identyfikatora uzytkownika systemu plikow. WARTOSC ZWRACANA Zarowno w przypadku powodzenia, jak i przy niepowodzeniu, niniejsze wywolanie zwraca poprzedni identyfikator uzytkownika systemu plikow wywolujacego. STANDARDY Linux. HISTORIA Linux 1.2. W momencie wprowadzenia niniejszego wywolania systemowego, jeden proces mogl wysylac sygnal do innego procesu o tym samym efektywnym identyfikatorze uzytkownika. Oznaczalo to, ze jesli uprzywilejowany proces zmienil swoj efektywny identyfikator uzytkownika w celu sprawdzenia uprawnien do pliku, mogl byc odsloniety na otrzymywanie sygnalow wysylanych przez inny (nieuprzywilejowany) proces o tym samym identyfikatorze uzytkownika. Z tego wzgledu dodano atrybut identyfikatora uzytkownika systemu plikow, aby pozwolic na zmiane identyfikatora uzytkownika przez proces, w celu sprawdzenia uprawnien do pliku, bez mozliwosci otrzymywanie niechcianych sygnalow. Od Linuksa 2.0 obsluga uprawnien przy sygnalach zmienila sie (zob. kill(2)), w wyniku czego proces moze zmienic swoj efektywny identyfikator uzytkownika bez wystawiania sie na otrzymywanie sygnalow od niechcianych procesow. Z tego wzgledu setfsuid() jest obecnie niepotrzebne i powinno sie go unikac w nowych aplikacjach (tak jak setfsgid(2)). Pierwotne linuksowe wywolania systemowe setfsuid() obslugiwalo jedynie 16-bitowe identyfikatory grup. Nastepnie, w Linuksie 2.4 dodano setfsuid32(), obslugujace identyfikatora 32-bitowe. Funkcja opakowujaca setfsuid() biblioteki glibc obsluguje te warianty pomiedzy wersjami jadra w sposob przezroczysty. Roznice biblioteki C/jadra W glibc 2.15 i wczesniejszych, gdy opakowanie dla tego wywolania systemowego ustali, ze argument nie moze byc przekazany jadru bez obciecia liczby (poniewaz jadro jest stare i nie obsluguje 32-bitowych identyfikatorow uzytkownikow), zwroci -1 i ustawi errno na EINVAL bez proby korzystania z wywolania systemowego. USTERKI Przy wystapieniu bledu, wywolujacy nie otrzymuje zwrotnie zadnego wskazania, a fakt, ze pomyslne i niepomyslne wywolanie zwraca te sama wartosc powoduje, ze nie da sie bezposrednio ustalic, czy wywolanie powiodlo sie, czy tez nie. Zamiast tego wywolujacy musi posilkowac sie siegnieciem do wartosci zwracanej przez kolejne wywolanie, takie jak setfsuid(-1) (ktore zawsze zawiedzie), aby ustalic, czy poprzedzajace je wywolanie do setfsuid() zmienilo identyfikator uzytkownika systemu plikow. Ostatecznie, EPERM powinno byc zwrocone, gdy wywolanie zawiedzie (z powodu nieposiadania przez wywolujacego przywileju CAP_SETUID). ZOBACZ TAKZE kill(2), setfsgid(2), capabilities(7), credentials(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. setfsuid(2)