EN JA
CHROOT(2)
CHROOT(2) FreeBSD System Calls Manual CHROOT(2)

名称

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

ライブラリ

Standard C Library (libc, -lc)

書式

#include < unistd.h>

int
chroot( const char *dirname);

解説

dirname 引数は、ASCII のヌル文字で終了するディレクトリのパス名のアドレスです。 chroot() システムコールは、 dirname をルートディレクトリ、すなわち、‘ /’で開始するパス名のパス検索の開始点にします。

ディレクトリがルートディレクトリになるためには、プロセスにそのディレクトリへの実行 (検索) 許可がなければなりません。

chroot() はプロセスの現在のディレクトリに影響しないことに注意する必要があります。

この関数を呼び出せるのはスーパユーザのみです。

ディレクトリを参照するオープンファイル記述子が存在する場合、 chroot() 呼び出しは sysctl 変数‘ kern.chroot_allow_open_directories’の設定に従い、次のように失敗します:

kern.chroot_allow_open_directories’が 0 に設定されている場合、ディレクトリがオープンされていれば chroot() は常に EPERM で失敗します。

kern.chroot_allow_open_directories’が 1 に設定されている場合 (デフォルト)、ディレクトリがオープンされていて、そのプロセスが chroot() システムコールの影響を受ける時、 chroot() は、 EPERM で失敗します。

kern.chroot_allow_open_directories’が他の値の場合、オープンディレクトリのチェックはされません。

戻り値

Upon successful completion, the value 0 is returned; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

エラー

chroot() システムコールは、次の場合処理に失敗し、ルートディレクトリは、変更されません:
[ ENOTDIR]
パスの構成要素中にディレクトリ以外のものが含まれています。
[ EPERM]
実効ユーザ ID がスーパユーザではありません。またはディレクトリが 1 つ以上のファイル記述子によってオープンされています。
[ ENAMETOOLONG]
パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えています。
[ ENOENT]
指定のディレクトリが存在しません。
[ EACCES]
指定されたパスには、検索が許可されていないディレクトリが含まれています。
[ ELOOP]
パス名を変換するときに検出されたシンボリックリンクが多すぎます。
[ EFAULT]
dirname 引数が、プロセスに割り当てられたアドレス空間の範囲外を指しています。
[ EIO]
ファイルシステムに読み書きしている間に入出力エラーが発生しました。

関連項目

chdir(2), jail(2)

歴史

chroot() システムコールは、 4.2BSD で登場しました。 Version 2 of the Single UNIX Specification (“SUSv2”) の“遺産”としてマークされ、後の標準で削除されました。

バグ

プロセスがその作業ディレクトリを目的のディレクトリに変更可能であるが、 (ディレクトリのオープンチェック、または MAC チェックのような) 他のアクセス制御チェックで失敗する場合には、そのプロセスの作業ディレクトリが変更されたまま、このシステムコールがエラーを返すかもしれません。

セキュリティの考察

システムには、プロセスが開始した後にロードするかもしれないファイルへの多くの決め打ちされたパスがあります。成功した chroot 呼び出しの直後に特権を落とし、 chroot ルートの制限されたサブツリーへの書き込みアクセスを禁止することが一般的に推奨されます、例えば、サンドボック化されたユーザは、あらゆる有名なシステムディレクトリへの書き込みアクセスを持たないように、サンドボックを設定します。
January 3, 2012 FreeBSD