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?
fonte
..
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.GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini
. Claramente, existe / houve alguma vulnerabilidade em algum lugar que isso tenta explorar...
não....
. É simplesmente uma maneira de percorrer,\winnt
independentemente 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...
que era por isso que eu encontrei este bastante estranho.Respostas:
O Win32 não permite criar arquivos ou pastas com nomes terminados em
.
- todos os pontos são removidos do final. Tentar criartest.
faztest
aparecer. (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 criarC:\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 comoCON
ouNUL
.Portanto, pode ser que um dos seus programas:
\\?\
para acessar arquivos,....
- mas não é realmente possível saber com certeza após o fato.fonte
echo "" > ....::$INDEX_ALLOCATION
. Isso criará uma pasta chamada....
(ainda apontando para a pasta atual).\\?\"
na fonte de referência .NET , isso causa um erro de tempo de execução no servidor).com1
como um nome de arquivo mágicaAlé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 /j
por 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.fonte
mkdir ....
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.
fonte
MD ....` only creates
.... \ .... `tree - existe apenas uma etapa de recursão.Eu tive o mesmo problema. No meu caso, foi um erro de digitação no comando para publicação do .NET Core:
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:
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:
o diretório pai permaneceu intocado.
fonte