chroot(2)

NAZWA
chroot - zmienia katalog główny

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <unistd.h>

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 główny procesu wywołującego na katalog podany w path. Ten katalog będzie używany do nazw ścieżek zaczynających się od /. Katalog główny jest dziedziczony przez wszystkie procesy potomne wywołującego procesu.

Funkcję chroot(2) może wywołać tylko proces uprzywilejowany (pod Linuksem: ten z przywilejem CAP_SYS_CHROOT w swojej przestrzeni nazw użytkownika).

To wywołanie zmienia tylko i wyłącznie składnik procesu rozwiązywania ścieżek. W szczególności nie zostało zaprojektowane w jakimkolwiek stopniu do celów bezpieczeństwa, ani do utworzenia pełnej piaskownicy dla procesu, ani do ograniczenia systemu plików wywołaniom systemowym. W przeszłości chroot() używały demony do ograniczenia się, przed przekazaniem ścieżki, otrzymanej od niezaufanych użytkowników, wywołaniom systemowym takim jak open(2). Jednak jeśli katalog jest przenoszony z katalogu chroot, atakujący może to wykorzystać i wydostać się również poza katalog chroot. Najłatwiej uczynić to poprzez chdir(2) do katalogu mającego być przeniesionego, poczekanie na przeniesienie i otwarcie ścieżki takiej jak ../../../etc/passwd.

Nieco bardziej skomplikowany wariant działa również w pewnych przypadkach, gdy chdir(2) nie jest dozwolone. Jeśli demon pozwala na określenie „katalogu chroot”, zwykle oznacza to, że jeśli usiłuje się uniemożliwić użytkownikom zdalnym dostępu do plików spoza katalogu chroot, konieczne jest upewnienie się, że katalogi nigdy nie są z niego przenoszone.

Wywołanie to nie zmienia bieżącego katalogu roboczego, więc „.” może znajdować się poza drzewem zakorzenionym w „/”. W szczególności, superużytkownik może uciec z „uwięzienia w chroot” wykonując:

    mkdir foo; chroot foo; cd ..

Wywołanie to nie zamyka otwartych deskryptorów plików, więc takie deskryptory plików mogą zezwalać na dostęp poza nowym drzewem chroot.

WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane jest errno wskazując błąd.

BŁĘDY
Dla niektórych systemów plików mogą być zwracane inne błędy niż opisane poniżej. Najogólniejsze błędy to:

EACCES
    Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)).

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

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

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

ENAMETOOLONG
    path jest zbyt długie.

ENOENT
    Plik nie istnieje.

ENOMEM
    Brak pamięci jądra.

ENOTDIR
    Składowa ścieżki path nie jest katalogiem.

EPERM
    Wywołujący jest niewystarczająco uprzywilejowany.

STANDARDY
Brak.

HISTORIA
SVr4, 4.4BSD, SUSv2 (oznaczone jako LEGACY - przestarzałe). Funkcja ta nie była częścią POSIX.1-2001.

UWAGI
Proces potomny utworzony za pomocą fork(2) dziedziczy katalog główny swojego procesu macierzystego. Katalog główny jest pozostawiany bez zmiany przez execve(2).

Do poznania katalogu głównego procesu można użyć magicznego dowiązania symbolicznego /proc/pid/root, więcej informacji w podręczniku proc(5).

FreeBSD ma silniejsze wywołanie systemowe jail().

ZOBACZ TAKŻE
chroot(1), chdir(2), pivot_root(2), path_resolution(7), switch_root(8)

TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Robert Luberda <robert@debian.org> 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.