Esto siempre me ha confundido. ¿Por qué el directorio raíz contiene una referencia a un directorio padre?
bob @ bob: / $ ls -a . construir casa lib32 mnt .rpmdb sys vmlinuz .. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old bin dev initrd.img.old perdido + encontrado proc selinux usr boot etc lib media root srv var
Entiendo cómo se administran los directorios en el sistema de archivos: cada directorio tiene n + 2 punteros para sí mismo (n = número de subdirectorios dentro del directorio). Uno para cada subdirectorio inmediato, uno para su padre y otro para sí mismo.
Pero, ¿cuál es /
el padre?
filesystems
directory
directory-structure
Nathan Osman
fuente
fuente
../../../../../../../../../../../../../../../../etc/passwd
/
. Entre../
(¡no necesariamente al principio!) Y enlaces simbólicos, es muy difícil de hacer, especialmente teniendo en cuenta que el atacante puede estar moviendo directorios bajo la nariz del programa.Está ahí porque es una garantía hecha por Unix: cada directorio contiene dos entradas,
.
que se refiere a sí mismo y..
que se refiere al padre.El directorio raíz del espacio de nombres actual es especial, ya que
..
apunta a lo mismo.
, pero no es tan especial para romper la garantía hecha por el sistema operativo a los programas. Cuando se rompen esos contratos, las cosas salen mal y todos señalan con el dedo.El directorio raíz que ve podría, en el sistema de archivos en el disco, tener un directorio padre diferente. La vista de los sistemas de archivos proporcionados en el espacio de nombres montado es lo que hace cumplir la
.. = .
regla/
. Entonces, si estás en unachroot()
cárcel, verás/.. = /
a pesar de que alguien fuera de la cárcel que mira/path/to/jail/..
, verá en su/path/to
lugar.fuente
/
tiene..
ese punto en sí mismo? Creo que podría haber sido igualmente (o más) aceptable para/
NO tener..
.man 5 dir
en un sistema BSD lo guiará a través de la API documentada, y los elementos establecidos en la API son parte del contrato.