CHROOT

Section: Linux Programmer's Manual (2)
Updated: 2019-03-06
Index Return to Main Contents
 

名前

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() を呼び出すことができる。

このコールはパス名解決の過程で構成要素を変更するのみで、 その他には何も行わない。 特に、これは何らかのセキュリティ上の目的を意図しておらず、 プロセスの完全なサンドボックスになる訳でも、 ファイルシステムのシステムコールを制限する訳でもない。 かつては、 chroot() は、信用できないユーザーから指定されたパスを、 open(2) のようなシステムコールに渡す際に、デーモンがそのパスを前もって 制限するのに使われていた。 しかし、フォルダが chroot ディレクトリの外に出されてしまうと、 攻撃者も chroot ディレクトリの外に出て悪用できてしまう。 これを行う最も簡単な方法は、移動される予定のディレクトリに chdir(2) しておいて、外に出されるのを待ち、 ../../../etc/passwd のようにパスをオープンすることである。

ちょっとトリッキーな派生型を使うと、 chdir(2) が許可されていない環境でも動作する。 デーモンに "chroot ディレクトリ" を許可する指定がされている場合、 リモートユーザーが chroot ディレクトリの外にアクセスするのを防止するには、 フォルダを chroot ディレクトリの外に絶対に出さないようにしなければならない。

このコールは現在の作業ディレクトリ (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) の場合も、ルートディレクトリは変更されない。

マジックシンボリックリンク /proc/[pid]/root を使って、プロセスのルートディレクトリを見つけることができる。 詳細は proc(5) を参照すること。

FreeBSD にはより強力な jail() システムコールがある。  

関連項目

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

この文書について

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


 

Index

名前
書式
説明
返り値
エラー
準拠
注意
関連項目
この文書について

This document was created by man2html, using the manual pages.
Time: 11:35:20 GMT, January 12, 2021