Perché '/' ha una voce '..'?


81

Questo mi ha sempre confuso. Perché la directory principale contiene un riferimento a una directory principale?

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 lost + found proc selinux usr
boot etc lib media root srv var

Capisco come sono gestite le directory nel filesystem - ogni directory ha n + 2 puntatori a se stessa (n = numero di sottodirectory all'interno della directory). Uno per ogni sottodirectory immediata, uno per il suo genitore e uno per se stesso.

Ma cos'è /il genitore?

Risposte:


73

/..indica /:

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

Entrambi hanno lo stesso numero di inode, che risulta essere 2 su questo sistema. (Il valore esatto non ha importanza.)

È fatto per coerenza. In questo modo, non ci deve essere codice nel kernel per verificare dove si trova attualmente quando elabora un ..in un percorso. Puoi dire cd ..per sempre e non andare mai più in profondità della radice.


20
@George Credo che gli exploit che sfruttano i percorsi relativi lo utilizzino; non devi indovinare la cartella attuale, lo fai e basta../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
Che differenza farebbe semplicemente usando / etc / passwd?
jlliagre,

9
@jlliagre: esistono programmi che controllano se un file si trova nella directory corrente verificando se inizia con /. Tra ../collegamenti (non necessariamente all'inizio!) E collegamenti simbolici, è molto difficile da fare, soprattutto considerando che l'attaccante potrebbe spostare le directory sotto il naso del programma.
Gilles,

4
Vedo, dovrebbero almeno usare canonicalize_file_name o realpath.
jlliagre,

5
@musiphil: è una buona cosa. Michael stava solo sottolineando che è una funzionalità che può essere sfruttata per fini negativi, se il codice non è scritto per far fronte all'exploit. Se ci liberassimo di tutte le funzionalità che possono essere sfruttate, i computer sarebbero cose molto noiose.
Warren Young,

38

È lì perché è una garanzia fatta da Unix: ogni directory contiene due voci, .che fa riferimento a se stessa e ..che fa riferimento al genitore.

La directory principale dell'attuale spazio dei nomi è speciale, in quanto ..punta alla stessa cosa di ., ma non così speciale da rompere la garanzia fornita dal sistema operativo ai programmi. Quando quei contratti vengono infranti, le cose vanno male e tutti puntano il dito.

La directory principale che vedi potrebbe, nel filesystem su disco, in realtà avere una directory padre diversa. La vista dei filesystem forniti nello spazio dei nomi montato è ciò che impone la .. = .regola /. Quindi, se ti trovi in ​​una chroot()prigione, vedrai /.. = /anche se qualcuno al di fuori della prigione che sta guardando /path/to/jail/..vedrà /path/toinvece.


1
Quanti programmi dipendono dal "contratto" che /ha ..questo punto su se stesso? Penso che avrebbe potuto essere ugualmente (o più) accettabile per /NON averlo ...
musiphil,

Qualcuno ha una fonte che conferma questa teoria?
Julian Hollmann,

1
Bene, man 5 dirsu un sistema BSD ti guiderà attraverso l'API documentata e gli elementi dichiarati nell'API fanno parte del contratto.
Phil P

1
find ha un'ottimizzazione che si basa sul contratto n + 2.
ctrl-alt-delor,

2
Oh, e ovviamente se vuoi una fonte allora vai a leggere le specifiche. POSIX su pubs.opengroup.org/onlinepubs/9699919799 nella sezione 4.12: "Il punto nome file speciale deve fare riferimento alla directory specificata dal suo predecessore. Il punto nome punto speciale deve fare riferimento alla directory padre della directory precedente. Come uno speciale caso, nella directory principale, punto-punto può fare riferimento alla directory principale stessa. "
Phil P,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.