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?
fuente
..
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.GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini
. Claramente, hay / hubo alguna vulnerabilidad en algún lugar que esto intenta explotar...
no....
. Es simplemente una forma de atravesar\winnt
independientemente 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...
por eso me pareció bastante extraño.Respuestas:
Win32 no le permite crear archivos o carpetas con nombres que terminan en
.
- todos los puntos se eliminan desde el final. Intentar creartest.
hacetest
aparecer 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 crearC:\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 comoCON
oNUL
.Entonces podría ser que uno de sus programas:
\\?\
para acceder a los archivos,....
, pero no es posible saberlo con certeza después del hecho.fuente
echo "" > ....::$INDEX_ALLOCATION
. Esto creará una carpeta llamada....
(todavía apunta a la carpeta actual).\\?\"
en la fuente de referencia .NET , causa un error de tiempo de ejecución en su servidor).com1
nombre de archivo mágicoAdemá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 /j
por 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.fuente
mkdir ....
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.
fuente
MD ....` only creates
... \ .... `árbol: solo hay un paso de recursión.Yo tuve el mismo problema. En mi caso, se trataba de un error tipográfico en la publicación de .NET Core:
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:
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:
el directorio padre permaneció intacto.
fuente