1. Introduction
In this tutorial, we’ll discuss chroot jails. We’ll briefly examine what chroot as a command does and what a chroot jail is. Then, we’ll be ready to address the question of how to detect whether a process runs inside a chroot jail.
2. What Does chroot Do?
The chroot command is a command in Unix-like operating systems that changes the root directory a process sees. A user can give a path as an argument to chroot, and the directory pointed will be used in all pathnames beginning with ‘/’.
The root directory in Unix systems is – unless changed – always ‘/’. The root directory is the top-level directory of the filesystem, and all other directories are always beneath them.
Some common use cases for chroot contain system recoveries, testing and security. For system recoveries, running in an isolated minimal environment helps mitigate many things that could’ve gone wrong with the filesystem and allows for things like installing critical software, e.g. a bootloader. Testing is, of course, a natural environment for chroot, as isolated filesystems help keep things tight and simple. As for security, directory isolation means that chroot-ed processes may not see and have access to directories above the new root directory.
3. What Is a Chroot Jail?
A chroot jail is a technique in Unix-like operating systems that involves using the chroot command to change the root directory for a process and its children to a specified directory. This restricts the process and its descendants to a limited portion of the file system, creating an isolated environment often referred to as a “chroot jail” or “chroot environment”. Using chroot can be used as a type of “process sandboxing“.
The purpose of this technique is confinement of the process. As mentioned before, chroot can be a useful tool for security. Limiting access to the file system means that malicious processes cannot read and modify any file they want. It’s important to note however, that this command is not enough to guarantee security and should be used together with additional measures.
A chroot jail also applies on some other instances. In software testing, isolated environments are created with chroot. Using only specific libraries and dependencies in such environment developers can be sure that software runs as intended.
It is common to see some specific directories mounted inside chroot jail. This will be important later when we discuss how to tell if we’re running inside a jail. It is very often that we find /proc, /dev and /sys mounted inside a jail, for essential system information and interfaces.
4. How to Tell We’re in a chroot Jail
Let’s start with the hard truth: most of the time, there is no deterministic way to tell whether we are running inside a chroot jail or not. The chroot operation itself does not leave explicit markers, and various methods used to detect a chroot environment can be circumvented by a determined user with sufficient privileges. This does not apply for specific architectures where explicit functions exist that let the process know, such as ischroot() in Debian, as we’ll see below.
What can be done, however, is to identify certain indicators that suggest we could be running inside a chroot jail. While these indicators may suggest that you are in a chroot jail, they are not guaranteed to be reliable in all cases. Detection methods are generally considered as heuristics rather than definitive tests. Even so, they can be strong pointers of whether a process is inside a jail or not.
Let’s take a look at some ways we can gain insights:
4.1. ischroot() for Debian
If our system of choice is Debian-based, then we’re lucky! The ischroot() command is installed by default on Debian and will detect if the process is running in a jail. However, there is no deterministic way to tell if running inside a restricted environment, even with the help of ischroot(). Determined users can hide the indicators that this command looks for, and make the command show nothing – when in fact we are actually inside a jail.
So, on Debian, ischroot returns 1 if not inside a jail:
$ ischroot; echo $?
$ 1
and 0 if actually inside a chroot environment:
$ ischroot; echo $?
$ 0
In Bash, $? is a special variable that holds the exit status of the last executed command.
4.2. Common Checks
Starting out, we should check what the root directory is. If the root directory is different than the system root “/”, we’re likely inside a jail. We can check that with:
$ df /
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 927117308 328173440 598943868 36% /
Another common thing for chroot environments is the lack of some important system directories. Therefore we look for /bin, /etc, /usr, etc.
$ ls /bin /etc /usr
The lack of one or more of these can be a hint towards an environment jail.
Detecting a chroot jail often involves examining the /proc directory, a virtual file system providing insights into processes and system information. By inspecting /proc/mounts, one can identify potential chroot environments by analyzing the root file system path, as chrooted systems may mount the root at a different location. Additionally, the existence of the file “*/proc/sys/kernel/chroot*” within the /proc directory can serve as a clear indicator of a system operating within a chroot environment. To check that, one can simply run:
$ ls /proc/sys/kernel/chroot
4.3. Inode Trick
To verify if we’re chrooted inside a complete filesystem, we can check the inode number of the root directory “/”. For ext2, ext3, and ext4 filesystems, this number is always 2, so it acts as a strong pointer that we’re indeed running on a real system. We can do that by typing:
$ ls -di /
2 /
For even further confirmation, we can use mount to list all mounted filesystems. Each root directory should have an inode number of 2, indicating consistency with a non-chrooted environment. This method will not detect further virtualization like running on top of QEMU.
5. Conclusion
In this article, we took a look at chroot jails. We discussed how a chroot jail essentially limits a process to seeing only part of the filesystem hierarchy.
Then we discussed how to determine whether a process is running inside a chroot jail. These include checking the root directories, searching inside the /proc directory for clues, or utilizing the inode trick. However, it’s crucial to keep in mind that we can’t be certain whether a process is trapped or not. All we can do is guess based on such heuristics.