int chroot(const char *path);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
chroot():
_XOPEN_SOURCE && ! (_POSIX_C_SOURCE >= 200112L) || /* glibc 2.20 以降: */ _DEFAULT_SOURCE || /* Glibc 2.19 以前: */ _BSD_SOURCE
特権プロセス (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 ツリーの外にある ファイルにアクセスできる。
The magic symbolic link, /proc/[pid]/root, can be used to discover a process's root directory; see proc(5) for details.
FreeBSD にはより強力な jail() システムコールがある。
[man1]
[man2]
[man3]
[man4]
[man5]
[man6]
[man7]
[man8]
[a]
[b]
[c]
[d]
[e]
[f]
[g]
[h]
[i]
[j]
[k]
[l]
[m]
[n]
[o]
[p]
[q]
[r]
[s]
[t]
[u]
[v]
[w]
[x]
[y]
[z]