На моей машине с Windows у меня была папка с именем из четырех точек, которая действовала как некая кроличья нора - как это случилось?

34653
Dirk Boer

Имя папки было указано в проводнике с четырьмя точками .....

Когда я попытался открыть его, я попал в какую-то бесконечную петлю кроличьей норы, где я снова и снова открывал одну и ту же папку - я мог делать это бесконечно. Отображение пути как C:\ExamplePath\....\....\....\....\....и т. Д.

Он повесил мою компиляцию TypeScript в одном конкретном проекте. У меня ушло больше года, прежде чем я нашел эту папку и связанные с ней проблемы, потому что она глубоко укоренилась во вложенных папках. Я никогда не ожидал такой проблемы, поэтому никогда не искал ее.

Я не мог удалить папку обычным способом из-за специального имени. В конце концов, я могу удалить его, используя командную строку и удалив родительскую папку с помощью rd /s /q path.

После этого я снова попытался создать папку, но не смог сделать это ни с помощью Проводника, ни с помощью командной строки.

За 20 с лишним лет использования Windows я никогда раньше не сталкивался с этой ошибкой, поэтому могу себе представить, что это действительно будет раздражающей и запутанной проблемой для пользователей-любителей.

Кто-нибудь знает, как это могло произойти и как воспроизвести эту проблему?

Обновить

Для людей, которые заинтересованы: этот путь находится глубоко в папке TFS. Так что, вероятно, TFS использует метод обхода, объясненный @grawity ( «Различные файловые менеджеры, архиваторы и т. Д.» )

Я наткнулся на редкую ошибку TFS?

196
Ответы ниже подробно описывают, что происходит, как преднамеренно воспроизвести и как это исправить, но они не упоминают, почему это произошло. Поскольку `..` может использоваться в пути для обозначения« перейти на одну папку », я рискну предположить, что где-то вдоль строки, какая-то программа или скрипт объединяют две строки для создания пути, одна из которых заканчивается` ..` , а следующий начался с `..`, и поскольку он использовал один из методов, упомянутых ниже, ему удалось создать путь, даже при том, что между ними отсутствовал разделитель папок. 3D1T0R 6 лет назад 5
странные вещи также произойдут, если вы создадите папку, в названии которой будут только пробелы phuclv 6 лет назад 5
Этот сервер в интернете? Просто чтобы предупредить вас, я регулярно вижу попытки взлома интернет-серверов с запросами: `GET / .... \\ .... \\ .... \\ .... \\ .... \\. ... \\ .... \\ .... \\ .... \\ WINNT \\ win.ini`. Очевидно, что где-то есть / была какая-то уязвимость, которую он пытается использовать. Andy Brown 6 лет назад 6
@AndyBrown гораздо более вероятно, что это `..`, а не` .... `. Это просто способ перейти к `\ winnt` независимо от глубины начальной точки (веб-корня), если начальная точка имеет глубину менее 9 уровней. Он основан на том факте, что выход `..` из корневого каталога оставляет вас в корневом каталоге. hobbs 6 лет назад 4
@hobbs Да, но веб-серверы часто проверяют наличие `..` user20574 6 лет назад 0
@hobbs Это копия и вставка из журнала доступа Apache в Linux. Определенно 4 точки там. Существуют и другие попытки взлома, которые _do_ используют `..`, поэтому я нашел это довольно странным. Andy Brown 6 лет назад 5
@AndyBrown: было _was, _ [почти два десятилетия назад.] (Https://www.kb.cert.org/vuls/id/111677) Последней ОС, установленной по умолчанию в `C: \ WINNT`, была Windows 2000 Но даже для этого использовалось бы `..`, а не любое другое количество точек. grawity 6 лет назад 3
Существует весьма актуальный xkcd (# 981), но, учитывая, что название слегка NSFW, я не собираюсь прямо связывать его здесь ... tonysdg 6 лет назад 3

3 ответа на вопрос

302
grawity

Win32 не позволяет создавать файлы или папки с именами, заканчивающимися на .- все точки удаляются с конца. Попытка создания test.делает testпоявление вместо этого. (Это для совместимости с именами 8.3 в старом программном обеспечении эпохи DOS / Win9x.)

В результате, когда вы пытаетесь получить доступ к папке с именем ...., ее имя сводится к пустой строке, и вы возвращаетесь к папке, в которой вы были раньше.

Ядро NT, однако, допускает такие имена. Существуют различные механизмы, которые обходят ограничения имен файлов, налагаемые API-интерфейсами Win32 - например, WSL (Windows Subsystem для Linux) не работает поверх Win32 и не подвержен его влиянию. Существует также \\?\метод обхода, намеренный «черный ход», оставленный для программ, которые знают, что они делают. Даже если вы не можете создать C:\Example\....\, вы можете создать \\?\C:\Example\....\просто отлично.

Также вы можете удалить такие каталоги с помощью rmdir \\?\C:\path\...Cmd (я еще не тестировал PowerShell).

Различные файловые менеджеры, архиваторы и т. Д. Могут использовать этот \\?\метод, чтобы иметь возможность использовать более длинные пути, чем обычно, - и при этом на них также не влияет код совместимости в Win32; они обходят удаление точек, а также перевод волшебных имен файлов, таких как CONили NUL.

Так что это может быть одна из ваших программ:

  1. всегда использует \\?\для доступа к файлам,
  2. случайно попытался создать папку с именем ....- но на самом деле невозможно узнать наверняка после факта.
Другой способ создания файлов / папок с именами «ПЛОХО» - на компьютере с Linux или Mac на общем файловом ресурсе, размещенном на компьютере с Windows. Tonny 6 лет назад 0
Другой способ создания такой папки - использование альтернативных потоков данных. На cmd: `echo" "> .... :: $ INDEX_ALLOCATION`. Это создаст папку с именем `....` (все еще указывая на текущую папку). WorldSEnder 6 лет назад 13
Интересно, что теперь кто-то просто должен установить это в виртуальной машине Windows 98 .. pipe 6 лет назад 0
@DirkBoer Я нашел это: https://docs.microsoft.com/en-us/dotnet/standard/io/file-path-formats#skipping-normalization user31389 6 лет назад 2
Microsoft называет это «расширенным префиксом пути», а пути с этим префиксом называются «путями расширенной длины». (забавно: при поиске `\\? \" `в .NET [источник ссылки] (https://referencesource.microsoft.com/#q=%5C%5C%3F%5C%22) это вызывает ошибка времени выполнения на их сервере). dlatikay 6 лет назад 124
@ Grawity Так. , , как мне теперь удалить эту папку? Shadow503 6 лет назад 2
@DirkBoer http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx grawity 6 лет назад 1
@WorldSEnder: Ну, это просто зло. grawity 6 лет назад 1
Наслаждайтесь вашим каталогом с именем \. (Да, это возможно, но не в одиночку.) Joshua 6 лет назад 1
У меня был любопытный случай клиента «ремонт компьютера», когда всякий раз, когда клиент создавал учетную запись на любом компьютере с Windows, он работал бы просто отлично, но как только он вошел в систему / перезагрузился, он не пустил бы его в свою учетную запись, вместо этого создав временную учетную запись для сессия. Местная мастерская по ремонту ПК была поставлена ​​в тупик (по-прежнему обвиняла его). Оказывается, его настоящее имя Con, и он всегда использовал его имя для своей учетной записи Windows ..... в тот день я узнал, что в качестве волшебного имени файла было больше, чем просто `com1` RozzA 6 лет назад 21
@RozzA - Интересно. Вот вопрос SU о той же проблеме: https://superuser.com/questions/915779/cannot-create-user-account-named-con-under-windows-7 Pikamander2 6 лет назад 2
Windows 8 не позволяет мне называть мою папку `....` :( Black Thunder 6 лет назад 0
Я полагаю, что функция [NtCreateFile ()] (https://docs.microsoft.com/en-us/windows/desktop/api/winternl/nf-winternl-ntcreatefile) может создать эту папку без проблем. hanshenrik 6 лет назад 2
@dlatikay Глядя на трассировку, она должна быть исправлена ​​в [this] (https://github.com/KirillOsenkov/SourceBrowser/commit/c1a621e41121d5ce65d9877857b4e8e7707b661e) коммите. user202729 6 лет назад 0
@ BlackThunder Вы читали ответ? Вы не должны быть в состоянии создать его обычными способами. wizzwizz4 6 лет назад 0
@ wizzwizz4 Да. Black Thunder 6 лет назад 0
Как ни странно, моему отцу пришлось иметь дело с подобной проблемой много лет назад. Мой брат установил DOOM (с 1993 года) на домашнем ПК. Это было, вероятно, около 1995 года, когда это произошло. Установщик как-то ввел коррупцию. Мой папа обнаружил, что C: \ содержит все обычные папки (C: \ DOS, C: \ WIN и т. Д.), А также сотни идентичных папок C: \ DOOMDATA. В каждой подпапке также была «копия» любой другой папки (поэтому в C: \ WIN была копия C: \ WIN, C: \ DOS и всех папок DOOMDATA). Странно думать, что у нас были символические ссылки, прежде чем символические ссылки стали чем-то особенным. XD zaTricky 6 лет назад 1
22
user1532080

В дополнение к ответу @ grawity, программа Win32 также может сделать это, напрямую вызвав «нативный» API. Если я не ошибаюсь, в данном случае это будет NtCreateDirectoryObject. Эти вызовы довольно хорошо документированы в настоящее время, особенно их аналог ядра (который вы не можете вызвать из программы Win32), в данном случае, ZwCreateDirectoryObject.

Что касается «бесконечной глубины», простой способ достичь этого - использовать ссылки. Создайте каталог, затем внутри него создайте соединение с ним (вы можете использовать, mklink /jнапример), и вы получите очень глубокую структуру. В последний раз, когда я делал это на Windows 2000, рекурсия была окончена (вы не могли «копать бесконечно»). Возможно, на более новых ОС предел больше или удален, также вы можете создать, скажем, 10 каталогов, каждый из которых является дочерним по отношению к предыдущему, а в 10-м - создать ссылку на первую.

Это очень возможно злой гений материал прямо там ... Agi Hammerthief 6 лет назад 3
Я скопировал полные каталоги аналогично этому, чтобы искусственно заполнить диск для тестирования, чтобы определить, когда он был близок к установленному пределу. mickeyf 6 лет назад 1
Также возможно воспроизвести с помощью Cygwin `MKDIR ....` lucidbrot 6 лет назад 0
17
Larryc

Существует более простой способ создания каталога. Из командной строки введите:

MD ....\

и нажмите Enter, он создаст каталог с четырьмя точками. Этот каталог также доступен для просмотра в проводнике.

В MS-DOS есть недостаток, который восходит к версии 1.0. MS знал об этом в течение некоторого времени, но не мог или не хотел бы это исправить. Они исправили проблему с PowerShell.

Кстати, если вы попробуете:

RD ....

Это не удастся удалить. Вы должны использовать этот специфический синтаксис, чтобы удалить его.

RD ....\

Я использую это на определенных серверах, которые я администратор. Я часто создаю папку пользователя в корне диска и не хочу, чтобы другой администратор пришел и удалил ее.

Поэтому я зайду в свою папку и создаю подпапку с именем CON, AUX или LPT и т. Д.

Если другой администратор хочет удалить мою папку, он должен знать, как удалить эту подпапку.

РЕДАКТИРОВАТЬ: я думал об этой дискуссии сегодня утром, и я решил сделать еще один шаг вперед. Я предполагаю, что моды решат, если это актуально.

Я не могу записать CD в папку.

Подумайте, если я MD c: \ test, то CD C: \ test и MD .... \ Я получаю C: \ test ....

и все хорошо.

Но CD .... терпит неудачу и пинает меня обратно в C: \ test. (CD .... \ делает то же самое.)

Однако я могу DIR .... и получить список DIR. я тоже могу

MD C: \ test .... \ temp и создает этот подкаталог в ....

Я также могу CD C: \ test .... \ temp и перейти в этот подподкаталог.

Но пока я в C: \ test .... \ temp, если я CD ... я снова в C: \ test.

Я не могу перейти в этот каталог, но я могу управлять папкой, создавая подпапки, и достаточно интересно что-то вроде

ЭХО "Тестирование" >> C: \ test .... \ test.txt

также работает и создает файл в этой папке. Таким образом, я могу создать папку с четырьмя точками, я могу добавить в нее файлы и папки, я могу получить списки каталогов, но я не могу вставить в нее компакт-диск. Может ли быть какой-то злой гений использовать для этого? Мои извинения модам, если я отклонился слишком далеко от курса.

Это скорее звучит как недостаток Win32 API, учитывая, что командная строка больше не была "MS-DOS" больше двадцати лет назад. grawity 6 лет назад 6
Интересно, что если я пытаюсь удалить каталог в проводнике Windows, он вылетает, когда я создал его с вашей версией. Когда я создал его с помощью Cygwin, он просто терпит неудачу и говорит так. lucidbrot 6 лет назад 2
У меня есть машины DOS 3.3 и DOS 6.0, и на них работают команды. Когда они переключились на 32 бит, проблема все еще была. он работает в окне CMD от win95 вплоть до сегодняшнего дня, включая все версии сервера. Теперь, когда мы переходим на Powershell, он больше не работает. После того, как я написал, я понял, что он создает каталог, но не дает того эффекта, который видит OP. Если я попытаюсь записать CD в каталог с четырьмя точками, это просто выгонит меня обратно. Larryc 6 лет назад 0
На моем компьютере с Windows 7 `MD .... \` создает только дерево `.... \ ....` - существует только один шаг рекурсии. Tomáš Zato 6 лет назад 0
Любопытно, что [менеджер FAR] (https://www.farmanager.com/) не видит в этом ничего особенного и создает / переименовывает / удаляет / перечисляет содержимое каталогов с именем «много точек» без проблем в все. RomanSt 6 лет назад 0
Получаете ли вы тот же результат с `.. \ ..`, то есть с файлом с префиксом имени `.. \.` И пустым суффиксом, который DOS будет отображать как "...."? Eric Towers 5 лет назад 0