Pertimbangan Keamanan: Microsoft Windows Shell
Topik ini menyediakan informasi tentang pertimbangan keamanan yang terkait dengan Windows Shell. Dokumen ini tidak dapat memberikan semua yang perlu Anda ketahui tentang masalah keamanan—sebagai gantinya, gunakan sebagai titik awal dan referensi untuk area teknologi khusus ini.
Shell mengontrol sejumlah aspek penting dari sistem, termasuk beberapa yang menghadirkan potensi risiko keamanan jika tidak ditangani dengan benar. Topik ini menguraikan beberapa masalah yang lebih umum dan cara mengatasinya di aplikasi Anda. Ingat bahwa keamanan tidak terbatas pada eksploitasi berbasis Internet. Pada sistem bersama, termasuk sistem yang dapat diakses melalui Layanan Terminal, Anda juga harus memastikan bahwa pengguna tidak dapat melakukan apa pun yang dapat membahayakan orang lain yang berbagi sistem.
- Menginstal aplikasi Anda dengan benar
- Shlwapi
- Pelengkapan otomatis
- ShellExecute, ShellExecuteEx, dan Fungsi Terkait
- Memindahkan dan Menyalin File
- Menulis Ekstensi Namespace Aman
- Pemberitahuan Keamanan
- Topik terkait
Menginstal aplikasi Anda dengan benar
Sebagian besar potensi masalah keamanan Shell dapat dimitigasi dengan menginstal aplikasi Anda dengan benar.
Instal aplikasi di bawah folder Program Files.
Sistem Operasi Lokasi Windows XP, Windows Server 2003, dan yang lebih lama CSIDL_PROGRAM_FILES Windows Vista dan yang lebih baru FOLDERID_ProgramFiles, FOLDERID_ProgramFilesX86, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommon, FOLDERID_ProgramFilesCommonX86, atau FOLDERID_ProgramFilesCommonX64. Lihat KNOWNFOLDERID untuk spesifik. Jangan simpan data pengguna di bawah folder File Program.
Gunakan folder data yang sesuai untuk data yang umum untuk semua pengguna.
Sistem Operasi Lokasi Windows XP, Windows Server 2003, dan yang lebih lama CSIDL_COMMON_APPDATA Windows Vista dan yang lebih baru FOLDERID_ProgramData Gunakan folder data pengguna yang sesuai untuk data milik pengguna tertentu.
Sistem Operasi Lokasi Windows XP, Windows Server 2003, dan yang lebih lama CSIDL_APPDATA, CSIDL_PERSONAL, dan lainnya. Windows Vista dan yang lebih baru FOLDERID_RoamingAppData, FOLDERID_Documents, dan lainnya. Jika Anda harus menginstal ke lokasi selain folder Program Files, pastikan Anda mengatur daftar kontrol akses (ACL) dengan benar sehingga pengguna tidak memiliki akses ke bagian sistem file yang tidak pantas. Data apa pun yang khusus untuk pengguna tertentu harus memiliki ACL yang mencegah pengguna lain mengaksesnya.
Saat Anda menyiapkan asosiasi file, pastikan untuk menentukan baris perintah dengan benar. Gunakan jalur yang sepenuhnya memenuhi syarat dan bungkus elemen apa pun yang berisi spasi kosong dalam tanda kutip. Bungkus parameter perintah dalam tanda kutip terpisah. Jika tidak, string mungkin salah diurai dan aplikasi tidak akan diluncurkan dengan benar. Dua contoh baris perintah yang terbentuk dengan benar ditampilkan di sini.
"C:\Program Files\MyApp\MyApp.exe" "%1" "%2" C:\MyAppDir\MyApp\MyApp.exe "%1"
Catatan
Lokasi folder penginstalan standar mungkin bervariasi dari sistem ke sistem. Untuk mendapatkan lokasi folder standar pada sistem Windows Vista tertentu atau yang lebih baru, panggil SHGetKnownFolderPath dengan nilai KNOWNFOLDERID yang sesuai. Di Windows XP, Windows Server 2003, atau sistem yang lebih lama, panggil SHGetFolderLocation atau SHGetFolderPath dengan nilai CSIDL yang sesuai.
Shlwapi
API Shell Lightweight (Shlwapi) mencakup sejumlah fungsi manipulasi string. Menggunakan fungsi-fungsi ini dengan tidak benar dapat menyebabkan string yang terpotong secara tidak terduga tanpa pemberitahuan pemotongan yang dikembalikan. Dalam kasus berikut, fungsi Shlwapi tidak boleh digunakan. Fungsi alternatif yang tercantum, yang menimbulkan lebih sedikit risiko, harus digunakan di tempatnya.
Fungsi Shlwapi | Fungsi Alternatif |
---|---|
StrCat,StrnCat | StringCchCat, StringCbCat , dan fungsi terkait |
StrCpy, StrCpyN | StringCchCopy, StringCbCopy , dan fungsi terkait |
wnsprintf, wvnsprintf | StringCchPrintf, StringCbPrintf , dan fungsi terkait |
Dengan fungsi seperti PathRelativePathTo yang mengembalikan jalur file, selalu atur ukuran buffer ke karakter MAX_PATH. Melakukannya memastikan bahwa buffer cukup besar untuk menahan jalur file terbesar yang mungkin, ditambah karakter null yang mengakhiri.
Untuk informasi selengkapnya tentang fungsi string alternatif, lihat Tentang Strsafe.h.
Lengkapi Otomatis
Jangan gunakan fitur Lengkapi Otomatis untuk kata sandi.
ShellExecute, ShellExecuteEx, dan Fungsi Terkait
Ada beberapa fungsi Shell yang dapat Anda gunakan untuk meluncurkan aplikasi: ShellExecute, ShellExecuteEx, WinExec, dan SHCreateProcessAsUserW. Pastikan Anda memberikan definisi aplikasi yang tidak ambigu yang akan dijalankan.
- Saat menyediakan jalur file yang dapat dieksekusi, berikan jalur yang sepenuhnya memenuhi syarat. Jangan bergantung pada Shell untuk menemukan file.
- Jika Anda menyediakan string baris perintah yang berisi spasi kosong, bungkus string dalam tanda kutip. Jika tidak, pengurai mungkin menginterpretasikan satu elemen yang berisi spasi sebagai beberapa elemen.
Memindahkan dan Menyalin File
Satu kunci untuk keamanan sistem adalah menetapkan ACL dengan benar. Anda juga dapat menggunakan file terenkripsi. Pastikan bahwa ketika Anda memindahkan atau menyalin file, file tersebut diberi ACL yang benar dan file tersebut belum didekripsi secara tidak sengaja. Ini termasuk memindahkan file ke Keranjang Sampah, serta dalam sistem file. Gunakan IFileOperation (Windows Vista atau yang lebih baru) atau SHFileOperation (Windows XP dan yang lebih lama). Jangan gunakan MoveFile, yang mungkin tidak mengatur ACL yang diharapkan untuk file tujuan.
Menulis Ekstensi Namespace Aman
Ekstensi namespace shell adalah cara yang kuat dan fleksibel untuk menyajikan data kepada pengguna. Namun, mereka dapat menyebabkan kegagalan sistem jika tidak ditulis dengan benar. Beberapa poin penting yang perlu diingat:
- Jangan berasumsi bahwa data seperti gambar diformat dengan benar.
- Jangan berasumsi bahwa MAX_PATH setara dengan jumlah byte dalam string. Ini adalah jumlah karakter.
Pemberitahuan Keamanan
Tabel berikut ini mencantumkan beberapa fitur yang dapat, jika digunakan dengan tidak benar, membahayakan keamanan aplikasi Anda.
Fitur | Mitigasi |
---|---|
ShellExecute, ShellExecuteEx | Pencarian yang bergantung pada pemeriksaan serangkaian lokasi default untuk menemukan file tertentu dapat digunakan dalam serangan spoofing. Gunakan jalur yang sepenuhnya memenuhi syarat untuk memastikan bahwa Anda mengakses file yang diinginkan. |
StrCat | Argumen pertama, psz1, harus cukup besar untuk menahan psz2 dan penutupan '\0', jika tidak, buffer overrun mungkin terjadi. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, atau StringCchCatNEx. |
StrCatBuff | String akhir tidak dijamin akan dihentikan null. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, atau StringCchCatNEx. |
StrCatChainW | String akhir tidak dijamin akan dihentikan null. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCatEx, StringCbCatNEx, StringCchCatEx, atau StringCchCatNEx. |
StrCpy | Argumen pertama, psz1, harus cukup besar untuk menahan psz2 dan penutupan '\0', jika tidak, buffer overrun mungkin terjadi. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, atau StringCchCopyNEx. |
StrCpyN | String yang disalin tidak dijamin null-dihentikan. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCopy, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, StringCchCopyNEx. |
StrDup | StrDup mengasumsikan bahwa lpsz adalah string yang dihentikan null. Selanjutnya, string yang dikembalikan tidak dijamin akan dihentikan null. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCat, StringCbCopyEx, StringCbCopyN, StringCbCopyNEx, StringCchCopy, StringCchCopyEx, StringCchCopyN, atau StringCchCopyNEx. |
StrNCat | Argumen pertama, pszFront, harus cukup besar untuk menahan pszBack dan penutupan '\0', jika tidak, overrun buffer mungkin terjadi. Ketahuilah bahwa argumen terakhir, cchMax, adalah jumlah karakter yang akan disalin ke pszFront, belum tentu ukuran pszFront dalam byte. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbCat, StringCbCatEx, StringCbCatN, StringCbCatNEx, StringCchCat, StringCchCatEx, StringCchCatN, atau StringCchCatNEx. |
wnsprintf | String yang disalin tidak dijamin null-dihentikan. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, atau StringCchVPrintfEx. |
wvnsprintf | String yang disalin tidak dijamin null-dihentikan. Gunakan salah satu alternatif berikut sebagai gantinya. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, atau StringCchVPrintfEx. |
Topik terkait