Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

       chroot - ルートディレクトリを変更する

書式

       #include <unistd.h>

       int chroot(const char *path);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       chroot():
           glibc 2.2.2 以降:
               _XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L)
                   || /* glibc 2.20 以降: */ _DEFAULT_SOURCE
                   || /* Glibc 2.19 以前: */ _BSD_SOURCE
           glibc 2.2.2 より前: なし

説明

       chroot()  は、呼び出し元プロセスのルートディレクトリを path で指定されたディレクトリに変更
       する。 このディレクトリ以下が / から始まるパス名として使われる。  このルートディレクトリは
       呼び出し元のプロセスの全ての子プロセスに受け継がれる。

       特権プロセス (Linux では、そのプロセスのユーザー名前空間で CAP_SYS_CHROOT ケーパビリティを
       持つプロセス) のみが chroot()  を呼び出すことができる。

       This call changes an ingredient in the pathname resolution process and does nothing  else.
       In  particular, it is not intended to be used for any kind of security purpose, neither to
       fully sandbox a process nor to restrict filesystem system calls.  In  the  past,  chroot()
       has  been  used  by  daemons  to  restrict  themselves  prior to passing paths supplied by
       untrusted users to system calls such as open(2).  However, if a folder is moved out of the
       chroot directory, an attacker can exploit that to get out of the chroot directory as well.
       The easiest way to do that is to chdir(2)  to the to-be-moved directory, wait for it to be
       moved out, then open a path like ../../../etc/passwd.

       A  slightly  trickier  variation  also  works under some circumstances if chdir(2)  is not
       permitted.  If a daemon allows a "chroot directory" to be specified,  that  usually  means
       that  if  you  want  to  prevent  remote  users  from  accessing  files outside the chroot
       directory, you must ensure that folders are never moved out of it.

       このコールは現在の作業ディレクトリ (working directory) を変更しない。 そのため、このコール
       の後に '.' が '/' を 根とするツリーの外になる場合がある。 特に、スーパーユーザーは以下のよ
       うにすることで "chroot jail" から逃げ出せてしまう。

           mkdir foo; chroot foo; cd ..

       このコールはオープンファイルディスクリプターをクローズしないので、  このようなファイルディ
       スクリプターは chroot ツリーの外にある ファイルにアクセスできる。

返り値

       成功した場合は 0 が返される。エラーの場合は -1 が返され、 errno が適切に設定される。

エラー

       ファイルシステムによっては他のエラーが返される事がある。 一般的なエラーを以下に挙げる:

       EACCES パス名の構成要素に検索許可がない (path_resolution(7)  も見よ)。

       EFAULT path がアクセスできるアドレス空間外を指している。

       EIO    I/O エラーが発生した。

       ELOOP  path を解決する際に遭遇したシンボリックリンクが多過ぎる。

       ENAMETOOLONG
              path が長過ぎる。

       ENOENT ファイルが存在しない。

       ENOMEM カーネルに十分なメモリーがない。

       ENOTDIR
              path の構成要素がディレクトリではない。

       EPERM  呼び出し側に十分な特権がない。

準拠

       SVr4,  4.4BSD, SUSv2 (但し、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)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。