Ich habe hier getestet, ob die Wurzel des init
Prozesses (PID 1) mit der Wurzel des aktuellen Prozesses identisch ist. Obwohl /proc/1/root
es sich immer um einen Link handelt /
(es sei denn, er init
selbst ist chrooted, aber das interessiert mich nicht), führt das Befolgen dieses Links zum Stammverzeichnis „master“. Diese Technik wird in einigen Wartungsskripten in Debian verwendet, um beispielsweise das Starten von udev nach der Installation in einer Chroot zu überspringen.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Übrigens ist dies ein weiteres Beispiel dafür, warum die chroot
Sicherheit unbrauchbar ist, wenn der Chroot-Prozess über Root-Zugriff verfügt. Nicht-Root-Prozesse können nicht lesen /proc/1/root
, aber sie können folgen, /proc/1234/root
wenn ein Prozess mit der gleichen PID 1234 ausgeführt wird Benutzer.)
Wenn Sie nicht über Root-Berechtigungen verfügen, können Sie nachsehen /proc/1/mountinfo
und /proc/$$/mountinfo
( filesystems/proc.txt
in der Dokumentation zum Linux-Kernel kurz dokumentiert ). Diese Datei ist weltweit lesbar und enthält viele Informationen zu jedem Einhängepunkt in der Prozessansicht des Dateisystems. Die Pfade in dieser Datei werden durch die Chroot eingeschränkt, die sich gegebenenfalls auf den Leseprozess auswirkt. Wenn der Prozesslesevorgang /proc/1/mountinfo
in ein Dateisystem verschoben wird, das sich vom globalen Stamm unterscheidet (vorausgesetzt, der Stamm von PID 1 ist der globale Stamm), wird in kein Eintrag für /
angezeigt /proc/1/mountinfo
. Wenn die Prozesslesung /proc/1/mountinfo
in ein Verzeichnis im globalen Root-Dateisystem verschoben wird, wird ein Eintrag für in /
angezeigt /proc/1/mountinfo
, jedoch mit einer anderen Mount-ID. Übrigens ist das Wurzelfeld ($4
) gibt an, wo sich die Chroot in ihrem Master-Dateisystem befindet.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Dies ist eine reine Linux-Lösung. Es ist möglicherweise verallgemeinerbar auf andere Unix-Varianten mit einer hinreichend ähnlichen /proc
(Solaris hat eine ähnliche /proc/1/root
, denke ich, aber nicht mountinfo
).