Sul mio computer Windows, avevo una cartella con un nome di quattro punti che fungeva da una specie di tana di coniglio: come è potuto succedere?


198

Il nome della cartella era elencato in Esplora file con solo quattro punti .....

Quando ho provato ad aprirlo, sono entrato in una sorta di loop infinito di buchi di coniglio in cui ho aperto la stessa cartella ancora e ancora - potevo farlo all'infinito. Mostrando il percorso come C:\ExamplePath\....\....\....\....\...., ecc.

Stava appendendo la mia compilazione TypeScript in un progetto specifico. Mi ci è voluto più di un anno prima di trovare questa cartella e i relativi problemi, perché era profondamente radicata nelle cartelle nidificate. Non mi sarei mai aspettato un problema come questo, quindi non l'ho mai cercato.

Non è stato possibile eliminare la cartella in modo normale a causa del nome speciale. Alla fine, ho potuto rimuoverlo utilizzando la riga di comando ed eliminando la cartella principale con rd /s /q path.

Successivamente, ho provato a creare nuovamente la cartella ma non sono riuscito a farlo sia con Esplora file che con la riga di comando.

Nei miei oltre 20 anni di utilizzo di Windows non ho mai visto questo bug prima, quindi posso immaginare che sarebbe davvero un problema fastidioso e confuso per gli utenti amatoriali.

Qualcuno sa come sia potuto succedere e come riprodurre questo problema?

Aggiornare

Per le persone interessate: questo percorso si trovava in profondità all'interno di una cartella TFS. Quindi probabilmente TFS usa il metodo di bypass spiegato @grawity ( "Vari file manager, archiviatori, ecc." )

Mi sono imbattuto in un raro bug TFS?


5
Le risposte seguenti descrivono in dettaglio cosa sta succedendo, come riprodurlo intenzionalmente e come risolverlo, ma non menzionano il motivo per cui è successo. Dato che ..può essere usato in un percorso per indicare "vai su una cartella", rischierei di indovinare che da qualche parte lungo la linea, qualche programma o script ha concatenato due stringhe per creare un percorso, uno si è concluso con ..e il successivo è iniziato con .., e poiché utilizzava una delle tecniche menzionate di seguito, riuscì a creare il percorso, anche se mancava il separatore di cartelle tra di loro.
3D1T0R

6
succederanno cose strane anche se crei una cartella con solo spazi nel suo nome
phuclv

7
Questo server è su Internet? Giusto per mettere in guardia ti vedo regolarmente tentativi di hack su internet si affacciano server web che richiedono: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Chiaramente c'è / c'era qualche vulnerabilità da qualche parte che questo tenta di sfruttare.
Andy Brown,

4
@AndyBrown molto più probabilmente .., no ..... È semplicemente un modo per attraversare \winntindipendentemente dalla profondità del punto iniziale (la radice del web), purché il punto iniziale sia inferiore a 9 livelli. Si basa sul fatto che passare ..dalla directory principale ti lascia alla directory principale.
Hobbs

5
@hobbs Questa è una copia e incolla dal registro di accesso di Apache su Linux. Sicuramente 4 punti lì dentro. Ci sono altri tentativi di hack registrati che fanno uso ..che è stato il motivo per cui ho trovato questo piuttosto strano.
Andy Brown,

Risposte:


303

Win32 non ti consente di creare file o cartelle con nomi che finiscono in .- tutti i punti vengono rimossi dalla fine. Il tentativo di creare test.fa testapparire invece. (Questo è per compatibilità con i nomi 8.3 nel vecchio software dell'era DOS / Win9x.)

Di conseguenza, ogni volta che si tenta di accedere a una cartella denominata ...., il suo nome viene ridotto alla stringa vuota e si torna alla cartella in cui ci si trovava prima.

Il kernel NT, tuttavia, consente tali nomi. Esistono vari meccanismi che aggirano le limitazioni del nome file imposte dalle API di Win32, ad esempio WSL (sottosistema Windows per Linux) non funziona su Win32 e non ne è interessato. C'è anche il \\?\metodo di bypass, una "backdoor" intenzionale lasciata aperta per i programmi che sanno cosa stanno facendo. Anche se non puoi creare C:\Example\....\, puoi creare \\?\C:\Example\....\semplicemente bene.

Allo stesso modo è possibile eliminare tali directory con rmdir \\?\C:\path\...da Cmd (non ho ancora testato con PowerShell).

Vari gestori di file, archivi, ecc. Potrebbero usare il \\?\metodo per poter usare nomi di percorso più lunghi del solito - e così facendo, non sono interessati dal codice di compatibilità all'interno di Win32; bypassano il dot stripping e la traduzione di nomi di file magici come CONo NUL.

Quindi potrebbe essere uno dei tuoi programmi:

  1. usa sempre \\?\per accedere ai file,
  2. ....ho tentato accidentalmente di creare una cartella denominata , ma non è possibile saperlo con certezza dopo il fatto.

13
un altro modo per creare una tale cartella è utilizzando flussi di dati alternativi. Sul cmd: echo "" > ....::$INDEX_ALLOCATION. Questo creerà una cartella denominata ....(che punta ancora alla cartella corrente).
WorldSEnder,


124
Microsoft lo chiama "Prefisso percorso esteso" e i percorsi con quel prefisso vengono chiamati "percorsi di lunghezza estesa". (divertente: quando si cerca nell'origine di riferimento\\?\" .NET , si verifica un errore di runtime sul loro server).
dlatikay,

2
@grawity So. . . come devo fare per eliminare questa cartella ora?
Shadow503

21
Ho avuto un curioso caso client di "riparazione computer" in cui ogni volta che il client creava un account su qualsiasi macchina Windows, avrebbe funzionato bene ma una volta effettuato il login / riavvio non gli avrebbe permesso di accedere al suo account, invece di creare un account temporaneo per il sessione. L'officina locale per la riparazione di pc era sconcertata (lo caricava ancora). Si scopre che il suo vero nome è Con e ha sempre usato il suo nome per il suo account di Windows ..... quel giorno ho imparato che c'era qualcosa di più che un semplice com1nome di file magico
RozzA

23

Oltre alla risposta di @ grawity, un programma Win32 può anche farlo chiamando direttamente l'API "nativa". Se non sbaglio, nella fattispecie, sarebbe NtCreateDirectoryObject. Queste chiamate sono abbastanza ben documentate al giorno d'oggi, in particolare la loro controparte del kernel (che non è possibile chiamare da un programma Win32), in questo caso, ZwCreateDirectoryObject.

Per quanto riguarda la "profondità infinita", un modo semplice per raggiungere questo obiettivo è utilizzare i collegamenti. Crea una directory, quindi al suo interno, crea una giunzione (puoi usarla mklink /jper esempio) e finirai con una struttura molto profonda. L'ultima volta che l'ho fatto è stato su Windows 2000, però c'è stata la fine della ricorsione (non si poteva "scavare all'infinito"). Forse su un nuovo sistema operativo il limite è più grande o rimosso, inoltre potresti creare diciamo 10 directory ognuna delle quali figlio della precedente, e nella decima, creare un collegamento alla prima.


4
È molto probabilmente un genio malvagio proprio lì ...
Agi Hammerthief,

1
Ho copiato directory complete in modo simile per riempire artificialmente il disco per testare in grado di determinare quando era vicino ad un limite impostato.
mickeyf,

È anche possibile riprodurre utilizzando Cygwin'smkdir ....
lucidbrot,

18

C'è un modo più semplice per creare la directory. Dal prompt dei comandi digitare:

MD ....\

e premi invio, creerà una directory con quattro punti. Questa directory è anche visualizzabile con explorer.

C'è un difetto in MS-DOS che risale alla versione 1.0. MS lo sa da tempo ma non potrebbe o non vorrebbe risolverlo. Hanno corretto il problema con PowerShell.

A proposito, se provi:

RD ....

Non verrà eliminato. È necessario utilizzare questa sintassi specifica per rimuoverlo.

RD ....\

Lo uso su alcuni server che gestisco. Creo spesso una cartella utente sulla radice del disco e non desidero che un altro amministratore si presenti e lo rimuova.

Quindi andrò nella mia cartella e creerò una sottocartella denominata CON, AUX o LPT, ecc ...

Se un altro amministratore desidera rimuovere la mia cartella, deve prima sapere come rimuovere questa sottocartella.

EDIT: stavo pensando a questa discussione questa mattina e ho deciso di fare un ulteriore passo avanti. Presumo che le mod decideranno se questo è rilevante.

Non riesco a collegarmi alla cartella.

Considera, se MD c: \ test quindi CD C: \ test e MD .... \ finisco con C: \ test ....

e tutto va bene.

Ma il CD .... fallisce e mi riporta a C: \ test. (CD .... \ fa lo stesso.)

Comunque posso DIR .... e ottenere un elenco dir. posso anche

MD C: \ test .... \ temp e crea quella sottodirectory in ....

Posso anche CD C: \ test .... \ temp e andare in quella sottodirectory.

Ma mentre mi trovo in C: \ test .... \ temp, se CD ... Sono tornato in C: \ test.

Non riesco a inserire cd in quella directory, ma posso manipolare la cartella creando sottocartelle e qualcosa di abbastanza interessante

"Test" ECHO >> C: \ test .... \ test.txt

funziona anche e crea un file in quella cartella. Quindi posso creare una cartella con quattro punti, posso aggiungere file e cartelle, posso ottenere elenchi dir di essa, ma non riesco a farci CD. Potrebbe esserci un qualche tipo di genio malvagio per questo? Mi scuso con le mod se mi sono allontanato troppo dalla rotta.


6
Sembra piuttosto un difetto dell'API Win32, dato che il prompt dei comandi non è più "MS-DOS" ormai da circa vent'anni.
Grawity

2
È interessante notare che se provo a eliminare la directory in Windows Explorer, si blocca quando l'ho creata con la tua versione. Quando l'ho creato con Cygwin, fallisce semplicemente e lo dice.
lucidbrot,

Ho un DOS 3.3 e un DOS 6.0 macchine e i comandi funzionano su di essi. Quando sono passati a 32 bit il problema era ancora presente. funziona nella finestra di CMD da win95 fino ad oggi, comprese tutte le versioni del server. Ora che stiamo passando a Powershell non funziona più. Mi sono reso conto dopo aver scritto che crea la directory ma non fornisce l'effetto che stava vedendo l'OP. Se provo a inserire un CD nella directory con quattro punti, mi fa tornare indietro.
Larryc,

Sulla mia macchina Windows 7 MD ....` only creates .... \ .... `albero - c'è solo un passo di ricorsione.
Tomáš Zato

Curiosamente, il manager FAR non lo considera in alcun modo speciale e crea / rinomina / elimina / elenca i contenuti delle directory denominate "un sacco di punti" senza alcun problema.
RomanSt

-1

Ho avuto lo stesso problema. Nel mio caso, era un refuso nel comando per la pubblicazione di .NET Core:

dotnet publish "Api.csproj" --output "....\output\"

Ha creato la directory con il nome "....", che non ho potuto rimuovere o rinominare. Questa directory ha funzionato come riferimento alla directory principale. Se entro in quella cartella, mi trovavo ancora nella cartella principale, ma il percorso è stato aggiunto da '.... \'.

Ho provato tutti i comandi menzionati in questo argomento, ma nessuno di loro ha funzionato. A quanto ho capito, ha funzionato in quel modo, perché avevo altri file e directory nella directory principale, quindi ho dovuto usare parametri che possono eliminare in modo ricorsivo tutto il contenuto.

Ho scoperto che questo comando:

rmdir /s /q ....\

può rimuovere la directory '....'. Elimina solo il riferimento alla directory principale, che in realtà è questa directory '....', niente di più, niente di meno. Nonostante gli argomenti del comando:

  • / s - rimuove tutto il contenuto all'interno della directory rimossa,
  • / q - rimuove senza conferma,

la directory padre è rimasta intatta.


Puoi chiarire perché il secondo comando ha funzionato per te?
Burgi,

Annullamento della votazione perché non è stata fornita alcuna spiegazione del motivo per cui il comando funziona o cosa fa, ad esempio elimina la directory, le sottodirectory e i file.
Winter Faulk,

Questo effettivamente cancella la directory con un nome di '....'. Elimina solo il riferimento alla directory principale, che in realtà è questa directory '....', niente di più, niente di meno. Ho provato tutti i comandi menzionati in questo argomento, ma nessuno di questi funziona. Nella mia comprensione, questo comando ha funzionato, perché avevo altri file e directory nella directory principale, quindi ho dovuto utilizzare parametri che possono eliminare in modo ricorsivo tutto il contenuto. Nonostante gli argomenti del comando, la directory padre è rimasta intatta.
Mateusz,

Sono entrato in questa stessa identica situazione in qualche modo con Visual Studio e questo comando mi ha salvato la pancetta dopo ore di frustrazione cercando di capire cosa stesse succedendo.
NPNelson,
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.