chroot es una operación para cambiar el directorio raíz en sistemas operativos similares a Unix . Un programa iniciado con un directorio raíz modificado solo tendrá acceso a los archivos contenidos en ese directorio. Por lo tanto, si necesita proporcionar al programa acceso a otros directorios o sistemas de archivos (por ejemplo, /proc), debe premontar los directorios o dispositivos necesarios en el directorio de destino.
El término chroot puede referirse al concepto de cambios en el directorio raíz, a la llamada al sistema chroot(2) o al programa chroot(8) , como suele quedar claro en el contexto.
El cambio del directorio raíz se realiza con la llamada al sistema chroot(2) . Cambiar el directorio raíz afecta solo al proceso actual (es decir, el proceso que realizó la llamada al sistema chroot(2) ) y todos sus descendientes. Si desea ejecutar algún programa con un directorio raíz modificado, pero este programa no proporciona la ejecución de una llamada a chroot(2) , use el programa chroot(8) . Este programa toma como parámetros un nuevo directorio raíz y la ruta al programa. Primero hace una llamada chroot(2) a sí mismo para cambiar su propio directorio raíz al especificado, y luego ejecuta el programa en la ruta especificada. Dado que los procesos secundarios heredan el directorio raíz modificado, el programa se inicia con el directorio raíz modificado.
Un programa cuya raíz se ha movido a un directorio diferente no puede acceder a archivos fuera de ese directorio. Esto proporciona una forma conveniente de realizar pruebas de " sandbox ", no confiables o cualquier otro programa potencialmente dañino. Esta es también una manera fácil de usar el mecanismo de " cárcel ". Sin embargo, la documentación advierte contra dicho uso [1] . Pero la mayoría de las veces , chroot se usa para crear distribuciones o programas individuales en un entorno "limpio", por así decirlo. Véase también arranque .
En la práctica, es difícil hacer chroot en programas que esperan encontrar espacio libre en el disco al inicio, archivos de configuración , archivos de dispositivos y bibliotecas dinámicas en ubicaciones específicas. Para permitir que los programas se ejecuten dentro de un directorio chroot, es necesario proporcionarles un conjunto mínimo de dichos archivos, preferiblemente elegidos cuidadosamente para evitar el acceso no intencional al sistema desde el exterior (por ejemplo, a través de archivos de dispositivo o FIFO ).
Los programas pueden abrir descriptores de archivos (para archivos, canalizaciones y conexiones de red) en un chroot, lo que puede facilitar el encarcelamiento al hacer innecesario almacenar archivos de trabajo dentro de un directorio chroot. También se puede usar como un sistema de capacidad rudimentario en el que un programa tiene acceso explícito a recursos fuera del chroot en función de los descriptores contenidos en él.
Solo el superusuario (root) puede ejecutar la llamada al sistema chroot(2) . Esto es para evitar un ataque por parte de un usuario colocando un programa setuid dentro de una cárcel chroot especialmente diseñada (por ejemplo, con un archivo /etc/passwd falso ), lo que le otorgará una escalada de privilegios.
Por sí mismo, el mecanismo chroot no es completamente seguro. Si un programa que se ejecuta en un chroot tiene privilegios de root, puede ejecutar un segundo chroot para salir. Esto funciona porque algunos kernels de Unix no permiten el anidamiento adecuado de contextos chroot.
La mayoría de los sistemas Unix no están completamente orientados al sistema de archivos y dejan funciones potencialmente destructivas, como redes y control de procesos, disponibles a través de una interfaz de llamada del sistema a un programa en el chroot.
El mecanismo chroot en sí mismo no sabe cómo hacer cumplir los límites de recursos, como el ancho de banda de E/S, el espacio en disco o el tiempo de CPU.