table of contents
setfsuid(2) | System Calls Manual | setfsuid(2) |
NAZWA¶
setfsuid - ustawia identyfikator użytkownika używany przy sprawdzeniach na poziomie systemu plików
BIBLIOTEKA¶
Standardowa biblioteka C (libc, -lc)
SKŁADNIA¶
#include <sys/fsuid.h>
[[przestarzałe]] int setfsuid(uid_t fsuid);
OPIS¶
W Linuksie, proces może posiadać zarówno identyfikator użytkownika systemu plików jak i efektywny identyfikator użytkownika. (Typowo linuksowy) identyfikator użytkownika systemu plików służy do sprawdzania uprawnień przy dostępie do obiektów systemu plików, natomiast efektywny identyfikator użytkownika jest używany do różnych innych sprawdzeń uprawnień (zob. credentials(7)).
Zwykle wartość identyfikatora użytkownika systemu plików dla procesu jest taka sama, jak jego wartość efektywnego identyfikatora użytkownika. Jest tak, ponieważ przy każdej zmianie efektywnego identyfikatora użytkownika jądro zmienia również identyfikator użytkownika systemu plików na taki sam, jak nowa wartość efektywnego ID użytkownika. Proces może spowodować, że wartość jego ID użytkownika systemu plików zacznie odbiegać od jego efektywnego ID użytkownika korzystając z setfsuid(), w celu zmiany jego ID użytkownika systemu plików na wartość podaną w fsuid.
Bezpośrednie wywołania do setfsuid() i setfsgid(2) są (były) zwykle stosowane tylko przez programy takie jak linuksowy serwer NFS, który musi zmienić identyfikator użytkownika i grupy służący do dostępu do pliku, bez zmieniania odpowiadających mu rzeczywistych i efektywnych identyfikatorów użytkownika i grupy. Zmienienie normalnego identyfikatora użytkownika dla programu takiego jak serwer NFS jest (było) zagrożeniem bezpieczeństwa, które może prowadzić do wystawienia go na działanie niechcianych sygnałów (jednak problem ten jest tylko historyczny; zob. niżej).
setfsuid() powiedzie się tylko, jeśli wywołujący jest superużytkownikiem lub jeśli fsuid pasuje do rzeczywistego identyfikatora użytkownika wywołującego, efektywnego identyfikatora użytkownika, zapisanego set-user-ID lub aktualnego identyfikatora użytkownika systemu plików.
WARTOŚĆ ZWRACANA¶
Zarówno w przypadku powodzenia, jak i przy niepowodzeniu, niniejsze wywołanie zwraca poprzedni identyfikator użytkownika systemu plików wywołującego.
STANDARDY¶
Linux.
HISTORIA¶
Linux 1.2.
W momencie wprowadzenia niniejszego wywołania systemowego, jeden proces mógł wysyłać sygnał do innego procesu o tym samym efektywnym identyfikatorze użytkownika. Oznaczało to, że jeśli uprzywilejowany proces zmienił swój efektywny identyfikator użytkownika w celu sprawdzenia uprawnień do pliku, mógł być odsłonięty na otrzymywanie sygnałów wysyłanych przez inny (nieuprzywilejowany) proces o tym samym identyfikatorze użytkownika. Z tego względu dodano atrybut identyfikatora użytkownika systemu plików, aby pozwolić na zmianę identyfikatora użytkownika przez proces, w celu sprawdzenia uprawnień do pliku, bez możliwości otrzymywanie niechcianych sygnałów. Od Linuksa 2.0 obsługa uprawnień przy sygnałach zmieniła się (zob. kill(2)), w wyniku czego proces może zmienić swój efektywny identyfikator użytkownika bez wystawiania się na otrzymywanie sygnałów od niechcianych procesów. Z tego względu setfsuid() jest obecnie niepotrzebne i powinno się go unikać w nowych aplikacjach (tak jak setfsgid(2)).
Pierwotne linuksowe wywołania systemowe setfsuid() obsługiwało jedynie 16-bitowe identyfikatory grup. Następnie, w Linuksie 2.4 dodano setfsuid32(), obsługujące identyfikatora 32-bitowe. Funkcja opakowująca setfsuid() biblioteki glibc obsługuje te warianty pomiędzy wersjami jądra w sposób przezroczysty.
Różnice biblioteki C/jądra¶
W glibc 2.15 i wcześniejszych, gdy opakowanie dla tego wywołania systemowego ustali, że argument nie może być przekazany jądru bez obcięcia liczby (ponieważ jądro jest stare i nie obsługuje 32-bitowych identyfikatorów użytkowników), zwróci -1 i ustawi errno na EINVAL bez próby korzystania z wywołania systemowego.
USTERKI¶
Przy wystąpieniu błędu, wywołujący nie otrzymuje zwrotnie żadnego wskazania, a fakt, że pomyślne i niepomyślne wywołanie zwraca tę samą wartość powoduje, że nie da się bezpośrednio ustalić, czy wywołanie powiodło się, czy też nie. Zamiast tego wywołujący musi posiłkować się sięgnięciem do wartości zwracanej przez kolejne wywołanie, takie jak setfsuid(-1) (które zawsze zawiedzie), aby ustalić, czy poprzedzające je wywołanie do setfsuid() zmieniło identyfikator użytkownika systemu plików. Ostatecznie, EPERM powinno być zwrócone, gdy wywołanie zawiedzie (z powodu nieposiadania przez wywołującego przywileju CAP_SETUID).
ZOBACZ TAKŻE¶
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.
2 maja 2024 r. | Linux man-pages 6.9.1 |