Warum hat '/' einen '..'-Eintrag?

81

Das hat mich immer verwirrt. Warum enthält das Stammverzeichnis einen Verweis auf ein übergeordnetes Verzeichnis?

bob @ bob: / $ ls -a
. build home lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old verloren + gefunden proc selinux usr
boot etc lib media root srv var

Ich verstehe, wie Verzeichnisse im Dateisystem verwaltet werden - jedes Verzeichnis hat n + 2 Zeiger auf sich selbst (n = Anzahl der Unterverzeichnisse innerhalb des Verzeichnisses). Eines für jedes unmittelbare Unterverzeichnis, eines für das übergeordnete und eines für sich selbst.

Aber was ist /der Elternteil?

Nathan Osman
quelle

Antworten:

73

/..verweist auf /:

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

Beide haben die gleiche Inode-Nummer, die auf diesem System zufällig 2 ist. (Der genaue Wert spielt keine Rolle.)

Es ist für die Konsistenz getan. Auf diese Weise muss sich kein Code im Kernel befinden, um zu überprüfen, wo er sich gerade befindet, wenn er ..einen Pfad verarbeitet. Man kann es cd ..für immer sagen und niemals tiefer gehen als die Wurzel.

Warren Young
quelle
20
@ George Ich glaube, Exploits, die relative Pfade ausnutzen, nutzen diese; Sie müssen den aktuellen Ordner nicht erraten, Sie müssen ihn nur erraten../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek
21
Welchen Unterschied würde das bei der einfachen Verwendung von / etc / passwd machen?
Juli
9
@jlliagre: Es gibt Programme, die prüfen, ob sich eine Datei im aktuellen Verzeichnis befindet, indem sie prüfen, ob sie mit beginnt /. Zwischen ../(nicht unbedingt am Anfang!) Und symbolischen Links ist es sehr schwierig, dies zu tun, insbesondere wenn der Angreifer möglicherweise Verzeichnisse unter die Nase des Programms verschiebt.
Gilles
4
Ich sehe, sie sollten mindestens canonicalize_file_name oder realpath verwenden.
Juli
5
@musiphil: Es ist eine gute Sache. Michael wies nur darauf hin, dass es eine Funktion ist, die für schlechte Zwecke ausgenutzt werden kann, wenn Code nicht geschrieben wird, um mit dem Exploit fertig zu werden. Wenn wir alle Features entfernen würden, die ausgenutzt werden können, wären Computer sehr langweilig.
Warren Young
38

Es ist da, weil es eine Garantie von Unix ist: Jedes Verzeichnis enthält zwei Einträge, .die auf sich selbst und ..auf das übergeordnete Verzeichnis verweisen.

Das Stammverzeichnis des aktuellen Namespaces ist insofern speziell, ..als es auf dasselbe hinweist ., aber nicht so speziell, um die Garantie des Betriebssystems für Programme zu brechen. Wenn diese Verträge gebrochen sind, läuft alles schief und jeder zeigt mit den Fingern.

Das angezeigte Stammverzeichnis verfügt möglicherweise über ein anderes übergeordnetes Verzeichnis im Dateisystem auf der Festplatte. Die Ansicht der im bereitgestellten Namespace bereitgestellten Dateisysteme erzwingt die .. = .Regel für /. Wenn Sie sich also in einem chroot()Gefängnis befinden, werden Sie sehen /.. = /, obwohl stattdessen jemand außerhalb des Gefängnisses nachsehen /path/to/jail/..wird /path/to.

Phil P
quelle
1
Wie viele Programme hängen von dem "Vertrag" ab, /der ..darauf hinweist? Ich denke, es hätte genauso (oder mehr) akzeptabel sein können, es /NICHT zu haben ...
Musiphil
Hat jemand eine Quelle, die diese Theorie bestätigt?
Julian Hollmann
1
Nun, man 5 dirauf einem BSD-System werden Sie durch die dokumentierte API geführt, und die in der API angegebenen Elemente sind Teil des Vertrags.
Phil P
1
find hat eine Optimierung, die auf dem n + 2-Vertrag beruht.
Strg-Alt-Delor
2
Oh, und natürlich, wenn Sie eine Quelle wollen , lesen Sie einfach die Spezifikation. POSIX unter pubs.opengroup.org/onlinepubs/9699919799 in Abschnitt 4.12: "Der spezielle Dateiname dot bezieht sich auf das von seinem Vorgänger angegebene Verzeichnis. Der spezielle Dateiname dot-dot bezieht sich auf das übergeordnete Verzeichnis seines Vorgängerverzeichnisses. Als Besonderheit In diesem Fall kann sich dot-dot im Stammverzeichnis auf das Stammverzeichnis selbst beziehen. "
Phil P