สิ่งที่ฉันทำที่นี่คือการทดสอบว่ารากของinit
กระบวนการ (PID 1) เหมือนกับรากของกระบวนการปัจจุบันหรือไม่ แม้ว่า/proc/1/root
จะเป็นลิงก์ไปยัง/
(เว้นแต่init
ตัวเองจะถูก chrooted แต่ไม่ใช่กรณีที่ฉันสนใจ) หลังจากนั้นมันจะนำไปสู่ไดเรกทอรีราก "หลัก" เทคนิคนี้ใช้ในสคริปต์บำรุงรักษาสองสามตัวใน Debian เช่นข้ามการเริ่มต้น udev หลังจากติดตั้งใน chroot
if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
echo "We are chrooted!"
else
echo "Business as usual"
fi
(โดยวิธีนี้เป็นอีกตัวอย่างหนึ่งของเหตุผลที่อื่นchroot
เป็นประโยชน์สำหรับการรักษาความปลอดภัยถ้ากระบวนการ chrooted มีการเข้าถึงราก. กระบวนการที่ไม่ใช่รากไม่สามารถอ่าน/proc/1/root
แต่พวกเขาสามารถทำตาม/proc/1234/root
ถ้ามีกระบวนการทำงานด้วย PID 1234 ทำงานตามที่เดียวกัน ผู้ใช้.)
หากคุณไม่มีสิทธิ์รูทคุณสามารถดู/proc/1/mountinfo
และ/proc/$$/mountinfo
(จัดทำเอกสารสั้น ๆ ในfilesystems/proc.txt
เอกสารประกอบเคอร์เนล Linux ) ไฟล์นี้สามารถอ่านได้ทั่วโลกและมีข้อมูลจำนวนมากเกี่ยวกับจุดเชื่อมต่อแต่ละจุดในมุมมองของกระบวนการของระบบไฟล์ พา ธ ในไฟล์นั้นถูก จำกัด โดย chroot ที่มีผลต่อกระบวนการของผู้อ่านหากมี ถ้าอ่านกระบวนการ/proc/1/mountinfo
เป็น chrooted เข้าสู่ระบบแฟ้มที่แตกต่างจากรากทั่วโลก (สมมติว่าราก pid 1 เป็นรากที่ทั่วโลก) แล้วเข้าไม่ปรากฏใน/
/proc/1/mountinfo
หากการอ่านกระบวนการ/proc/1/mountinfo
ถูก chrooted ไปยังไดเร็กทอรีบนระบบไฟล์โกลบอลรูทแล้วรายการสำหรับ/
จะปรากฏขึ้น/proc/1/mountinfo
แต่มีเมาต์ id ต่างกัน อนึ่งฟิลด์รูต ($4
) ระบุตำแหน่งที่ chroot อยู่ในระบบไฟล์หลัก
[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]
นี่เป็นโซลูชัน Linux ที่แท้จริง มันอาจจะเป็น generalizable สำหรับตัวแปร Unix อื่น ๆ ที่มีความคล้ายคลึงกันพอสมควร/proc
(Solaris มีความคล้ายคลึงกัน/proc/1/root
ฉันคิดว่า แต่ไม่ใช่mountinfo
)