To, co zrobiłem tutaj, to sprawdzenie, czy podstawa init
procesu (PID 1) jest taka sama jak podstawa bieżącego procesu. Chociaż /proc/1/root
zawsze jest to link do /
(chyba że init
sam jest chrootowany, ale nie jest to przypadek, na którym mi zależy), podążanie za nim prowadzi do głównego katalogu głównego. Ta technika jest używana w kilku skryptach konserwacyjnych w Debianie, na przykład, aby pominąć uruchamianie udev po instalacji w chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Nawiasem mówiąc, jest to kolejny przykład, dlaczego chroot
jest bezużyteczny dla bezpieczeństwa, jeśli proces chrootowany ma dostęp do roota. Procesy inne niż root nie mogą czytać /proc/1/root
, ale mogą śledzić, /proc/1234/root
jeśli istnieje uruchomiony proces z PID 1234 działającym tak samo użytkownik.)
Jeśli nie masz uprawnień roota, możesz przejrzeć /proc/1/mountinfo
i /proc/$$/mountinfo
(krótko udokumentowane w filesystems/proc.txt
dokumentacji jądra Linuksa ). Ten plik jest czytelny dla całego świata i zawiera wiele informacji o każdym punkcie montowania w widoku systemu plików procesu. Ścieżki w tym pliku są ograniczone przez chroot wpływający na proces czytnika, jeśli taki istnieje. Jeśli odczyt procesu /proc/1/mountinfo
jest chrootowany do systemu plików innego niż globalny katalog główny (przy założeniu, że katalog główny pid 1 jest globalnym katalogiem głównym), wówczas w polu nie /
pojawia się wpis /proc/1/mountinfo
. Jeśli odczyt procesu /proc/1/mountinfo
jest chrootowany do katalogu w globalnym systemie plików root, wtedy wpis dla /
pojawia się w /proc/1/mountinfo
, ale z innym identyfikatorem montowania. Nawiasem mówiąc, pole główne ($4
) wskazuje, gdzie chroot znajduje się w głównym systemie plików.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
To jest czysto rozwiązanie Linux. Może być generalizowalny do innych wariantów Uniksa z wystarczająco podobnymi /proc
(Solaris ma podobne /proc/1/root
, myślę, ale nie mountinfo
).