Lo que he hecho aquí es probar si la raíz del init
proceso (PID 1) es la misma que la raíz del proceso actual. Aunque /proc/1/root
siempre es un enlace a /
(a menos que esté en init
sí, pero ese no es un caso que me interese), seguirlo lleva al directorio raíz "maestro". Esta técnica se utiliza en algunos scripts de mantenimiento en Debian, por ejemplo, para omitir el inicio de udev después de la instalación en un chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Por cierto, este es otro ejemplo de por qué chroot
es inútil para la seguridad si el proceso chrooteado tiene acceso a la raíz. Los procesos no root no pueden leer /proc/1/root
, pero pueden seguir /proc/1234/root
si hay un proceso en ejecución con PID 1234 ejecutándose igual) usuario.)
Si no tiene permisos de root, puede ver /proc/1/mountinfo
y /proc/$$/mountinfo
(brevemente documentado filesystems/proc.txt
en la documentación del kernel de Linux ). Este archivo es legible en todo el mundo y contiene mucha información sobre cada punto de montaje en la vista del proceso del sistema de archivos. Las rutas en ese archivo están restringidas por el chroot que afecta el proceso del lector, si lo hay. Si la lectura del proceso /proc/1/mountinfo
se procesa en un sistema de archivos que es diferente de la raíz global (suponiendo que la raíz de pid 1 sea la raíz global), no /
aparece ninguna entrada para /proc/1/mountinfo
. Si la lectura del proceso /proc/1/mountinfo
se cambia a un directorio en el sistema de archivos raíz global, entonces /
aparece una entrada para /proc/1/mountinfo
, pero con un ID de montaje diferente. Por cierto, el campo raíz ($4
) indica dónde está el chroot en su sistema de archivos maestro.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Esta es una solución pura de Linux. Puede ser generalizable a otras variantes de Unix con una suficientemente similar /proc
(Solaris tiene una similar /proc/1/root
, creo, pero no mountinfo
).