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

Sebagian besar potensi masalah keamanan Shell dapat dimitigasi dengan menginstal aplikasi Anda dengan benar.

  • Instal aplikasi di bawah folder File Program.

    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 detailnya.

     

  • 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 File Program, 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 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

SHELL Lightweight API (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 MAX_PATH karakter. Melakukannya memastikan bahwa buffer cukup besar untuk menyimpan 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.

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 memberikan string baris perintah yang berisi spasi kosong, bungkus string dalam tanda kutip. Jika tidak, parser mungkin menginterpretasikan satu elemen yang berisi spasi sebagai beberapa elemen.

Memindahkan dan Menyalin File

Salah satu kunci 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 bahwa 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 mencantumkan beberapa fitur yang bisa, 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.

 

Keamanan Microsoft

Pusat Pengembang Keamanan

Microsoft Solution Accelerators

Keamanan

Tentang Strsafe.h