Na minha máquina Windows, eu tinha uma pasta com o nome de quatro pontos que agia como uma espécie de toca de coelho - como isso aconteceu?

198

O nome da pasta foi listado no File Explorer com apenas quatro pontos .....

Quando tentei abri-lo, entrei em uma espécie de loop de toca de coelho sem fim, onde abri a mesma pasta exatamente de novo e de novo - eu podia fazer isso sem parar. Mostrando o caminho como C:\ExamplePath\....\....\....\....\....etc.

Estava pendurando minha compilação TypeScript em um projeto específico. Levei mais de um ano para encontrar essa pasta e seus problemas relacionados, pois estava profundamente enraizada nas pastas aninhadas. Eu nunca esperei um problema como esse, então nunca o procurei.

Não consegui excluir a pasta da maneira normal por causa do nome especial. No final, eu poderia removê-lo usando a linha de comando e excluindo a pasta pai com rd /s /q path.

Depois, tentei criar a pasta novamente, mas não consegui fazer isso com o File Explorer e a linha de comando.

Nos meus mais de 20 anos de uso do Windows, nunca vi esse bug antes, então posso imaginar que seria realmente um problema irritante e confuso para usuários amadores.

Alguém sabe como isso poderia ter acontecido e como reproduzir esse problema?

Atualizar

Para as pessoas interessadas: esse caminho foi localizado profundamente dentro de uma pasta TFS. Então provavelmente o TFS usa o método bypass @grawity explicado ( "Vários gerenciadores de arquivos, arquivadores, etc." )

Eu tropecei em um bug raro do TFS?

Dirk Boer
fonte
5
As respostas abaixo detalham o que está acontecendo, como reproduzi-lo intencionalmente e como corrigi-lo, mas não mencionam o motivo. Como ..pode ser usado em um caminho para indicar 'subir uma pasta', arriscaria adivinhar que, em algum ponto da linha, algum programa ou script concatenasse duas cadeias para criar um caminho, uma terminada com ..e a próxima iniciada com .., e como utilizou uma das técnicas mencionadas abaixo, conseguiu criar o caminho, apesar de estar faltando o separador de pastas entre eles.
3D1T0R
6
coisas estranhas também vai acontecer se você criar uma pasta com apenas espaços em seu nome
phuclv
7
Este servidor está na internet? Só para te avisar que eu vejo regularmente tentativas de hack na internet enfrentando servidores web requisitando: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Claramente, existe / houve alguma vulnerabilidade em algum lugar que isso tenta explorar.
Andy Brown
4
@AndyBrown é muito mais provável que ..não ..... É simplesmente uma maneira de percorrer, \winntindependentemente da profundidade do ponto de partida (a raiz da web), desde que o ponto de partida tenha menos de 9 níveis de profundidade. Ele se baseia no fato de que ir ..do diretório raiz o deixa no diretório raiz.
precisa
5
@ Hobbs Isso é uma cópia e colagem do log de acesso do Apache no linux. Definitivamente 4 pontos lá. Há outras tentativas de hack registrados que fazer uso ..que era por isso que eu encontrei este bastante estranho.
Andy Brown

Respostas:

303

O Win32 não permite criar arquivos ou pastas com nomes terminados em .- todos os pontos são removidos do final. Tentar criar test.faz testaparecer. (Isto é para compatibilidade com nomes 8.3 no software antigo da era DOS / Win9x.)

Como resultado, sempre que você tenta acessar uma pasta chamada ...., seu nome é reduzido à cadeia vazia e você volta à pasta em que estava antes.

O kernel do NT, no entanto, permite esses nomes. Existem vários mecanismos que ignoram as limitações de nome de arquivo impostas pelas APIs do Win32 - por exemplo, o WSL (Windows Subsystem para Linux) não é executado sobre o Win32 e não é afetado por ele. Existe também o \\?\método bypass, um "backdoor" deliberado para programas que sabem o que estão fazendo. Mesmo que você não possa criar C:\Example\....\, você pode criar \\?\C:\Example\....\muito bem.

Da mesma forma, você pode excluir esses diretórios rmdir \\?\C:\path\...do Cmd (ainda não testei com o PowerShell).

Vários gerenciadores de arquivos, arquivadores etc. podem usar o \\?\método para poder usar nomes de caminho mais longos do que o habitual - e, ao fazer isso, eles também não são afetados pelo código de compatibilidade no Win32; eles ignoram a remoção de pontos, bem como a tradução de nomes de arquivos mágicos como CONou NUL.

Portanto, pode ser que um dos seus programas:

  1. sempre usa \\?\para acessar arquivos,
  2. acidentalmente tentou criar uma pasta chamada ....- mas não é realmente possível saber com certeza após o fato.
gravidade
fonte
13
outra maneira de criar essa pasta é usando fluxos de dados alternativos. No cmd: echo "" > ....::$INDEX_ALLOCATION. Isso criará uma pasta chamada ....(ainda apontando para a pasta atual).
WorldSEnder
2
@DirkBoer Encontrei isso: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
A Microsoft chama isso de "Prefixo do caminho estendido" e os caminhos com esse prefixo são chamados de "caminhos de comprimento estendido". (engraçado: quando você pesquisa \\?\"na fonte de referência .NET , isso causa um erro de tempo de execução no servidor).
dlatikay
2
@grawity So. . . como devo excluir essa pasta agora?
Shadow503
21
Eu tinha um curioso caso de cliente de "reparo do computador", em que, sempre que o cliente fazia uma conta em qualquer máquina Windows, funcionava muito bem, mas depois que ele fazia o logon / reiniciava, não o deixava entrar em sua conta, ao invés disso, fazia uma conta temporária para o sessão. A loja de conserto de computadores local ficou perplexa (ainda cobrou). Acontece que seu nome real é Con & ele sempre usou seu nome para explicar suas janelas ..... naquele dia eu aprendi que havia mais do que apenas com1como um nome de arquivo mágica
ROZZA
23

Além da resposta do @ grawity, um programa Win32 também pode fazer isso chamando a API "nativa" diretamente. Se não me engano, no presente caso, seria NtCreateDirectoryObject. Atualmente, essas chamadas estão bastante bem documentadas, especialmente as contrapartes do kernel (que você não pode chamar de um programa Win32); nesse caso, ZwCreateDirectoryObject.

Em relação à "profundidade sem fim", uma maneira fácil de conseguir isso é usar links. Crie um diretório e, em seguida, dentro dele, crie uma junção para ele (você pode usar, mklink /jpor exemplo), e você terminará com uma estrutura muito profunda. A última vez que fiz isso foi no Windows 2000, mas a recursão foi encerrada (você não podia "cavar infinitamente"). Possivelmente, em sistemas operacionais mais recentes, o limite é maior ou removido; você também pode criar, digamos, 10 diretórios, cada um deles filho do anterior, e no 10º, criar um link para o primeiro.

user1532080
fonte
4
Isso é material de gênio muito possivelmente mal ali ...
Agi Hammerthief
1
Copiei diretórios completos de maneira semelhante a isso para encher artificialmente o disco para teste, para poder determinar quando ele estava próximo de um limite definido.
Mickeyf #
Também é possível reproduzir usando cygwin demkdir ....
lucidbrot
18

Existe uma maneira mais fácil de criar o diretório. No prompt de comando, digite:

MD ....\

e pressione enter, ele criará um diretório com quatro pontos. Este diretório também pode ser visualizado com o explorer.

Há uma falha no MS-DOS que remonta à versão 1.0. A Microsoft sabe disso há algum tempo, mas não pôde ou não quis corrigi-lo. Eles corrigiram o problema com o PowerShell.

BTW, se você tentar:

RD ....

Não será possível excluir. Você precisa usar esta sintaxe específica para removê-lo.

RD ....\

Eu uso isso em certos servidores que eu administro. Costumo criar uma pasta de usuário na raiz do disco e não quero que outro administrador apareça e a remova.

Então, vou entrar na minha pasta e criar uma subpasta chamada CON, AUX ou LPT, etc ...

Se outro administrador quiser remover minha pasta, ele precisará saber como remover esta subpasta primeiro.

Edição: Eu estava pensando sobre esta discussão esta manhã e eu decidi dar um passo adiante. Presumo que os mods decidam se isso é relevante.

Não consigo colocar o CD na pasta.

Considere, se eu MD c: \ test, CD C: \ test e MD .... \ acabo com C: \ test ....

e está tudo bem.

Mas o CD ... falha e me leva de volta ao C: \ test. (CD .... \ faz o mesmo.)

No entanto, eu posso dir .... e obter uma lista de dir. Eu também posso

MD C: \ test .... \ temp e cria esse subdiretório em ....

Também posso CD C: \ test .... \ temp e entrar nesse diretório sub-sub.

Mas enquanto estiver em C: \ test .... \ temp, se eu CD .. Estou de volta em C: \ test.

Não consigo entrar nesse diretório, mas posso manipular a pasta criando subpastas e bastante interessante, como

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

também funciona e cria um arquivo nessa pasta. Para criar uma pasta com quatro pontos, adicionar arquivos e pastas, obter listagens dir, mas não consigo colocar um CD nela. Poderia haver algum tipo de gênio do mal usado para isso? Minhas desculpas aos mods se eu me desviar muito do curso.

Larryc
fonte
6
Isso parece uma falha na API do Win32, já que o prompt de comando não é mais o "MS-DOS" há cerca de vinte anos.
grawity
2
Curiosamente, se eu tentar excluir o diretório no Windows Explorer, ele trava quando eu o criei com sua versão. Quando eu o criei com o cygwin, ele simplesmente falha e diz isso.
Lucidbrot #
Eu tenho máquinas DOS 3.3 e DOS 6.0 e os comandos funcionam nelas. Quando eles mudaram para 32 bits, o problema ainda estava lá. Ele funciona na janela CMD do win95 até hoje, incluindo todas as versões do servidor. Agora que estamos mudando para o Powershell, ele não funciona mais. Depois que escrevi, percebi que ele cria o diretório, mas não fornece o efeito que o OP estava vendo. Se eu tentar colocar o CD no diretório com quatro pontos, ele me expulsará.
Larryc
Na minha máquina Windows 7 MD ....` only creates .... \ .... `tree - existe apenas uma etapa de recursão.
Tomáš Zato
Curiosamente, o gerente do FAR não vê isso como especial de forma alguma e cria / renomeia / exclui / lista o conteúdo de diretórios denominados "muitos pontos" sem nenhum problema.
RomanSt
-1

Eu tive o mesmo problema. No meu caso, foi um erro de digitação no comando para publicação do .NET Core:

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

Ele criou o diretório com o nome '....', que não foi possível remover ou renomear. Este diretório agiu como referência ao diretório pai. Se eu entrar nessa pasta, ainda estava na pasta pai, mas o caminho foi anexado por '.... \'.

Eu tentei todos os comandos mencionados neste tópico, mas nenhum deles funcionou. No meu entendimento, ele agia assim, porque eu tinha outros arquivos e diretórios no diretório pai, então tive que usar parâmetros que podem excluir recursivamente todo o conteúdo.

Eu descobri que este comando:

rmdir /s /q ....\

pode remover o diretório '....'. Ele exclui apenas a referência ao diretório pai, que esse diretório '....' realmente é, nada mais, nada menos. Apesar dos argumentos de comando:

  • / s - remove todo o conteúdo do diretório removido,
  • / q - remove sem confirmação,

o diretório pai permaneceu intocado.

Mateusz
fonte
Você pode esclarecer por que o segundo comando funcionou para você?
Burgi
Votação baixa porque você não deu nenhuma explicação sobre por que o comando funciona ou o que ele faz, como excluir o diretório, subdiretórios e arquivos.
Winter Faulk
Na verdade, isso exclui o diretório com o nome '....'. Ele exclui apenas a referência ao diretório pai, que esse diretório '....' realmente é, nada mais, nada menos. Eu tentei todos os comandos mencionados neste tópico, mas nenhum deles funciona. No meu entendimento, esse comando funcionou, porque eu tinha outros arquivos e diretórios no diretório pai, então tive que usar parâmetros que podem excluir recursivamente todo o conteúdo. Apesar dos argumentos do comando, o diretório pai permaneceu intocado.
Mateusz
Entrei nessa mesma situação de alguma maneira com o Visual Studio e esse comando salvou meu bacon após horas de frustração tentando descobrir o que estava acontecendo.
NPNelson