Mengapa '/' memiliki entri '..'?

81

Ini selalu membingungkan saya. Mengapa direktori root berisi referensi ke direktori induk?

bob @ bob: / $ ls -a
. membangun rumah lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old hilang + ditemukan proc selinux usr
boot dll lib media root srv var

Saya mengerti bagaimana direktori dikelola dalam sistem file - setiap direktori memiliki n + 2 pointer ke dirinya sendiri (n = jumlah subdirektori di dalam direktori). Satu untuk setiap subdirektori langsung, satu untuk orang tuanya, dan satu untuk dirinya sendiri.

Tapi apa /itu orangtua?

Nathan Osman
sumber

Jawaban:

73

/..menunjuk ke /:

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

Keduanya memiliki nomor inode yang sama, yang kebetulan 2 pada sistem ini. (Nilai pastinya tidak masalah.)

Itu dilakukan untuk konsistensi. Dengan cara ini, tidak perlu ada kode di kernel untuk memeriksa di mana ia saat ini ketika memproses ..sebuah path. Anda bisa mengatakan cd ..selamanya, dan tidak pernah pergi lebih dalam dari root.

Warren Young
sumber
20
@ George Saya percaya eksploit yang memanfaatkan jalur relatif menggunakannya; Anda tidak perlu menebak folder saat ini, cukup lakukan../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek
21
Apa bedanya dengan menggunakan / etc / passwd?
jlliagre
9
@ jlliagre: Ada program yang memeriksa apakah suatu file berada di bawah direktori saat ini dengan menguji apakah itu dimulai dengan /. Antara ../(tidak harus di awal!) Dan tautan simbolis, sangat sulit dilakukan, terutama mengingat penyerang mungkin memindahkan direktori di bawah hidung program.
Gilles
4
Begitu ya, mereka setidaknya harus menggunakan canonicalize_file_name atau realpath.
jlliagre
5
@musiphil: Ini hal yang baik. Michael baru saja menunjukkan bahwa itu adalah fitur yang dapat dieksploitasi untuk tujuan buruk, jika kode tidak ditulis untuk mengatasi eksploitasi. Jika kita menyingkirkan semua fitur yang dapat dieksploitasi, komputer akan menjadi hal yang sangat membosankan.
Warren Young
38

Itu ada di sana karena itu adalah jaminan yang dibuat oleh Unix: setiap direktori berisi dua entri, .yang merujuk pada dirinya sendiri, dan ..yang mengacu pada induknya.

Direktori root namespace saat ini adalah spesial, dalam hal ..menunjuk ke hal yang sama seperti ., tetapi tidak begitu istimewa untuk memutus jaminan yang dibuat oleh OS untuk program. Ketika kontrak itu rusak, semuanya salah dan semua orang menunjuk.

Direktori root yang Anda lihat mungkin, dalam sistem file pada disk, sebenarnya memiliki direktori induk yang berbeda. Pandangan dari filesystem yang disediakan di namespace yang di-mount adalah apa yang menegakkan .. = .aturan /. Jadi jika Anda berada di chroot()penjara, Anda akan melihat /.. = /meskipun seseorang di luar penjara yang melihatnya /path/to/jail/..akan melihat /path/to.

Phil P
sumber
1
Berapa banyak program bergantung pada "kontrak" yang /memiliki ..yang menunjuk ke dirinya sendiri? Saya pikir itu bisa sama (atau lebih) dapat diterima untuk /TIDAK dimiliki ...
musiphil
Adakah yang punya sumber yang mengkonfirmasi teori ini?
Julian Hollmann
1
Nah, man 5 dirpada sistem BSD akan memandu Anda melalui API terdokumentasi, dan barang-barang yang dinyatakan dalam API adalah bagian dari kontrak.
Phil P
1
find memiliki pengoptimalan yang bergantung pada kontrak n + 2.
ctrl-alt-delor
2
Oh, dan tentu saja jika Anda menginginkan sumber maka baca saja spesifikasinya. POSIX di pubs.opengroup.org/onlinepubs/9699919799 pada bagian 4.12: "Titik nama file khusus harus merujuk ke direktori yang ditentukan oleh pendahulunya. Nama file dot-dot khusus akan merujuk ke direktori induk dari direktori pendahulunya. Sebagai khusus kasus, di direktori root, dot-dot dapat merujuk ke direktori root itu sendiri. "
Phil P