chroot(2) System Calls Manual chroot(2)

ИМЯ

chroot - изменить корневой каталог

Standard C library (libc, -lc)

СИНТАКСИС

#include <unistd.h>
int chroot(const char *path);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

chroot():

    Since glibc 2.2.2:
        _XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
            || /* Since glibc 2.20: */ _DEFAULT_SOURCE
            || /* glibc <= 2.19: */ _BSD_SOURCE
    Before glibc 2.2.2:
        none

ОПИСАНИЕ

chroot() изменяет корневой каталог вызывающего процесса на тот, что задан аргументом path. Этот каталог будет использоваться для имён файлов, начинающихся с /. Корневой каталог наследуется всеми потомками вызывающего процесса.

Только привилегированный процесс (Linux: с мандатом CAP_SYS_CHROOT в своём пользовательском пространстве имён) может вызвать chroot().

Этот вызов изменяет только составляющую процесса разрешения имён и больше ничего. В частности, он не предназначен для действий повышения безопасности, создания полностью изолированной среды процесса (sandbox) или ограничения системных вызовов файловой системы. В прошлом, chroot() использовался службами для ограничения их самих передачи полученных от недоверенных пользователей путей системным вызовам наподобие open(2). Однако, если каталог перемещается за пределы каталога chroot, атакующий может использовать это в своих интересах и также выйти за пределы каталога chroot. Простейший способ сделать это — выполнить chdir(2) в каталог, который будет перемещён, подождать, когда он переместится, а затем открыть путь, например ../../../etc/passwd.

Если chdir(2) не разрешён, то есть немного более хитрый вариант, работающий при определённых условиях. Если служба позволяет задать «chroot в каталог», то обычно это означает, что если вы хотите предотвратить доступ к файлам удалённых пользователей вне каталога chroot, то вы должны гарантировать, что каталоги никогда не перемещаются за его пределы.

This call does not change the current working directory, so that after the call '.' can be outside the tree rooted at '/'. In particular, the superuser can escape from a "chroot jail" by doing:


mkdir foo; chroot foo; cd ..

Данный вызов не закрывает открытые файловые дескрипторы и поэтому через такие дескрипторы можно получить доступ к файлам за пределами дерева chroot.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

On success, zero is returned. On error, -1 is returned, and errno is set to indicate the error.

ОШИБКИ

В зависимости от файловой системы могут также возвращаться другие ошибки. Общий набор ошибок перечислен ниже:

Поиск запрещён из-за одного из частей префикса пути (См. также path_resolution(7).)
Аргумент path указывает за пределы доступного адресного пространства.
Произошла ошибка ввода-вывода.
Во время определения path встретилось слишком много символьных ссылок.
path слишком длинен.
Файл не существует.
Недостаточное количество памяти ядра.
Компонент path не является каталогом.
У вызвавшего процесса недостаточно прав.

СТАНДАРТЫ

None.

ИСТОРИЯ

SVr4, 4.4BSD, SUSv2 (отмечена как УСТАРЕВШАЯ). Эта функция не входит в POSIX.1-2001.

ЗАМЕЧАНИЯ

Дочерний процесс, созданный посредством fork(2), наследует корневой каталог родительского процесса. При вызове execve(2) корневой каталог остаётся неизменным.

The magic symbolic link, /proc/pid/root, can be used to discover a process's root directory; see proc(5) for details.

В FreeBSD есть более ограничивающий системный вызов jail().

СМ. ТАКЖЕ

chroot(1), chdir(2), pivot_root(2), path_resolution(7), switch_root(8)

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy S. Seregin <dseregin@59.ru>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Katrin Kutepova <blackkatelv@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

31 октября 2023 г. Linux man-pages 6.06