Di mesin Windows saya, saya punya folder dengan nama empat titik yang bertindak seperti semacam lubang kelinci - bagaimana itu bisa terjadi?

198

Nama folder terdaftar di File Explorer hanya dengan empat titik .....

Ketika saya mencoba membukanya, saya masuk ke semacam lingkaran lubang kelinci tanpa akhir di mana saya membuka folder yang sama berulang-ulang - saya bisa melakukan ini tanpa henti. Menampilkan jalan seperti C:\ExamplePath\....\....\....\....\...., dll.

Itu menggantung kompilasi TypeScript saya di satu proyek tertentu. Butuh waktu lebih dari setahun sebelum saya menemukan folder ini dan masalah yang terkait, karena itu berakar dalam di folder bersarang. Saya tidak pernah mengharapkan masalah seperti ini, jadi saya tidak pernah mencarinya.

Saya tidak bisa menghapus folder dengan cara biasa karena nama khusus. Pada akhirnya, saya bisa menghapusnya dengan menggunakan baris perintah dan menghapus folder induk dengan rd /s /q path.

Setelah itu, saya mencoba membuat folder lagi tetapi tidak dapat melakukannya dengan File Explorer dan baris perintah.

Dalam 20 tahun lebih saya menggunakan Windows saya belum pernah melihat bug ini sebelumnya, jadi saya bisa membayangkan bahwa itu benar-benar akan menjadi masalah yang mengganggu dan membingungkan bagi pengguna amatir.

Adakah yang tahu bagaimana ini bisa terjadi dan bagaimana mereproduksi masalah ini?

Memperbarui

Untuk orang yang tertarik: jalur ini terletak jauh di dalam folder TFS. Jadi mungkin TFS menggunakan metode bypass @grawity menjelaskan ( "Berbagai manajer file, pengarsipan, dll" )

Apakah saya menemukan bug TFS yang langka?

Dirk Boer
sumber
5
Jawaban di bawah merinci apa yang terjadi, bagaimana memperbanyaknya dengan sengaja, dan bagaimana memperbaikinya, tetapi mereka tidak menyebutkan mengapa itu terjadi. Karena ..dapat digunakan di jalur untuk menunjukkan 'naik satu folder', saya akan menebak bahwa di suatu tempat di sepanjang garis, beberapa program atau skrip menggabungkan dua string untuk membuat jalur, satu berakhir dengan .., dan yang berikutnya dimulai dengan .., dan karena menggunakan salah satu teknik yang disebutkan di bawah, itu berhasil membuat jalan, meskipun tidak ada pemisah folder di antara mereka.
3D1T0R
6
hal-hal aneh juga akan terjadi jika Anda membuat folder dengan hanya spasi dalam namanya
phuclv
7
Apakah server ini ada di internet? Hanya untuk memperingatkan Anda saya secara teratur melihat upaya hack di internet menghadapi server web yang meminta: GET /....\\....\\....\\....\\....\\....\\....\\....\\....\\winnt\\win.ini. Jelas ada / beberapa kerentanan di suatu tempat yang coba dieksploitasi.
Andy Brown
4
@AndyBrown lebih mungkin itu .., bukan ..... Ini hanyalah sebuah cara untuk dilalui \winntterlepas dari kedalaman titik awal (akar web), asalkan titik awalnya kurang dari 9 level. Itu bergantung pada fakta bahwa pergi ..dari direktori root membuat Anda di direktori root.
hobbs
5
@ hobbs Itu adalah salin dan tempel dari log akses Apache di linux. Jelas ada 4 titik di sana. Ada upaya hack lain login yang melakukan penggunaan ..yang adalah mengapa saya menemukan satu ini agak aneh.
Andy Brown

Jawaban:

303

Win32 tidak membiarkan Anda membuat file atau folder dengan nama yang diakhiri .- semua titik dilucuti dari ujung. Sebaliknya, mencoba membuat test.penampilan testmuncul. (Ini untuk kompatibilitas dengan 8,3 nama dalam perangkat lunak era DOS / Win9x lama.)

Akibatnya, setiap kali Anda mencoba mengakses folder bernama ...., namanya akan dikurangi menjadi string kosong, dan Anda kembali ke folder tempat Anda berada sebelumnya.

Namun, kernel NT mengizinkan nama-nama tersebut. Ada berbagai mekanisme yang memotong batasan nama file yang dipaksakan oleh Win32 API - misalnya, WSL (Windows Subsystem untuk Linux) tidak berjalan di atas Win32 dan tidak terpengaruh olehnya. Ada juga \\?\metode bypass, "pintu belakang" yang disengaja yang tersisa untuk program yang tahu apa yang mereka lakukan. Meskipun Anda tidak dapat membuat C:\Example\....\, Anda dapat membuatnya dengan \\?\C:\Example\....\baik.

Anda juga dapat menghapus direktori seperti itu rmdir \\?\C:\path\...dari Cmd (saya belum pernah menguji dengan PowerShell).

Berbagai manajer file, pengarsip, dll. Mungkin menggunakan \\?\metode ini agar dapat menggunakan nama jalur yang lebih panjang dari biasanya - dan dengan melakukannya, mereka juga tidak terpengaruh oleh kode kompatibilitas dalam Win32; mereka memotong dot stripping, serta terjemahan nama file ajaib seperti CONatau NUL.

Jadi bisa jadi itu salah satu program Anda:

  1. selalu digunakan \\?\untuk mengakses file,
  2. tidak sengaja mencoba membuat folder bernama ....- tetapi itu tidak benar-benar mungkin untuk mengetahui dengan pasti setelah fakta.
grawity
sumber
13
cara lain untuk membuat folder seperti itu adalah dengan menggunakan aliran data alternatif. Pada cmd: echo "" > ....::$INDEX_ALLOCATION. Ini akan membuat folder bernama ....(masih menunjuk ke folder saat ini).
WorldSEnder
2
@DirkBoer Saya menemukan ini: docs.microsoft.com/en-us/dotnet/standard/io/…
user31389
124
Microsoft menyebutnya "Awalan Jalur Diperpanjang", dan jalur dengan awalan itu disebut "jalur panjang-panjang". (lucu: ketika Anda mencari \\?\"di sumber referensi .NET , itu menyebabkan kesalahan runtime di server mereka).
dlatikay
2
@ kegembiraan Jadi. . . bagaimana cara saya menghapus folder ini sekarang?
Shadow503
21
Saya memiliki kasus klien 'perbaikan komputer' yang penasaran di mana kapan saja klien membuat akun di mesin windows mana pun, itu akan bekerja dengan baik, tetapi begitu dia login / reboot tidak akan membiarkannya masuk ke akunnya, alih-alih membuat akun temporer untuk sidang. Toko pc-perbaikan lokal bingung (dikenakan biaya masih). Ternyata nama aslinya adalah Con & dia selalu menggunakan namanya untuk akun windows-nya ..... pada hari itu aku belajar ada lebih dari sekedar com1nama file ajaib
RozzA
23

Selain jawaban @ grawity, program Win32 juga dapat melakukan ini dengan memanggil API "asli" secara langsung. Jika saya tidak salah, dalam kasus ini, itu adalah NtCreateDirectoryObject. Panggilan-panggilan tersebut didokumentasikan dengan cukup baik saat ini, terutama rekan kernelnya (yang tidak dapat Anda panggil dari program Win32), dalam hal ini, ZwCreateDirectoryObject.

Mengenai "kedalaman tanpa akhir", cara mudah untuk mencapai ini adalah dengan menggunakan tautan. Buat direktori, lalu di dalamnya, buat persimpangan untuk itu (Anda dapat menggunakan mklink /jmisalnya), dan Anda akan berakhir dengan struktur yang sangat dalam. Terakhir kali saya melakukan ini pada Windows 2000, ada akhir rekursi (Anda tidak bisa "menggali tanpa batas"). Mungkin pada OS yang lebih baru batasnya lebih besar atau dihapus, Anda juga dapat membuat katakanlah 10 direktori masing-masing menjadi anak dari yang sebelumnya, dan di yang ke-10, buat tautan kembali ke yang pertama.

pengguna1532080
sumber
4
Itu sangat mungkin bahan jenius jahat di sana ...
Agi Hammerthief
1
Saya telah menyalin direktori lengkap yang serupa dengan ini untuk secara artifisial mengisi disk untuk pengujian yang dapat menentukan kapan itu dekat dengan batas yang ditentukan.
mickeyf
Anda juga dapat mereproduksi menggunakan cygwinmkdir ....
lucidbrot
18

Ada cara yang lebih mudah untuk membuat direktori. Dari jenis prompt perintah:

MD ....\

dan tekan enter, itu akan membuat direktori dengan empat titik. Direktori ini juga dapat dilihat dengan explorer.

Ada kekurangan dalam MS-DOS yang kembali ke versi 1.0. MS telah mengetahuinya selama beberapa waktu tetapi tidak bisa atau tidak mau memperbaikinya. Mereka telah memperbaiki masalah dengan PowerShell.

BTW, jika Anda mencoba:

RD ....

Ini akan gagal dihapus. Anda perlu menggunakan sintaksis khusus ini untuk menghapusnya.

RD ....\

Saya menggunakan ini pada server tertentu yang saya admin. Saya sering membuat folder pengguna di root disk dan saya tidak ingin administrator lain datang dan menghapusnya.

Jadi saya akan masuk ke dalam folder saya dan membuat subfolder bernama CON, AUX, atau LPT, dll ...

Jika Admin lain ingin menghapus folder saya, mereka harus tahu cara menghapus subfolder ini terlebih dahulu.

EDIT: Saya sedang memikirkan diskusi ini pagi ini dan saya memutuskan untuk mengambil satu langkah lebih jauh. Saya menganggap mod akan memutuskan apakah ini relevan.

Saya tidak dapat memasukkan CD ke folder.

Pertimbangkan, jika saya MD c: \ test maka CD C: \ test dan MD .... \ Saya berakhir dengan C: \ test ....

dan semuanya baik-baik saja.

Tapi CD .... gagal dan menendang saya kembali ke tes C: \. (CD .... \ melakukan hal yang sama.)

Namun saya bisa DIR .... dan mendapatkan daftar dir. aku juga bisa

MD C: \ test .... \ temp dan itu menciptakan sub-dir di ....

Saya juga bisa CD C: \ test .... \ temp dan masuk ke sub-sub direktori itu.

Tetapi sementara di C: \ test .... \ temp, jika saya CD .. Saya kembali di C: \ test.

Saya tidak dapat melakukan cd ke direktori itu, tetapi saya dapat memanipulasi folder dengan membuat subfolder, dan sesuatu yang cukup menarik

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

juga berfungsi dan membuat file di folder itu. Jadi saya bisa membuat folder dengan empat titik, saya bisa menambahkan file dan folder ke dalamnya, saya bisa mendapatkan daftar dir itu, tapi saya tidak bisa CD ke dalamnya. Mungkinkah ada semacam jenius jahat yang digunakan untuk ini? Saya minta maaf kepada mod jika saya telah tersesat terlalu jauh tentunya.

Larryc
sumber
6
Itu agak terdengar seperti cacat Win32 API, mengingat bahwa command prompt tidak lagi "MS-DOS" selama sekitar dua puluh tahun sekarang.
grawity
2
Menariknya, Jika saya mencoba menghapus direktori di windows explorer, itu macet ketika saya membuatnya dengan versi Anda. Ketika saya membuatnya dengan cygwin, itu gagal dan mengatakannya.
lucidbrot
Saya memiliki mesin DOS 3.3 dan DOS 6.0 dan perintahnya berfungsi. Ketika mereka beralih ke 32 bit masalah itu masih ada. ia bekerja di jendela CMD dari win95 sampai hari ini, termasuk semua versi server. Sekarang kita beralih ke Powershell. Ia tidak lagi berfungsi. Saya menyadari setelah saya menulis bahwa itu memang membuat direktori tetapi tidak memberikan efek yang OP lihat. Jika saya mencoba untuk CD ke direktori dengan empat titik itu hanya menendang saya keluar.
Larryc
Di mesin Windows 7 saya MD ....` only creates .... \ .... `tree - hanya ada satu langkah rekursi.
Tomáš Zato
Anehnya manajer FAR tidak melihat ini sebagai sesuatu yang istimewa, dan membuat / mengganti nama / menghapus / daftar isi direktori bernama "banyak titik" tanpa masalah sama sekali.
RomanSt
-1

Saya memiliki masalah yang sama. Dalam kasus saya, itu adalah salah ketik dalam perintah untuk .NET Core publish:

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

Itu menciptakan direktori dengan nama '....', yang saya tidak bisa hapus atau ubah namanya. Direktori ini bertindak seperti referensi ke direktori induk. Jika saya masuk ke dalam folder itu, saya masih berada di folder induk, tetapi path ditambahkan oleh '.... \'.

Saya mencoba semua perintah yang disebutkan dalam topik ini, tetapi tidak satupun yang berhasil. Dalam pemahaman saya, itu bertindak seperti itu, karena saya punya file dan direktori lain di direktori induk, jadi saya harus menggunakan parameter yang secara rekursif dapat menghapus semua konten.

Saya tahu, bahwa perintah ini:

rmdir /s /q ....\

dapat menghapus direktori '....'. Ini hanya menghapus referensi ke direktori induk, yang sebenarnya adalah direktori '....' ini, tidak lebih, tidak kurang. Meskipun ada argumen perintah:

  • / s - menghapus semua konten di dalam direktori yang dihapus,
  • / q - menghapus tanpa konfirmasi,

direktori induk tetap tidak tersentuh.

Mateusz
sumber
Bisakah Anda menjelaskan mengapa perintah kedua bekerja untuk Anda?
Burgi
Memilih karena Anda tidak memberikan penjelasan mengapa perintah itu berfungsi atau apa fungsinya, seperti menghapus direktori, subdirektori, dan file.
Winter Faulk
Ini sebenarnya menghapus direktori dengan nama '....'. Ini hanya menghapus referensi ke direktori induk, yang sebenarnya adalah direktori '....' ini, tidak lebih, tidak kurang. Saya mencoba semua perintah yang disebutkan dalam topik ini, tetapi tidak ada yang berhasil. Dalam pemahaman saya, perintah ini berfungsi, karena saya punya file dan direktori lain di direktori induk, jadi saya harus menggunakan parameter yang secara rekursif dapat menghapus semua konten. Meskipun ada argumen perintah, direktori induk tetap tidak tersentuh.
Mateusz
Saya masuk ke situasi yang sama persis ini entah bagaimana dengan Visual Studio dan perintah ini menyelamatkan saya setelah frustrasi selama berjam-jam mencoba mencari tahu apa yang sedang terjadi.
NPNelson