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


198

Назва папки була вказана у Провіднику файлів із просто чотирма крапками .....

Коли я спробував її відкрити, я потрапив у якусь нескінченну петлю для кролячих ям, де я знову і знову відкривав ту саму папку - я міг це робити нескінченно. Показ шляху як C:\ExamplePath\....\....\....\....\....і т.д.

На ньому було видно мою компіляцію TypeScript в одному конкретному проекті. Перш ніж я знайшов цю папку та пов'язані з нею проблеми, мені знадобилося більше року, оскільки вона вкорінена глибоко вкладеними папками. Я ніколи не очікував подібного питання, тому не шукав його.

Я не міг видалити папку звичайним способом через спеціальну назву. Зрештою, я міг би її видалити, використовуючи командний рядок та видаливши батьківську папку за допомогою rd /s /q path.

Згодом я спробував створити папку ще раз, але не зміг зробити це як із File Explorer, так і з командним рядком.

За свої 20 років використання Windows я ніколи не бачив цієї помилки, тому можу уявити, що це дійсно буде прикрою і заплутаною проблемою для користувачів-любителів.

Хтось знає, як це могло статися і як відтворити це питання?

Оновлення

Для зацікавлених людей: цей шлях знаходився глибоко в папці TFS. Тому, ймовірно, TFS використовує метод bypass @grawity пояснено ( "Різні файлові менеджери, архіватори тощо" )

Я натрапив на рідкісну помилку TFS?


5
У наведених нижче відповідях детально описано, що відбувається, як це навмисно відтворити та як це виправити, але вони не згадують, чому це сталося. Оскільки ..його можна використовувати в шляху для позначення "перехід на одну папку", я б загрожував здогадом, що десь уздовж рядка якась програма чи сценарій об'єднали два рядки для створення шляху, один закінчився .., а наступний розпочався з .., і оскільки він використовував один із методів, згаданих нижче, йому вдалося створити шлях, навіть якщо у нього відсутній роздільник папок між ними.
3D1T0R

6
дивні речі також відбудуться, якщо ви створите папку з пробілами лише в її назві
phuclv

7
Це сервер в Інтернеті? Просто , щоб попередити вас , я регулярно бачу Hack спроби по Інтернету , з якими стикаються веб - сервера , що запитують: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Очевидно, що десь є вразливість, яку намагаються використати.
Енді Браун

4
@AndyBrown набагато ймовірніше, що це ..не так ..... Це просто спосіб пройти до \winntнезалежно від глибини початкової точки (веб-корінь), доки початкова точка не буде меншою ніж 9 рівнів. Він спирається на той факт, що перехід ..від кореневого каталогу залишає вас у кореневій директорії.
варення

5
@hobbs Це копія та вставка з журналу доступу Apache на Linux. Однозначно там 4 точки. Є й інші спроби взломання, які використовуються, ..тому я знайшов цю дивну.
Енді Браун

Відповіді:


303

Win32 не дозволяє створювати файли або папки з іменами, які закінчуються .- усі точки позбавлені кінця. Спроба створення test.створює testзамість цього. (Це для сумісності з 8,3 іменами у старому програмному забезпеченні епохи DOS / Win9x.)

Як результат, кожного разу, коли ви намагаєтеся отримати доступ до папки з назвою ...., її ім'я зменшується до порожньої рядка, і ви повертаєтесь до папки, в якій ви були раніше.

Ядро NT, однак, дозволяє такі імена. Існують різні механізми, які обходять обмеження імені файлів, накладені API Win32 - наприклад, WSL (підсистема Windows для Linux) не працює поверх Win32 і не впливає на неї. Існує також \\?\метод байпасу, навмисний "бекдор" для програм, які знають, що роблять. Хоча ви не можете створити C:\Example\....\, ви можете створити \\?\C:\Example\....\просто чудово.

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

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

Тож може бути одна з ваших програм:

  1. завжди використовує \\?\для доступу до файлів,
  2. випадково спробував створити папку з назвою ....- але це насправді неможливо точно знати після факту.

13
Ще один спосіб створення такої папки - це використання альтернативних потоків даних. На cmd : echo "" > ....::$INDEX_ALLOCATION. Це створить папку з назвою ....(все ще вказує на поточну папку).
WorldSEnder


124
Microsoft називає це "префіксом розширеного шляху", а шляхи з цим префіксом називаються "шляхи збільшеної довжини". (смішно: під час пошуку \\?\"у довідковому джерелі .NET це спричиняє помилку виконання на їх сервері).
dlatikay

2
@grawity Отже. . . як мені зараз піти про видалення цієї папки?
Shadow503

21
У мене був цікавий випадок «ремонт комп'ютера» клієнта, коли в будь-який момент клієнт зробив обліковий запис на будь-якій машині Windows, він буде працювати чудово, але як тільки він увійшов / перезавантажився, він не дозволив йому ввійти в його рахунок, а створити тимчасовий рахунок для сесія. Місцева майстерня з ремонту ПК була забита (зарядили його досі). Виявляється, його справжнє ім'я - Con &, він завжди використовував своє ім'я для свого облікового запису Windows ..... в той день я дізнався, що було більше, ніж просто com1чарівне ім'я файлу
RozzA

23

Окрім відповіді @ grawity, програма Win32 також може це зробити, зателефонувавши безпосередньо до "рідного" API. Якщо я не помиляюся, у цьому випадку це буде NtCreateDirectoryObject. Ці виклики в даний час досить добре зафіксовані, особливо їх аналог ядра (який ви не можете зателефонувати з програми Win32), у цьому випадку ZwCreateDirectoryObject.

Щодо "нескінченної глибини", простий спосіб досягти цього - використовувати посилання. Створіть каталог, потім всередині нього, створіть до нього з'єднання (можна використовувати, mklink /jнаприклад), і ви отримаєте дуже глибоку структуру. Востаннє, коли я робив це в Windows 2000, рекурсія закінчилася, хоча (не можна було «копати нескінченно»). Можливо, на новіших ОС ліміт більший або видалений, також ви можете створити, скажімо, 10 каталогів, кожен з яких є дитиною попереднього, а в 10-му - створити посилання назад до першого.


4
Це дуже можливо злий геніальний матеріал саме там ...
Agi Hammerthief

1
Я скопіював подібні до цього повні каталоги, щоб штучно заповнити диск для тестування, щоб можна було визначити, коли він був близьким до встановленого ліміту.
mickeyf

Можна також відтворити за допомогою cygwin'smkdir ....
lucidbrot

18

Існує простіший спосіб створення каталогу. З командного рядка введіть:

MD ....\

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

У MS-DOS є недолік, який переходить до версії 1.0. МС знає про це вже деякий час, але не зміг або не зміг цього виправити. Вони виправили проблему з PowerShell.

До речі, якщо ви спробуєте:

RD ....

Видалити не вдасться. Щоб видалити його, потрібно використовувати цей специфічний синтаксис.

RD ....\

Я використовую це на певних серверах, якими я адмініструю. Я часто створюю папку користувача в корені диска, і не хочу, щоб інший адміністратор збирався і видаляв її.

Тож я зайду всередину своєї папки і створу підпапку під назвою CON, AUX або LPT тощо.

Якщо інший адміністратор хоче видалити мою папку, вони повинні знати, як видалити цю папку.

EDIT: Я думав про цю дискусію сьогодні вранці, і вирішив зробити цей крок далі. Я припускаю, що модники вирішать, чи це актуально.

Я не можу записати компакт-диск у папку.

Подумайте, якщо я MD c: \ test, тоді CD C: \ test і MD .... \ я закінчую C: \ test ....

і все добре.

Але CD .... виходить з ладу і повертає мене до C: \ test. (CD .... \ робить те саме.)

Однак я можу ДИР .... і отримати список реєстру. Я також можу

MD C: \ test .... \ temp, і він створює цей підрежир у ....

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

Але перебуваючи в C: \ test .... \ temp, якщо я CD .. Я знову в C: \ test.

Я не можу вписатись у цей каталог, але я можу маніпулювати папкою, створюючи підпапки, і досить цікаво щось подібне

ECHO "Тестування" >> C: \ test .... \ test.txt

також працює і створює файл у цій папці. Тож я можу створити папку з чотирма крапками, я можу додати до неї файли та папки, можу отримати списки редакторів, але я не можу CD до неї. Чи може бути для цього якийсь злий геній? Вибачте за модників, якщо я занадто далеко відмовився від курсу.


6
Це швидше звучить як недолік API Win32, враховуючи, що командний рядок вже не є "MS-DOS" вже близько двадцяти років.
grawity

2
Цікаво, що якщо я спробую видалити каталог у Windows Explorer, він виходить з ладу, коли я створив його з вашою версією. Коли я створив це з cygwin, він просто провалюється і так говорить.
lucidbrot

У мене є машини DOS 3.3 і DOS 6.0 і команди працюють на них. Коли вони перейшли на 32 біт, проблема все ще була. вона працює у вікні CMD від win95 аж до сьогодні, включаючи всі версії сервера. Тепер, коли ми переходимо на Powershell, це більше не працює. Я зрозумів, як написав, що це створює каталог, але це не дає ефекту, який бачив ОП. Якщо я спробую записати компакт-диск у каталог із чотирма крапками, це просто відштовхує мене.
Ларрік

На моїй машині Windows 7 MD ....` only creates .... \ .... `дерево - є лише один крок рекурсії.
Томаш Зато

Цікаво, що менеджер FAR не розглядає це як особливе, і створює / перейменовує / видаляє / перелічує вміст каталогів під назвою "багато крапок" без проблем.
RomanSt

-1

У мене була така ж проблема. У моєму випадку це була помилка друку в команді для публікації .NET Core:

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

Він створив каталог з назвою "....", який я не зміг видалити або перейменувати. Цей каталог діяв як посилання на батьківський каталог. Якщо я заходжу всередину цієї папки, я все ще був у батьківській папці, але шлях додав ".... \".

Я спробував усі команди, згадані в цій темі, але жодна з них не спрацювала. На мій погляд, це діяло так, тому що у мене були інші файли та каталоги в батьківському каталозі, тому мені довелося використовувати параметри, які можуть рекурсивно видаляти весь вміст.

Я дізнався, що ця команда:

rmdir /s /q ....\

може видалити каталог "....". Він видаляє лише посилання на батьківський каталог, який цей каталог "...." насправді є, ні більше, ні менше. Незважаючи на аргументи команд:

  • / s - видаляє весь вміст із видаленого каталогу,
  • / q - видаляє без підтвердження,

батьківський каталог залишався недоторканим.


Чи можете ви уточнити, чому друга команда працювала для вас?
Бургі

Відмова від голосування, оскільки ви не давали пояснень, чому працює команда або що вона робить, наприклад, видаляє каталог, підкаталоги та файли.
Зимовий Фолк

Це фактично видаляє каталог з назвою "....". Він видаляє лише посилання на батьківський каталог, який цей каталог "...." насправді є, ні більше, ні менше. Я спробував усі команди, згадані в цій темі, але жодна з них не працює. На моє розуміння, ця команда спрацювала, оскільки у мене були інші файли та каталоги в батьківському каталозі, тому мені довелося використовувати параметри, які можуть рекурсивно видаляти весь вміст. Незважаючи на аргументи команд, батьківський каталог залишався недоторканим.
Матеуш

Я потрапив у цю саме таку ситуацію разом із Visual Studio, і ця команда врятувала моє бекон після годинних розладів, намагаючись з’ясувати, що відбувається.
NPNelson
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.