ทำไม '/' มีรายการ '.. '


81

นี่ทำให้ฉันงงอยู่เสมอ เหตุใดไดเรกทอรีรากจึงมีการอ้างอิงถึงไดเรกทอรีหลัก

bob @ bob: / $ ls -a
. สร้างบ้าน lib32 mnt. รอบต่อนาที sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old เสีย + พบ proc selinux usr
boot etc lib สื่อรูท srv var

ฉันเข้าใจวิธีจัดการไดเรกทอรีในระบบแฟ้ม - แต่ละไดเรกทอรีมีตัวชี้ n + 2 ให้ตัวเอง (n = จำนวนไดเรกทอรีย่อยภายในไดเรกทอรี) หนึ่งสำหรับแต่ละไดเรกทอรีย่อยทันทีหนึ่งสำหรับผู้ปกครองของมันและหนึ่งสำหรับตัวเอง

แต่/พ่อแม่คืออะไร

คำตอบ:


73

/..ชี้ไปที่/:

$ ls -id /
2 /
$ ls -id /..
2 /..

ทั้งสองมีหมายเลขไอโหนดเดียวกันซึ่งเกิดขึ้นเป็น 2 ในระบบนี้ (ค่าที่แน่นอนไม่สำคัญ)

มันทำเพื่อความมั่นคง ด้วยวิธีนี้ไม่จำเป็นต้องมีรหัสในเคอร์เนลเพื่อตรวจสอบว่ามันอยู่ที่ไหนในขณะที่มันประมวลผล..ในเส้นทาง คุณสามารถพูดได้cd ..ตลอดไปและไม่เคยลงลึกไปกว่ารูท


20
@ George ฉันเชื่อว่าการหาประโยชน์ที่ใช้ประโยชน์จากเส้นทางญาติใช้สิ่งนั้น คุณไม่ต้องเดาโฟลเดอร์ปัจจุบันคุณทำได้../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
สิ่งใดที่ทำให้แตกต่างเพียงแค่ใช้ / etc / passwd
jlliagre

9
@jlliagre: มีโปรแกรมที่ตรวจสอบว่าไฟล์อยู่ภายใต้ไดเรกทอรีปัจจุบันหรือไม่โดยทดสอบว่าเริ่มต้นด้วย/หรือไม่ ระหว่าง../(ไม่จำเป็นต้องเริ่มต้น!) และลิงก์สัญลักษณ์มันยากมากที่จะทำโดยเฉพาะการพิจารณาว่าผู้โจมตีอาจย้ายไดเรกทอรีภายใต้จมูกของโปรแกรม
Gilles

4
ฉันเห็นพวกเขาอย่างน้อยควรใช้ canonicalize_file_name หรือ realpath
jlliagre

5
@musiphil: มันเป็นสิ่งที่ดี Michael เป็นเพียงการชี้ให้เห็นว่ามันเป็นคุณสมบัติที่สามารถใช้ประโยชน์จากจุดจบที่ไม่ดีได้หากโค้ดไม่ได้ถูกเขียนขึ้นเพื่อรับมือกับการหาประโยชน์ หากเรากำจัดคุณสมบัติทั้งหมดที่สามารถใช้ประโยชน์ได้คอมพิวเตอร์จะเป็นสิ่งที่น่าเบื่อมาก
Warren Young

38

มันอยู่ที่นั่นเพราะมันรับประกันโดย Unix: ทุกไดเรกทอรีมีสองรายการ.ซึ่งอ้างถึงตัวเองและ..ที่อ้างถึงผู้ปกครอง

ไดเร็กทอรีรูทของเนมสเปซปัจจุบันเป็นพิเศษซึ่ง..จะชี้ไปที่สิ่งเดียวกันกับ.แต่ไม่พิเศษเพื่อแยกการรับประกันที่ทำโดยระบบปฏิบัติการไปยังโปรแกรม เมื่อสัญญาเหล่านั้นแตกสิ่งต่าง ๆ จะผิดพลาดและทุกคนก็ชี้นิ้ว

ไดเรกทอรีรากที่คุณเห็นอาจในระบบแฟ้มบนดิสก์มีไดเรกทอรีหลักที่แตกต่างกัน มุมมองของระบบไฟล์ที่มีให้บริการใน namespace ติดเป็นสิ่งที่บังคับใช้กฎ.. = . /ดังนั้นถ้าคุณอยู่ในchroot()คุกคุณจะเห็น/.. = /ว่ามีใครบางคนที่อยู่นอกคุกกำลังมองหาที่/path/to/jail/..จะเห็น/path/toแทน


1
กี่โปรแกรมขึ้นอยู่กับ "สัญญา" ที่/มี..จุดที่ตัวเอง? ฉันคิดว่ามันจะได้รับอย่างเท่าเทียมกัน (หรือมากกว่า) ที่ยอมรับสำหรับการไม่ให้มี/ ..
musiphil

ไม่มีใครมีแหล่งที่มาซึ่งยืนยันทฤษฎีนี้หรือไม่?
Julian Hollmann

1
ดีman 5 dirในระบบ BSD จะเดินคุณผ่าน API เอกสารและรายการที่ระบุไว้ใน API เป็นส่วนหนึ่งของสัญญา
Phil P

1
find มีการเพิ่มประสิทธิภาพที่อาศัยสัญญา n + 2
ctrl-alt-delor

2
โอ้และแน่นอนถ้าคุณต้องการแหล่งที่มาจากนั้นก็ไปอ่านสเปค POSIX ที่pubs.opengroup.org/onlinepubs/9699919799 ในส่วน 4.12: "จุดชื่อไฟล์พิเศษจะอ้างถึงไดเรกทอรีที่ระบุโดยรุ่นก่อนชื่อไฟล์จุดพิเศษจะอ้างถึงไดเรกทอรีหลักของไดเรกทอรีรุ่นก่อนเป็นพิเศษ ตัวพิมพ์เล็กในไดเรกทอรีรูทจุดอาจอ้างถึงไดเรกทอรีรากเอง "
Phil P
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.