1.\" Copyright (c) 1983, 1991, 1993 2.\" The Regents of the University of California. All rights reserved. 3.\" 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" 3. Neither the name of the University nor the names of its contributors 13.\" may be used to endorse or promote products derived from this software 14.\" without specific prior written permission. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26.\" SUCH DAMAGE. 27.\" 28.Dd August 2, 2025 29.Dt CHROOT 2 30.Os 31.Sh NAME 32.Nm chroot , 33.Nm fchroot 34.Nd change root directory 35.Sh LIBRARY 36.Lb libc 37.Sh SYNOPSIS 38.In unistd.h 39.Ft int 40.Fn chroot "const char *dirname" 41.Ft int 42.Fn fchroot "int fd" 43.Sh DESCRIPTION 44The 45.Fa dirname 46argument 47is the address of the pathname of a directory, terminated by an ASCII NUL. 48The 49.Fn chroot 50system call causes 51.Fa dirname 52to become the root directory, 53that is, the starting point for path searches of pathnames 54beginning with 55.Ql / . 56.Pp 57In order for a directory to become the root directory 58a process must have execute (search) access for that directory. 59.Pp 60It should be noted that 61.Fn chroot 62has no effect on the process's current directory. 63.Pp 64This call is restricted to the super-user, unless the 65.Ql security.bsd.unprivileged_chroot 66sysctl variable is set to 1 67and the process has enabled the 68.Dv PROC_NO_NEW_PRIVS_CTL 69.Xr procctl 2 . 70.Pp 71Depending on the setting of the 72.Ql kern.chroot_allow_open_directories 73sysctl variable, open filedescriptors which reference directories 74will make the 75.Fn chroot 76fail as follows: 77.Pp 78If 79.Ql kern.chroot_allow_open_directories 80is set to zero, 81.Fn chroot 82will always fail with 83.Er EPERM 84if there are any directories open. 85.Pp 86If 87.Ql kern.chroot_allow_open_directories 88is set to one (the default), 89.Fn chroot 90will fail with 91.Er EPERM 92if there are any directories open and the 93process is already subject to the 94.Fn chroot 95system call. 96.Pp 97Any other value for 98.Ql kern.chroot_allow_open_directories 99will bypass the check for open directories, 100mimicking the historic insecure behavior of 101.Fn chroot 102still present on other systems. 103.Pp 104The 105.Fn fchroot 106system call is identical to 107.Fn chroot 108except it takes a file descriptor instead of path. 109.Sh RETURN VALUES 110.Rv -std 111.Sh ERRORS 112The 113.Fn chroot 114and 115.Fn fchroot 116system calls 117will fail and the root directory will be unchanged if: 118.Bl -tag -width Er 119.It Bq Er EPERM 120The effective user ID is not the super-user and the 121.Ql security.bsd.unprivileged_chroot 122sysctl is 0. 123.It Bq Er EPERM 124The effective user ID is not the super-user and the 125process has not enabled the 126.Dv PROC_NO_NEW_PRIVS_CTL 127.Xr procctl 2 . 128.It Bq Er EPERM 129One or more filedescriptors are open directories and the 130.Ql kern.chroot_allow_open_directories 131sysctl is not set to permit this. 132.It Bq Er EIO 133An I/O error occurred while reading from or writing to the file system. 134.It Bq Er EINTEGRITY 135Corrupted data was detected while reading from the file system. 136.El 137.Pp 138The 139.Fn chroot 140system call 141will fail and the root directory will be unchanged if: 142.Bl -tag -width Er 143.It Bq Er ENOTDIR 144A component of the path name is not a directory. 145.It Bq Er ENAMETOOLONG 146A component of a pathname exceeded 255 characters, 147or an entire path name exceeded 1023 characters. 148.It Bq Er ENOENT 149The named directory does not exist. 150.It Bq Er EACCES 151Search permission is denied for any component of the path name. 152.It Bq Er ELOOP 153Too many symbolic links were encountered in translating the pathname. 154.It Bq Er EFAULT 155The 156.Fa dirname 157argument 158points outside the process's allocated address space. 159.El 160.Pp 161The 162.Fn fchroot 163system call 164will fail and the root directory will be unchanged if: 165.Bl -tag -width Er 166.It Bq Er EACCES 167Search permission is denied for the directory referenced by the 168file descriptor. 169.It Bq Er EBADF 170The argument 171.Fa fd 172is not a valid file descriptor. 173.It Bq Er ENOTDIR 174The file descriptor does not reference a directory. 175.El 176.Sh SEE ALSO 177.Xr chdir 2 , 178.Xr jail 2 179.Sh HISTORY 180The 181.Fn chroot 182system call appeared in 183.At v7 . 184It was marked as 185.Dq legacy 186in 187.St -susv2 , 188and was removed in subsequent standards. 189The 190.Fn fchroot 191system call first appeared in 192.Fx 15.0 . 193.Sh BUGS 194If the process is able to change its working directory to the target 195directory, but another access control check fails (such as a check for 196open directories, or a MAC check), it is possible that this system 197call may return an error, with the working directory of the process 198left changed. 199.Sh SECURITY CONSIDERATIONS 200The system has many hardcoded paths to files which it may load after 201the process starts. 202It is generally recommended to drop privileges immediately after a 203successful 204.Nm 205call, 206and restrict write access to a limited subtree of the 207.Nm 208root. 209For instance, 210setup the sandbox so that the sandboxed user will have no write 211access to any well-known system directories. 212.Pp 213For complete isolation from the rest of the system, use 214.Xr jail 2 215instead. 216