Mengapa program bernama “C: \ Program” memengaruhi program lain?

16

Hari ini tiba-tiba sebuah file bernama Programmuncul di root C:\, dan ketika masuk ke sistem, popup menunjukkan pesan:

Peringatan Nama File

Ada file atau folder di komputer Anda yang disebut "C: \ Program" yang dapat menyebabkan aplikasi tertentu tidak berfungsi dengan benar. Mengganti nama menjadi "C: \ Program1" akan menyelesaikan masalah. Apakah Anda ingin mengganti nama sekarang?

Sementara pesan itu menjelaskan sendiri, saya bertanya-tanya mengapa file ini bisa memiliki pengaruh besar? Memang, beberapa program (mungkin semua, saya tidak periksa) yang berada di C:\Program Files...tidak memulai sama sekali. Saya dapat memahami bagaimana file tersebut dapat dibuat (misalnya, mencoba menulis ke folder C:\Program Files\Something...tetapi tanpa tanda kutip), tetapi saya tidak mengerti bagaimana hal itu dapat berdampak pada program lain.

Konrad Kokosa
sumber
1
Anda yakin ini adalah pesan yang dihasilkan oleh Windows?
Ramhound
1
Ya, diperiksa dua kali dari Process Exploer, itu adalah dialog dari explorer.exe
Konrad Kokosa
2
Terdengar samar, tidak ada program (di luar beberapa yang dipilih) yang harus dipasang di mana pun selain Program Files* untuk konsumen biasa. Tetapi saya akan berpikir itu karena pencocokan yang buruk untuk pencarian dapat menemukannya Program Files.
nerdwaller

Jawaban:

27

Ini memiliki pengaruh yang sangat besar karena kelemahan yang telah lama diketahui dalam Win32 API.

Program muncul di Win32 melalui CreateProcess()panggilan sistem. Ini dapat digunakan dalam beberapa cara. Orang-orang yang berasal dari latar belakang Unix, Linux, atau OS / 2 biasanya akan menganggapnya sebagai mengambil dua argumen terpisah untuk program (file gambar) untuk muncul dan perintah ekor untuk lolos ke proses baru, karena nama file dan argumen vektor / perintah ekor. adalah dua hal terpisah dalam API sistem operasi tersebut. Tetapi pada kenyataannya panggilan sistem dapat dipanggil dalam bentuk alternatif dengan nama program dan argumen yang dihancurkan bersama dalam satu string besar. CreateProcess()akan mencoba untuk memisahkan nama file program dari ekor perintah.

Masalahnya adalah ia melakukan ini dengan secara progresif membelah string menjadi dua pada setiap karakter spasi berturut-turut, sampai bagian kiri cocok dengan file atau direktori. Banyak program Win32 akan mencoba memberikan string seperti C:\Program Files\Contoso\TakeOver.exe StackExchange.comke pemanggilan sistem. Ini akan menjalankan program yang tepat - C:\Program Files\Contoso\TakeOver.exe- dengan ekor perintah yang benar - StackExchange.com- sampai pada titik di mana beberapa orang yang berbahaya datang dan membuat C:\Programfile seperti yang Anda lakukan.

Pada saat itu, panggilan sistem akhirnya mencoba menjalankan file gambar program C:\Programdengan ekor perintah Files\Contoso\TakeOver.exe StackExchange.com. Surga membantu Anda jika C:\Programsebenarnya gambar program yang dapat dieksekusi.

Ini adalah kelemahan umum, dan itu berlaku untuk setiap nama file program yang berisi spasi dalam kombinasi dengan program apa pun yang menggunakan One Big String untuk menelurkan program lain. Tetapi kasus paling umum yang terkena dampak ini adalah semua program yang hidup di bawah C:\Program Files\dan sejumlah besar program Win32 yang menggunakan pendekatan One Big String.

Sudah terlambat untuk mengubah API Win32. Sudah terlambat satu dekade yang lalu. Dan Microsoft tidak dapat mengubah semua program yang ditulis oleh orang lain yang meneruskan satu string besar, bukan dua CreateProcess(). Jadi Microsoft membuat Windows memeriksa, pada login pengguna, untuk keberadaan C:\Programdan menampilkan peringatan yang Anda lihat.

Dan, seperti yang Anda lihat, ada peringatan "Keamanan" dalam dokumen Win32 Microsoft yang memberitahu pengembang untuk tidak menulis program menggunakan pendekatan One Big String, yang telah ada di sana selama beberapa tahun sekarang.

Bacaan lebih lanjut

JdeBP
sumber
6
Jawaban yang sangat bagus! Saat saya pengembang, hal berikutnya yang akan saya lakukan adalah membuat dummy C:\Program.exeyang mencatat semua parameter baris perintahnya. Kita akan lihat siapa yang menggunakannya!
Konrad Kokosa
1
Jadi ini sebabnya pengaturan keamanan default sejak XP tidak memungkinkan membuat file di root oleh non-admin.
kinokijuf