Sur ma machine Windows, j'avais un dossier avec un nom de quatre points qui ressemblait à une sorte de trou à lapin - comment cela s'est-il passé?

198

Le nom du dossier était répertorié dans l'Explorateur de fichiers avec simplement quatre points .....

Quand j'ai essayé de l'ouvrir, je suis entré dans une sorte de boucle de trou de lapin sans fin où j'ai ouvert le même dossier, encore et encore - je pouvais le faire sans fin. Montrer le chemin comme C:\ExamplePath\....\....\....\....\...., etc.

Il était accroché ma compilation TypeScript dans un projet spécifique. Il m'a fallu plus d'un an avant de trouver ce dossier et ses problèmes, car il était profondément enraciné dans des dossiers imbriqués. Je ne m'attendais jamais à un problème de ce genre, je ne l'ai donc jamais cherché.

Je ne pouvais pas supprimer le dossier normalement, à cause du nom spécial. En fin de compte, je pourrais le supprimer en utilisant la ligne de commande et en supprimant le dossier parent avec rd /s /q path.

Par la suite, j’ai essayé de créer à nouveau le dossier, mais j’ai été incapable de le faire avec l’explorateur de fichiers et la ligne de commande.

Au cours de mes 20 années d’utilisation de Windows, je n’avais jamais vu ce bogue auparavant, alors j’imagine que ce serait vraiment un problème embêtant et déroutant pour les utilisateurs amateurs.

Est-ce que quelqu'un sait comment cela aurait pu se produire et comment reproduire ce problème?

Mise à jour

Pour les personnes intéressées: ce chemin était situé profondément dans un dossier TFS. Donc, probablement TFS utilise la méthode de contournement @grawity expliquée ( "Divers gestionnaires de fichiers, archiveurs, etc." )

Ai-je trébuché sur un rare bug de TFS?

Dirk Boer
la source
5
Les réponses ci-dessous détaillent ce qui se passe, comment le reproduire intentionnellement et comment le réparer, mais elles ne précisent pas pourquoi cela est arrivé. Puisqu'il ..peut être utilisé dans un chemin pour indiquer «monter d'un dossier», je suppose que quelque part dans la ligne, un programme ou un script a concaténé deux chaînes pour créer un chemin, l'une terminée ..et l'autre commençant par .., et Comme il utilisait l’une des techniques mentionnées ci-dessous, il a réussi à créer le chemin, même s’il manquait le séparateur de dossiers entre eux.
3D1T0R
6
des choses étranges se produiront également si vous créez un dossier avec uniquement des espaces dans son nom
phuclv
7
Ce serveur est-il sur internet? Juste pour vous avertir que je vois régulièrement des tentatives de piratage sur Internet face à des serveurs Web demandant: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Clairement, il existe / existait une vulnérabilité quelque part que celle-ci tente d’exploiter.
Andy Brown
4
@ AndyBrown beaucoup plus probable .., non ..... Il s'agit simplement d'un moyen de parcourir \winntquelle que soit la profondeur du point de départ (la racine Web), tant que le point de départ est inférieur à 9 niveaux. Cela repose sur le fait que ..partir du répertoire racine vous laisse au répertoire racine.
Hobbs
5
@hobbs C'est un copier-coller du journal des accès Apache sous Linux. Certainement 4 points dedans. Il y a d' autres tentatives de hack journalisés qui font usage ..qui était la raison pour laquelle j'ai trouvé celui - ci assez bizarre.
Andy Brown

Réponses:

303

Win32 ne vous permet pas de créer des fichiers ou des dossiers dont le nom se termine par .- tous les points sont supprimés de la fin. Essayer de créer test.fait testapparaître à la place. (Ceci concerne la compatibilité avec les noms 8.3 dans les anciens logiciels de l’ère DOS / Win9x.)

Par conséquent, chaque fois que vous essayez d'accéder à un dossier nommé ...., son nom devient réduit à la chaîne vide et vous revenez au dossier dans lequel vous vous trouviez auparavant.

Le noyau NT, cependant, autorise de tels noms. Différents mécanismes permettent de contourner les limitations de nom de fichier imposées par les API Win32 - par exemple, WSL (Windows Subsystem for Linux) ne s'exécute pas sur Win32 et n'est pas affecté par celui-ci. Il y a aussi la \\?\méthode de contournement, une "porte dérobée" délibérée laissée aux programmes qui savent ce qu'ils font. Même si vous ne pouvez pas créer C:\Example\....\, vous pouvez créer \\?\C:\Example\....\très bien.

De même, vous pouvez supprimer de tels répertoires avec rmdir \\?\C:\path\...Cmd (je n'ai pas encore testé avec PowerShell).

Différents gestionnaires de fichiers, archiveurs, etc. peuvent utiliser cette \\?\méthode pour pouvoir utiliser des noms de chemins plus longs que d'habitude. Ils ne sont donc pas affectés par le code de compatibilité de Win32. ils contournent l'effacement des points, ainsi que la traduction de noms de fichiers magiques tels que CONou NUL.

Donc, il se pourrait que l'un de vos programmes:

  1. utilise toujours \\?\pour accéder aux fichiers,
  2. accidentellement essayé de créer un dossier nommé ....- mais il n'est pas vraiment possible de savoir avec certitude après coup.
Grawity
la source
13
Un autre moyen de créer un tel dossier consiste à utiliser des flux de données alternatifs. Sur le cmd: echo "" > ....::$INDEX_ALLOCATION. Cela créera un dossier nommé ....(pointant toujours sur le dossier actuel).
WorldSEnder
2
@DirkBoer J'ai trouvé ceci: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
Microsoft appelle cela le "préfixe de chemin étendu" et les chemins portant ce préfixe sont appelés "chemins de longueur étendue". (amusant: lorsque vous recherchez \\?\"dans la source de référence .NET , cela provoque une erreur d'exécution sur leur serveur).
Dlatikay
2
@grawity Alors. . . comment dois-je procéder pour supprimer ce dossier maintenant?
Shadow503
21
J'avais un cas curieux de client de «réparation d'ordinateur» où chaque fois que le client créait un compte sur une machine Windows, cela fonctionnerait très bien, mais une fois connecté / redémarré, il ne le laisserait pas sur son compte, mais créerait un compte temporaire pour le compte à rebours. session. L'atelier de réparation d'ordinateurs local était sonné (accusé encore). Il s'avère que son nom actuel est Con et qu'il a toujours utilisé son nom pour son compte Windows ..... ce jour-là, j'ai appris qu'il n'y avait pas qu'un com1nom de fichier magique
RozzA
23

En plus de la réponse de @ grawity, un programme Win32 peut également le faire en appelant directement l'API "native". Si je ne me trompe pas, dans le cas présent, ce serait NtCreateDirectoryObject. Ces appels sont assez bien documentés de nos jours, en particulier leur homologue du noyau (que vous ne pouvez pas appeler depuis un programme Win32), dans ce cas, ZwCreateDirectoryObject.

En ce qui concerne la "profondeur sans fin", un moyen facile d'y parvenir consiste à utiliser des liens. Créez un répertoire, puis à l’intérieur de celui-ci, créez une jonction (vous pouvez utiliser mklink /jpar exemple), et vous obtiendrez une structure très profonde. La dernière fois que j'ai fait cela était sur Windows 2000, la récursivité prenait fin (vous ne pouviez pas "creuser à l'infini"). Peut-être que sur les nouveaux systèmes d’exploitation, la limite est plus grande ou supprimée, vous pouvez également créer, par exemple, 10 répertoires, chacun d’eux étant le précédent, et créer un 10ème répertoire pour revenir au premier.

utilisateur1532080
la source
4
C'est peut-être du mauvais génie, juste là ...
Agi Hammerthief
1
J'ai copié des répertoires complets de la même manière que celui-ci pour remplir artificiellement le disque afin que le test puisse déterminer s'il était proche d'une limite définie.
Mickeyf
Il est également possible de reproduire à l'aide de cygwinmkdir ....
lucidbrot
18

Il existe un moyen plus simple de créer le répertoire. A partir de l'invite de commande, tapez:

MD ....\

et appuyez sur Entrée, il créera un répertoire avec quatre points. Ce répertoire est également visible avec explorer.

Il y a une faille dans MS-DOS qui remonte à la version 1.0. MS est au courant depuis un certain temps, mais ne pourrait pas ou ne voudrait pas le réparer. Ils ont corrigé le problème avec PowerShell.

BTW, si vous essayez:

RD ....

Il ne sera pas supprimé. Vous devez utiliser cette syntaxe spécifique pour la supprimer.

RD ....\

J'utilise ceci sur certains serveurs que j'administre. Je crée souvent un dossier utilisateur à la racine du disque et je ne veux pas qu'un autre administrateur vienne le supprimer.

Je vais donc aller dans mon dossier et créer un sous-dossier nommé CON, AUX ou LPT, etc ...

Si un autre administrateur souhaite supprimer mon dossier, il doit d'abord savoir comment supprimer ce sous-dossier.

EDIT: Je pensais à la discussion de ce matin et j'ai décidé d'aller plus loin. Je suppose que les mods décideront si cela est pertinent.

Je ne parviens pas à insérer un CD dans le dossier.

Considérez si je MD c: \ test puis CD C: \ test et MD .... \ Je me retrouve avec C: \ test ....

et tout va bien.

Mais CD .... échoue et me renvoie à C: \ test. (CD .... \ fait la même chose.)

Cependant, je peux DIR .... et obtenir une liste de dir. je peux aussi

MD C: \ test .... \ temp et il crée ce sous-répertoire dans ....

Je peux aussi CD C: \ test .... \ temp et aller dans ce sous-sous-répertoire.

Mais alors que dans C: \ test .... \ temp, si je CD .. je suis de retour dans C: \ test.

Je ne peux pas entrer dans ce répertoire, mais je peux manipuler le dossier en créant des sous-dossiers, et assez intéressant, par exemple

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

fonctionne également et crée un fichier dans ce dossier. Ainsi, je peux créer un dossier avec quatre points, je peux y ajouter des fichiers et des dossiers, je peux obtenir des listes de répertoires, mais je ne peux pas y insérer de CD. Pourrait-il y avoir une sorte de génie maléfique utilisé pour cela? Mes excuses aux mods si je me suis égaré trop loin du cap.

Larryc
la source
6
Cela ressemble plutôt à une faille de l'API Win32, étant donné que l'invite de commande n'est plus "MS-DOS" depuis une vingtaine d'années maintenant.
Grawity
2
Fait intéressant, si j'essaie de supprimer le répertoire dans l'explorateur Windows, il se bloque lorsque je l'ai créé avec votre version. Lorsque je l'ai créé avec cygwin, il échoue simplement et le dit.
lucidbrot
J'ai un DOS 3.3 et un DOS 6.0 machines et les commandes fonctionnent sur eux. Quand ils sont passés en 32 bits, le problème était toujours là. cela fonctionne dans la fenêtre CMD à partir de win95 jusqu'à aujourd'hui, y compris toutes les versions de serveur. Maintenant que nous passons à Powershell, cela ne fonctionne plus. J'ai réalisé après avoir écrit que le répertoire était créé, mais il ne fournissait pas l'effet observé par le PO. Si j'essaye d'insérer un CD dans le répertoire avec quatre points, cela me fait simplement fuir.
Larryc
Sur mon ordinateur Windows 7 MD ....` only creates .... \ .... `arbre - il n'y a qu'une étape de récursivité.
Tomáš Zato
Curieusement, le gestionnaire FAR ne voit pas cela comme spécial, et crée / renomme / supprime / répertorie le contenu des répertoires nommés "lots de points" sans aucun problème.
RomanSt
-1

J'ai eu le même problème. Dans mon cas, il s’agissait d’une commande de frappe pour la publication .NET Core:

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

Il a créé le répertoire avec le nom '....', que je n'ai pas pu supprimer ou renommer. Ce répertoire a agi comme une référence au répertoire parent. Si je vais dans ce dossier, je suis toujours dans le dossier parent, mais le chemin est ajouté par '.... \'.

J'ai essayé toutes les commandes mentionnées dans cette rubrique, mais aucune d'entre elles n'a fonctionné. D'après ce que j'ai compris, cela s'est passé de la même manière, car j'avais d'autres fichiers et répertoires dans le répertoire parent. Je devais donc utiliser des paramètres capables de supprimer de manière récursive tout le contenu.

J'ai découvert que cette commande:

rmdir /s /q ....\

peut supprimer le répertoire '....'. Il supprime seulement la référence au répertoire parent, ce qui est en réalité ce répertoire '....', rien de plus, rien de moins. Malgré les arguments de la commande:

  • / s - supprime tout le contenu du répertoire supprimé,
  • / q - supprime sans confirmation,

le répertoire parent reste inchangé.

Mateusz
la source
Pouvez-vous préciser pourquoi la deuxième commande a fonctionné pour vous?
Burgi
Voter vers le bas parce que vous n'avez pas expliqué pourquoi la commande fonctionnait ou ce qu'elle faisait, tel que supprimer le répertoire, les sous-répertoires et les fichiers.
Winter Faulk
Cela supprime le répertoire avec le nom "....". Il supprime seulement la référence au répertoire parent, ce qui est en réalité ce répertoire '....', rien de plus, rien de moins. J'ai essayé toutes les commandes mentionnées dans cette rubrique, mais aucune d'entre elles ne fonctionne. Si j'ai bien compris, cette commande a fonctionné, car j'avais d'autres fichiers et répertoires dans le répertoire parent. Je devais donc utiliser des paramètres capables de supprimer de manière récursive tout le contenu. Malgré les arguments de la commande, le répertoire parent est resté inchangé.
Mateusz le
Je me suis retrouvé exactement dans la même situation avec Visual Studio et cette commande a sauvé mon bacon après des heures de frustration en essayant de comprendre ce qui se passait.
NPNelson le