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?
quelle
../../../../../../../../../../../../../../../../etc/passwd
/
. 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.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 einemchroot()
Gefängnis befinden, werden Sie sehen/.. = /
, obwohl stattdessen jemand außerhalb des Gefängnisses nachsehen/path/to/jail/..
wird/path/to
.quelle
/
der..
darauf hinweist? Ich denke, es hätte genauso (oder mehr) akzeptabel sein können, es/
NICHT zu haben..
.man 5 dir
auf einem BSD-System werden Sie durch die dokumentierte API geführt, und die in der API angegebenen Elemente sind Teil des Vertrags.