En mi máquina Windows, tenía una carpeta con un nombre de cuatro puntos que actuaba como una especie de madriguera de conejo: ¿cómo sucedió eso?

198

El nombre de la carpeta figuraba en el Explorador de archivos con solo cuatro puntos .....

Cuando intenté abrirlo, llegué a una especie de bucle sin fin de conejo donde abrí exactamente la misma carpeta una y otra vez; podía hacer esto sin cesar. Mostrando el camino como C:\ExamplePath\....\....\....\....\...., etc.

Estaba colgando mi compilación de TypeScript en un proyecto específico. Me tomó más de un año antes de encontrar esta carpeta y sus problemas relacionados, porque estaba profundamente enraizada en carpetas anidadas. Nunca esperé un problema como este, así que nunca lo busqué.

No pude eliminar la carpeta de la manera normal debido al nombre especial. Al final, podría eliminarlo usando la línea de comando y eliminando la carpeta principal con rd /s /q path.

Después, intenté crear la carpeta nuevamente pero no pude hacerlo con el Explorador de archivos y la línea de comandos.

En mis más de 20 años de uso de Windows, nunca antes había visto este error, así que puedo imaginar que realmente sería un problema molesto y confuso para los usuarios aficionados.

¿Alguien sabe cómo pudo haber sucedido esto y cómo reproducir este problema?

Actualizar

Para las personas interesadas: esta ruta se encuentra en una carpeta TFS. Entonces, probablemente TFS utiliza el método de derivación @grawity explicado ( "Varios administradores de archivos, archivadores, etc." )

¿Me topé con un raro error de TFS?

Dirk Boer
fuente
55
Las respuestas a continuación detallan lo que está sucediendo, cómo reproducirlo intencionalmente y cómo solucionarlo, pero no mencionan por qué sucedió. Dado que ..se puede usar en una ruta para indicar 'subir una carpeta', me arriesgaría a suponer que en algún lugar a lo largo de la línea, algún programa o script concatena dos cadenas para crear una ruta, una terminó con .., y la siguiente comenzó con .., y Como utilizó una de las técnicas mencionadas a continuación, logró crear la ruta, aunque le faltaba el separador de carpetas entre ellas.
3D1T0R
66
cosas extrañas también sucederán si crea una carpeta con solo espacios en su nombre
phuclv
77
¿Este servidor está en internet? Sólo para advertirle que veo regularmente intentos de hackers en Internet que enfrentan los servidores web que solicitan: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Claramente, hay / hubo alguna vulnerabilidad en algún lugar que esto intenta explotar.
Andy Brown el
44
@AndyBrown es mucho más probable que ..no ..... Es simplemente una forma de atravesar \winntindependientemente de la profundidad del punto de partida (la raíz web), siempre que el punto de partida tenga menos de 9 niveles de profundidad. Se basa en el hecho de que ir ..desde el directorio raíz te deja en el directorio raíz.
Hobbs
55
@hobbs Eso es copiar y pegar desde el registro de acceso de Apache en Linux. Definitivamente 4 puntos allí. Hay otros intentos de pirateo registrados que usan, ..por eso me pareció bastante extraño.
Andy Brown

Respuestas:

303

Win32 no le permite crear archivos o carpetas con nombres que terminan en .- todos los puntos se eliminan desde el final. Intentar crear test.hace testaparecer en su lugar. (Esto es para compatibilidad con nombres 8.3 en el antiguo software de la era DOS / Win9x).

Como resultado, cada vez que intentas acceder a una carpeta llamada ...., su nombre se reduce a la cadena vacía, y vuelves a la carpeta en la que estabas antes.

El núcleo NT, sin embargo, sí permite tales nombres. Existen varios mecanismos que omiten las limitaciones de nombre de archivo impuestas por las API de Win32; por ejemplo, WSL (Windows Subsystem for Linux) no se ejecuta sobre Win32 y no se ve afectado por él. También existe el \\?\método de derivación, una "puerta trasera" deliberada que queda para los programas que saben lo que están haciendo. Aunque no puede crear C:\Example\....\, puede crear \\?\C:\Example\....\bien.

Del mismo modo, puede eliminar dichos directorios rmdir \\?\C:\path\...de Cmd (todavía no lo he probado con PowerShell).

Varios administradores de archivos, archivadores, etc. pueden usar el \\?\método para poder usar nombres de ruta más largos de lo habitual, y al hacerlo, tampoco se ven afectados por el código de compatibilidad dentro de Win32; evitan la eliminación de puntos, así como la traducción de nombres de archivos mágicos como CONo NUL.

Entonces podría ser que uno de sus programas:

  1. siempre se usa \\?\para acceder a los archivos,
  2. accidentalmente trató de crear una carpeta llamada ...., pero no es posible saberlo con certeza después del hecho.
Gravedad
fuente
13
Otra forma de crear dicha carpeta es mediante el uso de flujos de datos alternativos. En el cmd: echo "" > ....::$INDEX_ALLOCATION. Esto creará una carpeta llamada ....(todavía apunta a la carpeta actual).
WorldSEnder
2
@DirkBoer Encontré esto: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
Microsoft llama a esto el "Prefijo de ruta extendida", y las rutas con ese prefijo se llaman "rutas de longitud extendida". (Divertido: cuando busca \\?\"en la fuente de referencia .NET , causa un error de tiempo de ejecución en su servidor).
dlatikay
2
@grawity So. . . ¿cómo debo eliminar esta carpeta ahora?
Shadow503
21
Tuve un curioso caso de cliente de 'reparación de computadora' en el que cada vez que el cliente creaba una cuenta en cualquier máquina con Windows, funcionaría bien, pero una vez que iniciaba sesión / reiniciaba, no lo dejaba entrar en su cuenta, sino que creaba una cuenta temporal para el sesión. El taller local de reparación de computadoras estaba perplejo (todavía lo acusó). Resulta que su nombre real es Con y siempre usó su nombre para su cuenta de Windows ... ese día supe que había algo más que un simple com1nombre de archivo mágico
RozzA
23

Además de la respuesta de @grawity, un programa Win32 también puede hacer esto llamando directamente a la API "nativa". Si no me equivoco, en el presente caso, sería NtCreateDirectoryObject. Esas llamadas están bastante bien documentadas hoy en día, especialmente su contraparte del núcleo (que no puede llamar desde un programa Win32), en este caso, ZwCreateDirectoryObject.

Con respecto a la "profundidad infinita", una manera fácil de lograr esto es usar enlaces. Cree un directorio, luego dentro de él, cree una unión (puede usarlo, mklink /jpor ejemplo), y terminará con una estructura muy profunda. Sin embargo, la última vez que hice esto fue en Windows 2000, hubo un final para la recursión (no se podía "cavar infinitamente"). Posiblemente en el sistema operativo más nuevo, el límite es mayor o eliminado, también podría crear, digamos, 10 directorios, cada uno de los cuales es hijo del anterior, y en el décimo, cree un enlace de regreso al primero.

user1532080
fuente
44
Ese es posiblemente un material genio malvado allí mismo ...
Agi Hammerthief
1
He copiado directorios completos de manera similar a esto para llenar artificialmente el disco para probar y poder determinar cuándo estaba cerca de un límite establecido.
mickeyf
También es posible reproducir usando cygwin'smkdir ....
lucidbrot
18

Hay una manera más fácil de crear el directorio. Desde el símbolo del sistema, escriba:

MD ....\

y presione enter, creará un directorio con cuatro puntos. Este directorio también se puede ver con el explorador.

Hay una falla en MS-DOS que se remonta a la versión 1.0. MS lo ha sabido por algún tiempo, pero no pudo o no lo solucionó. Han corregido el problema con PowerShell.

Por cierto, si intentas:

RD ....

No se podrá eliminar. Debe usar esta sintaxis específica para eliminarla.

RD ....\

Lo uso en ciertos servidores que administro. A menudo creo una carpeta de usuario en la raíz del disco y no quiero que aparezca otro administrador y la elimine.

Entonces iré dentro de mi carpeta y crearé una subcarpeta llamada CON, AUX o LPT, etc.

Si otro administrador desea eliminar mi carpeta, primero debe saber cómo eliminar esta subcarpeta.

EDITAR: Estaba pensando en esta discusión esta mañana y decidí ir un paso más allá. Supongo que las modificaciones decidirán si esto es relevante.

No puedo CD en la carpeta.

Considere, si yo MD c: \ test entonces CD C: \ test y MD .... \ Termino con C: \ test ....

y todo esta bien

Pero CD ... falla y me devuelve a C: \ test. (CD ... \ hace lo mismo)

Sin embargo, puedo DIR ... y obtener una lista de directorios. también puedo

MD C: \ test .... \ temp y crea ese subdirectorio en ...

También puedo CD C: \ test .... \ temp e ir a ese directorio sub-sub.

Pero mientras estoy en C: \ test .... \ temp, si CD ... estoy de vuelta en C: \ test.

No puedo cd en ese directorio, pero puedo manipular la carpeta creando subcarpetas, y lo suficientemente interesante como

"Pruebas" de ECHO >> C: \ test .... \ test.txt

También funciona y crea un archivo en esa carpeta. Así que puedo crear una carpeta con cuatro puntos, puedo agregarle archivos y carpetas, puedo obtener listas de directorios, pero no puedo crear un CD en ella. ¿Podría haber algún tipo de genio malvado para esto? Mis disculpas por las modificaciones si me he desviado demasiado del rumbo.

Larryc
fuente
66
Eso suena más bien como una falla de la API Win32, dado que el símbolo del sistema ya no ha sido "MS-DOS" durante unos veinte años.
Grawity
2
Curiosamente, si intento eliminar el directorio en el explorador de Windows, se bloquea cuando lo creé con su versión. Cuando lo creé con cygwin, simplemente falla y lo dice.
lucidbrot
Tengo máquinas DOS 3.3 y DOS 6.0 y los comandos funcionan en ellas. Cuando cambiaron a 32 bits, el problema seguía ahí. funciona en la ventana CMD desde win95 hasta hoy, incluidas todas las versiones del servidor. Ahora que estamos cambiando a Powershell, ya no funciona. Después de escribir, me di cuenta de que sí crea el directorio pero no proporciona el efecto que estaba viendo el OP. Si intento hacer un CD en el directorio con cuatro puntos, simplemente me expulsa.
Larryc
En mi máquina con Windows 7 MD ....` only creates ... \ .... `árbol: solo hay un paso de recursión.
Tomáš Zato
Curiosamente, el administrador de FAR no ve esto como algo especial de ninguna manera, y crea / renombra / elimina / enumera el contenido de los directorios llamados "muchos puntos" sin ningún problema.
RomanSt
-1

Yo tuve el mismo problema. En mi caso, se trataba de un error tipográfico en la publicación de .NET Core:

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

Creó el directorio con el nombre '....', que no pude eliminar ni renombrar. Este directorio actuó como referencia al directorio padre. Si entro en esa carpeta, todavía estaba en la carpeta principal, pero la ruta fue agregada por '.... \'.

Intenté todos los comandos mencionados en este tema, pero ninguno funcionó. En mi opinión, actuó así, porque tenía otros archivos y directorios en el directorio principal, por lo que tuve que usar parámetros que pueden eliminar recursivamente todo el contenido.

Descubrí que este comando:

rmdir /s /q ....\

puede eliminar el directorio '....'. Solo elimina la referencia al directorio padre, que este directorio '....' es en realidad, nada más y nada menos. A pesar de los argumentos del comando:

  • / s: elimina todo el contenido del directorio eliminado,
  • / q: elimina sin confirmación,

el directorio padre permaneció intacto.

Mateusz
fuente
¿Puedes aclarar por qué el segundo comando funcionó para ti?
Burgi
Votando porque no dio ninguna explicación de por qué funciona el comando o qué hace, como eliminar el directorio, subdirectorios y archivos.
Invierno Faulk
Esto realmente elimina el directorio con un nombre de '...'. Solo elimina la referencia al directorio padre, que este directorio '...' es en realidad, nada más y nada menos. Intenté todos los comandos mencionados en este tema, pero ninguno de ellos funciona. En mi opinión, este comando funcionó, porque tenía otros archivos y directorios en el directorio principal, por lo que tuve que usar parámetros que pueden eliminar recursivamente todo el contenido. A pesar de los argumentos del comando, el directorio padre permaneció intacto.
Mateusz
Me metí en esta misma situación de alguna manera con Visual Studio y este comando salvó mi tocino después de horas de frustración tratando de descubrir qué estaba pasando.
NPNelson