oracular (2) faccessat.2.gz

Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       access, faccessat, faccessat2 - sprawdza prawa użytkownika do pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       int access(const char *pathname, int mode);

       #include <fcntl.h>            /* Definicja stałych AT_* */
       #include <unistd.h>

       int faccessat(int dirfd, const char *pathname, int mode, int flags);
                       /* Różnice między biblioteką C a jądrem opisano poniżej */

       #include <fcntl.h>            /* Definicja stałych AT_* */
       #include <sys/syscall.h>      /* Definicja stałych SYS_* */
       #include <unistd.h>

       int syscall(SYS_faccessat2,
                   int dirfd, const char *pathname, int mode, int flags);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       faccessat():
           Od glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Przed glibc 2.10:
               _ATFILE_SOURCE

OPIS

       access()  sprawdza,  czy  wywołujący  proces ma dostęp do pliku pathname. Jeśli pathname jest dowiązaniem
       symbolicznym, jest rozwiązywana.

       Mode określa jakie sprawdzenia dostępności mają być wykonane  i  jest  albo  wartością  F_OK  albo  maską
       zawierającą  sumę  logiczną jednego lub więcej z R_OK, W_OK i X_OK.  F_OK sprawdza istnienie pliku. R_OK,
       W_OK i X_OK sprawdzają pod kątem istnienia pliku i, odpowiednio, uprawnień odczytu, zapisu i wykonania.

       Sprawdzenie jest wykonywane za pomocą prawdziwych identyfikatorów użytkownika i  grupy  procesu,  zamiast
       identyfikatorów  efektywnych, jak dzieje się przy rzeczywistej próbie wykonania operacji (np. open(2)) na
       pliku. Podobnie, w przypadku użytkownika root, sprawdzenie używa zestawu przywilejów (ang.  capabilities)
       dozwolonych   zamiast  zestawu  przywilejów  efektywnych;  w  przypadku  użytkowników  innych  niż  root,
       sprawdzenie używa pustego zestawu przywilejów.

       Pozwala to programom korzystającym z ustawienia ID użytkownika podczas wykonania  (suid)  oraz  programom
       obsługującym  przywileje  (ang.  capabilities)  na  łatwe  określenie uprawnień wywołującego użytkownika.
       Innymi słowy, access() nie odpowiada na pytanie "czy mogę odczytać/zapisać/wykonać ten plik?".  Odpowiada
       na  nieco  inne  "(zakładając, że jestem plikiem wykonywalnym korzystającym z suid) czy użytkownik, który
       mnie wywołał może odczytać/zapisać/wykonać ten plik?". Daje to programom korzystającym z  suid  możliwość
       uniemożliwienia   zmuszania  ich  przez  złośliwych  użytkowników  do  odczytywania  plików,  których  ci
       użytkownicy nie powinni móc odczytywać.

       Jeśli wywołujący proces jest uprzywilejowany  (tzn.  jego  identyfikator  użytkownika  wynosi  zero),  to
       sprawdzenie  X_OK  kończy  się  sukcesem,  jeśli  zwykły plik posiada uprawnienie wykonania dla dowolnego
       właściciela pliku, grupy itp.

   faccessat()
       Wywołanie systemowe faccessat() operuje w dokładnie taki sam sposób  jak  access(),  z  wyjątkiem  różnic
       opisanych tutaj.

       Jeśli  ścieżka  podana  w  pathname  jest  względna,  jest to interpretowane w odniesieniu do katalogu do
       którego odnosi się deskryptor pliku dirfd (zamiast w odniesieniu do bieżącego katalogu roboczego  procesu
       wywołującego, jak w stosunku do ścieżek względnych robi to access()).

       Jeśli  pathname  jest  względna  a dirfd ma wartość specjalną AT_FDCWD, to pathname jest interpretowana w
       odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak access()).

       Jeśli ścieżka pathname jest bezwzględna, to dirfd jest ignorowane.

       Parametr flags jest tworzony jako suma logiczna (OR) zera lub większej liczby następujących wartości:

       AT_EACCESS
              Przeprowadza sprawdzenie za pomocą efektywnych  identyfikatorów  użytkownika  i  grupy.  Domyślnie
              faccessat() używa identyfikatorów rzeczywistych (jak access()).

       AT_EMPTY_PATH (od Linuksa 5.8)
              Jeśli  pathname jest pustym łańcuchem, działa na pliku do którego odnosi się dirfd (który mógł być
              pozyskany za pomocą znacznika O_PATH open(2)). W tym przypadku dirfd może odnosić się do dowolnego
              typu  pliku,  a  nie  tylko katalogu. Jeśli dirfd wynosi AT_FDCWD, to wywołanie działa na bieżącym
              katalogu  roboczym.  Znacznik  ten  jest  charakterystyczny  dla   Linuksa;   należy   zdefiniować
              _GNU_SOURCE, aby pozyskać jego definicję.

       AT_SYMLINK_NOFOLLOW
              Jeśli  pathname  jest  dowiązaniem  symbolicznym,  nie rozwiązuje go: w zamian zwraca informacje o
              samym dowiązaniu.

       Więcej informacji o potrzebie wprowadzenia faccessat() można znaleźć w podręczniku openat(2).

   faccessat2()
       Powyższy opis faccessat() odnosi się do POSIX.1 i implementacji dostarczonej przez  glibc.  Implementacja
       glibc nie była jednak wiernym odwzorowaniem (zob. USTERKI), która prześlizgnęła się nad faktem, że surowe
       wywołanie linuksowe faccessat() nie posiadało argumentu flags. W celu poprawnej implementacji, Linux  5.8
       dodał  wywołanie  systemowe  faccessat2(),  które  obsługuje  argument  flags  i  pozwala  na  prawidłową
       implementację funkcji opakowującej faccessat().

WARTOŚĆ ZWRACANA

       Gdy wszystko pójdzie dobrze (wszystkie żądane prawa są zapewnione, lub mode wynosi F_OK i plik istnieje),
       zwracane  jest  zero.  W  wypadku  błędu  (przynajmniej  jeden  bit  z żądanych w mode uprawnień nie jest
       ustawiony, mode wynosi F_OK i plik nie istnieje lub wystąpiły inne błędy), zwracane jest -1  i  ustawiane
       jest errno wskazując błąd.

BŁĘDY

       EACCES Brak  uprawnień  dla  żądanego  dostępu  do  pliku, albo brak uprawnień do przeglądania któregoś z
              katalogów w ścieżce pathname (zob. też path_resolution(7)).

       EBADF  (faccessat())  pathname jest względne, lecz dirfd nie wynosi ani AT_FDCWD (faccessat()),  ani  nie
              jest prawidłowym deskryptorem pliku.

       EFAULT pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową.

       EINVAL mode zostało nieprawidłowo podane.

       EINVAL (faccessat())  Podano nieprawidłową opcję w flags.

       EIO    Wystąpił błąd wejścia/wyjścia.

       ELOOP  Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych.

       ENAMETOOLONG
              Ścieżka pathname jest zbyt długa.

       ENOENT Składnik pathname nie istnieje lub jest wiszącym dowiązaniem symbolicznym.

       ENOMEM Brak pamięci jądra.

       ENOTDIR
              Składnik pathname, który powinien być katalogiem w rzeczywistości katalogiem nie jest.

       ENOTDIR
              (faccessat())   pathname  jest  względna  a  dirfd jest deskryptorem pliku odnoszącym się do pliku
              zamiast do katalogu.

       EPERM  Żądano zapisu do pliku z ustawionym znacznikiem niezmienności. Zob. też ioctl_iflags(2).

       EROFS  Żądano zapisu do pliku położonego w systemie plików tylko do odczytu.

       ETXTBSY
              Wystąpiła próba dostępu z prawem zapisu do pliku aktualnie uruchomionego programu.

WERSJE

       Jeśli proces posiada odpowiednie uprawnienia  (tj.  jest  superużytkownikiem),  POSIX.1-2001  zezwala  na
       implementację  wskazującą  pomyślne  zakończenie dla sprawdzenia X_OK nawet wtedy, gdy nie jest ustawiony
       żaden z bitów uruchamialności w prawach dostępu do pliku. Linux tego nie czyni.

   Różnice biblioteki C/jądra
       Surowe wywołanie systemowe faccessat() przyjmuje jedynie trzy pierwsze argumenty. Znaczniki AT_EACCESS  i
       AT_SYMLINK_NOFOLLOW są faktycznie zaimplementowane w opakowującej funkcji glibc do faccessat(). Jeśli nie
       podano żadnego z tych znaczników, funkcja opakowująca używa fstatat(2) do określenia  uprawnień  dostępu,
       zob. jednak USTERKI.

   Uwagi dla glibc
       Na starszych wersjach jądra Linux, gdzie faccessat() nie jest dostępne (i gdzie znaczniki AT_EACCESS oraz
       AT_SYMLINK_NOFOLLOW nie są określone), funkcja opakowująca  z  glibc  wraca  do  używania  access().  Gdy
       pathname   jest   względną  ścieżką,  glibc  konstruuje  ścieżkę  na  bazie  dowiązania  symbolicznego  w
       /proc/self/fd, które odpowiada argumentowi dirfd.

STANDARDY

       access()
       faccessat()
              POSIX.1-2008.

       faccessat2()
              Linux.

HISTORIA

       access()
              SVr4, 4.3BSD, POSIX.1-2001.

       faccessat()
              Linux 2.6.16, glibc 2.4.

       faccessat2()
              Linux 5.8.

UWAGI

       Ostrzeżenie: Użycie tych wywołań w celu  sprawdzenia,  czy  użytkownik  ma  uprawnienia  na  przykład  do
       otwarcia  pliku,  przed  otwarciem  tego  pliku  za  pomocą  open(2) tworzy lukę bezpieczeństwa, ponieważ
       użytkownik może wykorzystać krótki moment pomiędzy sprawdzeniem pliku a otwarciem go  do  manipulacji  na
       pliku.  Z  tego  powodu  należy  unikać  używania  niniejszego  wywołania systemowego (w opisanym właśnie
       przykładzie,  bezpieczniejszą  alternatywą  byłoby  tymczasowe  przełączenie  efektywnego  identyfikatora
       użytkownika na jego identyfikator rzeczywisty, a następnie wywołanie open(2)).

       access()  zawsze  podąża za dowiązaniami symbolicznymi. Jeśli konieczne jest sprawdzenie uprawnień samego
       dowiązania symbolicznego, należy użyć faccessat() ze znacznikiem AT_SYMLINK_NOFOLLOW.

       Te wywołania zwracają błąd, jeśli jakikolwiek z żądanych w  mode  rodzajów  dostępu  zostanie  odmówiony,
       nawet jeśli pozostałe typy dostępu z mode są dozwolone.

       Plik  jest  dostępny tylko wówczas, gdy uprawnienia każdego z katalogów w jego ścieżce pathname przyznają
       dostęp do przeszukiwania (tj. wykonania). Jeśli dowolny katalog jest niedostępny, to  wywołanie  access()
       zawiedzie, niezależnie od uprawnień samego pliku.

       Sprawdzane  są jedynie bity dostępu, nie zawartość pliku czy jego typ. Dlatego, jeśli katalog okazuje się
       "zapisywalny", znaczy to prawdopodobnie, że można w nim tworzyć pliki, a nie, że do katalogu można  pisać
       jak do pliku. Podobnie, plik dosowy może zostać zgłoszony jako "wykonywalny", lecz funkcja execve(2) mimo
       to zawiedzie.

       Wywołania te mogą nie działać prawidłowo na systemach plików NFSv2 z włączonym mapowaniem  UID,  ponieważ
       mapowanie  to  jest  dokonywane  na  serwerze  i ukryte przed klientem sprawdzającym prawa dostępu (NFS w
       wersji 3 i wyższej dokonują sprawdzeń na serwerze). Podobny problem może wystąpić przy montowaniach FUSE.

USTERKI

       Ze względu na to, że wywołanie systemowe jądra Linux faccessat() nie obsługuje argumentu  flags,  funkcja
       opakowująca   faccessat()   z  glibc  udostępniona  w  glibc  2.32  i  wcześniejszych,  emuluje  wymaganą
       funkcjonalność za pomocą połączenia wywołania systemowego faccessat() oraz fstatat(2). Jednak emulacja ta
       nie  bierze  pod  uwagę  ACL-i  (list  kontroli  dostępu  do  plików).  Począwszy  od glibc 2.33, funkcja
       opakowująca obchodzi tę usterkę, wykorzystując wywołanie  systemowe  faccessat2(),  tam  gdzie  jest  ono
       zapewnione przez jądro.

       W  Linuksie  2.4  (i  wcześniejszych)  obsługa  testów X_OK dla superużytkownika jest nieco dziwna. Jeśli
       wszystkie kategorie uprawnień wykonania są wyłączone dla pliku niebędącego katalogiem, to jedynym  testem
       access()  zwracającym -1 jest sytuacja, gdy podany mode wynosi tylko X_OK; jeśli w mode określono również
       R_OK lub W_OK, to access() zwróci dla takich plików 0. Wczesny Linux  2.6  (do  Linuksa  2.6.3  włącznie)
       zachowywał się również w ten sam sposób jak Linux 2.4.

       Przed  Linuksem  2.6.20,  wywołania  te  ignorowały  wpływ  znacznika  MS_NOEXEC, jeśli był on używany do
       wykonania mount(2) na systemie plików. Od Linuksa 2.6.20, znacznik MS_NOEXEC jest uwzględniany.

ZOBACZ TAKŻE

       chmod(2),   chown(2),   open(2),   setgid(2),   setuid(2),   stat(2),   euidaccess(3),    credentials(7),
       path_resolution(7), symlink(7)

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i 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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.