chroot(2) System Calls Manual chroot(2) NAZWA chroot - zmienia katalog glowny BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int chroot(const char *path); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): chroot(): Od glibc 2.2.2: _XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L) || /* Od glibc 2.20: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE Przed glibc 2.2.2: brak OPIS chroot() zmienia katalog glowny procesu wywolujacego na katalog podany w path. Ten katalog bedzie uzywany do nazw sciezek zaczynajacych sie od /. Katalog glowny jest dziedziczony przez wszystkie procesy potomne wywolujacego procesu. Funkcje chroot(2) moze wywolac tylko proces uprzywilejowany (pod Linuksem: ten z przywilejem CAP_SYS_CHROOT w swojej przestrzeni nazw uzytkownika). To wywolanie zmienia tylko i wylacznie skladnik procesu rozwiazywania sciezek. W szczegolnosci nie zostalo zaprojektowane w jakimkolwiek stopniu do celow bezpieczenstwa, ani do utworzenia pelnej piaskownicy dla procesu, ani do ograniczenia systemu plikow wywolaniom systemowym. W przeszlosci chroot() uzywaly demony do ograniczenia sie, przed przekazaniem sciezki, otrzymanej od niezaufanych uzytkownikow, wywolaniom systemowym takim jak open(2). Jednak jesli katalog jest przenoszony z katalogu chroot, atakujacy moze to wykorzystac i wydostac sie rowniez poza katalog chroot. Najlatwiej uczynic to poprzez chdir(2) do katalogu majacego byc przeniesionego, poczekanie na przeniesienie i otwarcie sciezki takiej jak ../../../etc/passwd. Nieco bardziej skomplikowany wariant dziala rowniez w pewnych przypadkach, gdy chdir(2) nie jest dozwolone. Jesli demon pozwala na okreslenie ,,katalogu chroot", zwykle oznacza to, ze jesli usiluje sie uniemozliwic uzytkownikom zdalnym dostepu do plikow spoza katalogu chroot, konieczne jest upewnienie sie, ze katalogi nigdy nie sa z niego przenoszone. Wywolanie to nie zmienia biezacego katalogu roboczego, wiec ,,." moze znajdowac sie poza drzewem zakorzenionym w ,,/". W szczegolnosci, superuzytkownik moze uciec z ,,uwiezienia w chroot" wykonujac: mkdir foo; chroot foo; cd .. Wywolanie to nie zamyka otwartych deskryptorow plikow, wiec takie deskryptory plikow moga zezwalac na dostep poza nowym drzewem chroot. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY Dla niektorych systemow plikow moga byc zwracane inne bledy niz opisane ponizej. Najogolniejsze bledy to: EACCES Brak praw do przeszukiwania dla skladowej sciezki (zob. takze path_resolution(7)). EFAULT path wskazuje poza dostepna dla uzytkownika przestrzen adresowa. EIO Wystapil blad wejscia/wyjscia. ELOOP Podczas rozwiazywania path napotkano zbyt wiele dowiazan symbolicznych. ENAMETOOLONG path jest zbyt dlugie. ENOENT Plik nie istnieje. ENOMEM Brak pamieci jadra. ENOTDIR Skladowa sciezki path nie jest katalogiem. EPERM Wywolujacy jest niewystarczajaco uprzywilejowany. STANDARDY Brak. HISTORIA SVr4, 4.4BSD, SUSv2 (oznaczone jako LEGACY - przestarzale). Funkcja ta nie byla czescia POSIX.1-2001. UWAGI Proces potomny utworzony za pomoca fork(2) dziedziczy katalog glowny swojego procesu macierzystego. Katalog glowny jest pozostawiany bez zmiany przez execve(2). Do poznania katalogu glownego procesu mozna uzyc magicznego dowiazania symbolicznego /proc/pid/root, wiecej informacji w podreczniku proc(5). FreeBSD ma silniejsze wywolanie systemowe jail(). ZOBACZ TAKZE chroot(1), chdir(2), pivot_root(2), path_resolution(7), switch_root(8) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Robert Luberda i 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.06 31 pazdziernika 2023 r. chroot(2)