題 在我的Windows機器上,我有一個名為四個點的文件夾,就像某種兔子洞一樣 - 這是怎麼發生的?


文件夾名稱列在文件資源管理器中,只有四個點 ....

當我嘗試打開它時,我進入了某種無盡的兔子洞循環,我一次又一次打開完全相同的文件夾 - 我可以無休止地做到這一點。顯示路徑 C:\ExamplePath\....\....\....\....\....

它將我的TypeScript編譯掛在一個特定的項目中。我找到這個文件夾及其相關問題花了一年多的時間,因為它深深植根於嵌套文件夾。我沒想到會出現這樣的問題,所以我從來沒有找過它。

由於特殊名稱,我無法以正常方式刪除文件夾。最後,我可以使用命令行刪除它並刪除父文件夾 rd /s /q path

之後,我嘗試再次創建該文件夾,但無法使用文件資源管理器和命令行。

在我使用Windows的20多年裡,我以前從未見過這個bug,所以我可以想像這對於業餘用戶來說真的是一個煩人且令人困惑的問題。

有誰知道這怎麼可能發生以及如何重現這個問題?

更新

對於感興趣的人:此路徑位於TFS文件夾的深處。所以TFS可能會使用旁路方法@grawity解釋(“各種文件管理器,存檔器等”

我偶然發現了罕見的TFS錯誤嗎?


191
2017-10-31 08:03


起源


下面的答案詳細說明了正在發生的事情,如何有意識地重現它,以及如何解決它,但他們沒有提到它為什麼會發生。以來 .. 可以用在一個路徑來指示'上一個文件夾',我會冒險猜測,在某個地方,一些程序或腳本連接兩個字符串來創建一個路徑,一個以 ..,接下來就開始了 ..,並且由於它使用了下面提到的技術之一,它成功創建了路徑,即使它缺少它們之間的文件夾分隔符。 - 3D1T0R
如果您創建一個名稱中只包含空格的文件夾,也會發生奇怪的事情 - phuclv
這台服務器在互聯網上嗎?只是為了警告你我經常看到面向互聯網的Web服務器的黑客嘗試請求: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini。很明顯,這是一個漏洞,它試圖利用這個漏洞。 - Andy Brown
@AndyBrown更有可能 ..不是 ....。這只是一種遍歷的方式 \winnt 無論起點的深度(網絡根),只要起點低於9級深。它依賴於去的事實 .. 從根目錄離開您的根目錄。 - hobbs
@hobbs這是來自linux上的Apache訪問日誌的複制和粘貼。那里肯定有4個點。還記錄了其他黑客嘗試 做 使用 .. 這就是為什麼我發現這個很奇怪的原因。 - Andy Brown


答案:


Win32不允許您創建名稱以。結尾的文件或文件夾 .  - 所有點都從末端剝離。試圖創造 test. 品牌 test 而是出現。 (這是為了與舊DOS / Win9x時代軟件中的8.3名稱兼容。)

因此,每當您嘗試訪問名為的文件夾時 ....,它的名字減少為空字符串,你回到之前的文件夾。

但是,NT內核確實允許這樣的名稱。有許多機制可以繞過Win32 API強加的文件名限制 - 例如,WSL(適用於Linux的Windows子系統)不能在Win32之上運行,並且不受它的影響。還有 \\?\ 旁路法, 一個故意的“後門”留給那些知道他們正在做什麼的節目。即使你無法創造 C:\Example\....\,你 能夠 創建 \\?\C:\Example\....\ 正好。

同樣,您可以刪除此類目錄 rmdir \\?\C:\path\... 來自Cmd(我還沒有用PowerShell測試過)。

各種文件管理器,存檔器等可能會使用 \\?\ 方法是為了能夠使用比平時更長的路徑名 - 並且通過這樣做,它們也不受Win32中的兼容性代碼的影響;他們繞過點剝離,以及魔術文件名的翻譯 CON 要么 NUL

所以它可能是你的一個程序:

  1. 總是使用 \\?\ 訪問文件,
  2. 不小心試圖創建一個名為的文件夾 ....  - 但事實並非確實無法確切知道。

295
2017-10-31 09:19



另一種創建此類文件夾的方法是使用備用數據流。在cmd上: echo "" > ....::$INDEX_ALLOCATION。這將創建一個名為的文件夾 .... (仍然指向當前文件夾)。 - WorldSEnder
@DirkBoer我發現了這個: docs.microsoft.com/en-us/dotnet/standard/io/... - user31389
Microsoft稱之為“擴展路徑前綴”,具有該前綴的路徑稱為“擴展長度路徑”。 (搞笑:當你搜索 \\?\" 在.NET中 參考源,它會導致服務器上的運行時錯誤)。 - dlatikay
@grawity所以。 。 。我該如何刪除此文件夾呢? - Shadow503
我有一個好奇的'電腦維修'客戶案例,任何時候客戶在任何一台Windows機器上開帳戶,它會工作得很好但是一旦他登錄/重新啟動它就不會讓他進入他的帳戶,而是為他創建一個臨時帳戶會話。當地的電腦維修店很難過(他還是收費)。結果他的實際名字是Con&他總是用他的名字作為他的Windows帳戶.....那天我學到的不僅僅是 com1 作為魔術文件名 - RozzA


除了@ grawity的答案之外,Win32程序還可以通過直接調用“native”API來完成此操作。如果我沒有弄錯,在目前的情況下,那將是NtCreateDirectoryObject。這些調用現在已經有了很好的文檔記錄,特別是它們的內核版本(你不能從Win32程序調用),在本例中是ZwCreateDirectoryObject。

關於“無盡的深度”,實現這一目標的簡單方法是使用鏈接。 創建一個目錄,然後在其中創建一個目錄(你可以使用 mklink /j 例如),你將得到一個非常深的結構。上次我這樣做是在Windows 2000上,雖然結束了遞歸(你無法“無限地挖掘”)。可能在較新的操作系統上,限制更大或被刪除,你也可以創建10個目錄,每個目錄都是前一個的子項,在第10個目錄中,創建一個返回第一個目錄的鏈接。


22
2017-10-31 13:28



那可能是邪惡的天才材料...... - Agi Hammerthief
我已經復制了與此類似的完整目錄,以人工填充光盤以便測試能夠確定它何時接近設定限制。 - mickeyf
也可以使用cygwin重現 mkdir .... - lucidbrot


有一種更簡單的方法來創建目錄。 從命令提示符下鍵入:

MD ....\

並按Enter鍵,它將創建一個帶有四個點的目錄。 此目錄也可以使用資源管理器查看。

MS-DOS中存在一個缺陷,可以追溯到1.0版本。 MS已經知道了一段時間但不能或不會解決它。 他們已經使用PowerShell糾正了這個問題。

順便說一句,如果你嘗試:

RD ....

它將無法刪除。您需要使用此特定語法來刪除它。

RD ....\

我在我管理的某些服務器上使用它。我經常在磁盤的根目錄上創建一個用戶文件夾,我不希望其他管理員出現並刪除它。

所以我將進入我的文件夾並創建一個名為CON,AUX或LPT等的子文件夾...

如果其他管理員想要刪除我的文件夾,他們需要知道如何首先刪除此子文件夾。


16
2017-11-02 03:07



這聽起來像是一個Win32 API缺陷,因為命令提示已經不再是“MS-DOS”了大約二十年了。 - grawity
有趣的是,如果我嘗試刪除Windows資源管理器中的目錄,它會在我使用您的版本創建它時崩潰。當我用cygwin創建它時,它只是失敗並且這樣說。 - lucidbrot
我有一個DOS 3.3和DOS 6.0機器和命令工作。當他們切換到32位時,問題仍然存在。它在從win95一直到今天的CMD窗口中工作,包括所有服務器版本。現在我們正在切換到Powershell它不再有效。我在寫完之後意識到它確實創建了目錄,但它沒有提供OP看到的效果。如果我嘗試將CD放入帶有四個點的目錄中,它就會把我踢回去。 - Larryc
在我的Windows 7機器上 MD ....` only creates .... \ ....`tree - 只有一步遞歸。 - Tomáš Zato