Apa yang saya lakukan di sini adalah untuk menguji apakah root dari init
proses (PID 1) sama dengan root dari proses saat ini. Meskipun /proc/1/root
selalu merupakan tautan ke /
(kecuali init
dirinya chroot, tapi itu bukan masalah yang saya pedulikan), setelah itu mengarah ke direktori root "master". Teknik ini digunakan dalam beberapa skrip pemeliharaan di Debian, misalnya untuk melewatkan memulai udev setelah instalasi di chroot.
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(Omong-omong, ini adalah contoh lain mengapa chroot
tidak berguna untuk keamanan jika proses chroot memiliki akses root. Proses non-root tidak dapat membaca /proc/1/root
, tetapi mereka dapat mengikuti /proc/1234/root
jika ada proses yang berjalan dengan PID 1234 berjalan sebagai sama pengguna.)
Jika Anda tidak memiliki izin root, Anda dapat melihat /proc/1/mountinfo
dan /proc/$$/mountinfo
(secara singkat didokumentasikan dalam filesystems/proc.txt
dokumentasi kernel Linux ). File ini dapat dibaca dunia dan berisi banyak informasi tentang setiap titik pemasangan dalam pandangan proses sistem file. Jalur dalam file tersebut dibatasi oleh chroot yang memengaruhi proses pembaca, jika ada. Jika proses membaca /proc/1/mountinfo
chroot ke sistem file yang berbeda dari root global (dengan asumsi root pid 1 adalah root global), maka tidak ada entri untuk /
muncul di /proc/1/mountinfo
. Jika pembacaan proses /proc/1/mountinfo
dilakukan chroot ke direktori pada sistem file root global, maka entri untuk /
muncul /proc/1/mountinfo
, tetapi dengan id mount berbeda. Kebetulan, bidang root ($4
) menunjukkan di mana chroot berada di sistem file induknya.
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
Ini adalah solusi Linux murni. Ini dapat digeneralisasikan untuk varian Unix lain dengan cukup mirip /proc
(Solaris memiliki yang serupa /proc/1/root
, saya pikir, tetapi tidak mountinfo
).