Pertimbangan Keamanan: Antarmuka Pengguna Windows
Topik ini menyediakan informasi tentang pertimbangan keamanan di Antarmuka Pengguna Windows. Topik ini tidak menyediakan semua yang perlu Anda ketahui tentang masalah keamanan. Sebagai gantinya, gunakan sebagai titik awal dan referensi untuk area teknologi ini.
Dengan peningkatan interkonektivitas komputer, pengembang sekarang harus khawatir dengan keamanan aplikasi. Namun, keamanan juga meningkatkan keamanan dan ketahanan aplikasi umum; oleh karena itu, ini adalah cara lain agar pengembang dapat memberikan pengalaman pengguna yang baik. Topik berikut membahas beberapa potensi masalah keamanan saat menggunakan Antarmuka Pengguna Windows.
Pertimbangan String
Banyak fungsi, pesan, dan makro menggunakan string dalam parameternya. Namun, seringkali string tidak diperiksa untuk penghentian null atau untuk panjangnya. Masalah terkait adalah salah menghitung panjang string atau buffer. Dalam kedua kasus, ini dapat menyebabkan luapan buffer atau pemotongan data, yang dapat memengaruhi aplikasi Anda dengan buruk. Untuk informasi selengkapnya tentang overrun buffer dan masalah keamanan lainnya, lihat Menulis Kode Aman oleh Michael Howard dan David Leblanc, Microsoft Press, 2002.
Untuk menangani string dengan cara yang aman, Anda harus melakukan hal berikut:
- Periksa string untuk penghentian null atau untuk panjang yang tepat, sebagaimana mestinya.
- Berhati-hatilah untuk menentukan panjang string atau buffer, terutama ketika berisi nilai TCHAR .
- Jika Anda membuat string atau menggunakan string yang digunakan sebelumnya, inisialisasi ke nol atau sisipkan null-terminator, sebagaimana mewajarkannya.
Selain itu, pertimbangkan untuk menggunakan fungsi Str Brankas saat berhadapan dengan string. Fungsi-fungsi ini dirancang untuk menangani string dengan aman.
Masukan Pengguna
Antarmuka pengguna Windows berkaitan dengan mendapatkan dan merespons informasi dari pengguna. Namun, pengguna yang memasukkan data yang salah dapat mengganggu aplikasi Anda, apakah mereka berniat untuk melakukannya atau tidak. Dengan demikian, aturan kardinal adalah bahwa semua input harus divalidasi.
Perhatian utama adalah data string, yang dibahas dalam Pertimbangan String. Namun, semua jenis input harus divalidasi sebelum digunakan oleh aplikasi Anda. Kekhawatiran lain adalah ketika data divalidasi pada satu titik tetapi berubah sebelum digunakan, misalnya, saat menerima pesan yang memberikan panjang teks. Jadi, jika ada kemungkinan data mungkin berubah, Anda harus memeriksa data tepat sebelum Anda menggunakannya
Pemberitahuan Keamanan
Tabel berikut mencantumkan fitur yang, jika salah digunakan, dapat membahayakan keamanan aplikasi Anda.
Fitur | Mitigasi |
---|---|
GetAtomName | Berhati-hatilah saat menentukan ukuran buffer. |
GlobalGetAtomName | Atom string global dapat diakses oleh aplikasi apa pun. Namun, jika aplikasi lain ceroboh, itu bisa salah menangani jumlah referensi mereka dan menghapusnya. Anda harus mempertimbangkan untuk menggunakan atom bilangan bulat global sebagai gantinya. |
ImpersonateDdeClientWindow | Jika fungsi gagal, permintaan klien berikutnya dibuat dalam konteks keamanan proses panggilan. Ini bisa menjadi masalah jika proses panggilan berjalan sebagai akun yang sangat istimewa. Oleh karena itu, jika panggilan gagal atau menimbulkan kesalahan, jangan lanjutkan eksekusi permintaan klien. |
DdeImpersonateClient | Jika fungsi gagal, permintaan klien berikutnya dibuat dalam konteks keamanan proses panggilan. Ini bisa menjadi masalah jika proses panggilan berjalan sebagai akun yang sangat istimewa. Oleh karena itu, jika panggilan gagal atau menimbulkan kesalahan, jangan lanjutkan eksekusi permintaan klien. |
GetClipboardFormatName | Salah menghitung ukuran buffer lpszFormatName yang tepat, terutama ketika aplikasi digunakan dalam versi ANSI dan Unicode, dapat menyebabkan luapan buffer. Perhatikan juga bahwa string dipotong jika lebih panjang dari parameter cchMaxCount , yang dapat menyebabkan hilangnya informasi. |
GetMenuString | Parameter lpString adalah buffer TCHAR , dan nMaxCount adalah panjang string menu dalam TCHARs. Salah mengukur parameter ini dapat berupa panjang string menu dalam karakter. Mengukur parameter ini dengan tidak benar dapat menyebabkan pemotongan string, yang menyebabkan kemungkinan hilangnya data. |
GetStringTypea, GetStringTypeEx, GetStringTypew | Untuk menghindari luapan buffer, atur ukuran buffer lpCharType dengan benar. |
LoadLibrary | Menggunakan LoadLibrary salah dapat membahayakan keamanan aplikasi Anda dengan memuat DLL yang salah. |
LoadString | Penggunaan yang salah termasuk menentukan ukuran yang salah dalam parameter nBufferMax . Misalnya, sizeof(lpBuffer) memberikan ukuran buffer dalam byte, yang dapat menyebabkan luapan buffer untuk versi Fungsi Unicode. Situasi luapan buffer adalah penyebab banyak masalah keamanan dalam aplikasi. Dalam hal ini, menggunakan sizeof(lpBuffer)/sizeof(TCHAR) memberikan ukuran buffer yang tepat. |
lstrcat | Fungsi ini menggunakan penanganan pengecualian terstruktur (SEH) untuk menangkap pelanggaran akses dan kesalahan lainnya. Ketika fungsi ini menangkap kesalahan SEH, fungsi ini mengembalikan NULL tanpa menghentikan string null dan tanpa NULL tanpa menghentikan string null dan tanpa memberi tahu pemanggil kesalahan. Pemanggil tidak aman untuk mengasumsikan bahwa ruang yang tidak mencukup adalah kondisi kesalahan. Argumen pertama, lpString1, harus cukup besar untuk menahan lpString2 dan penutupan '\0', jika tidak, overrun buffer dapat terjadi. Overruns buffer dapat menyebabkan penolakan serangan layanan terhadap aplikasi jika terjadi pelanggaran akses. Dalam kasus terburuk, buffer overrun dapat memungkinkan penyerang untuk menyuntikkan kode yang dapat dieksekusi ke dalam proses Anda, terutama jika lpString1 adalah buffer berbasis tumpukan. Pertimbangkan untuk menggunakan salah satu alternatif berikut. StringCbCat atau StringCchCat. |
lstrcpy | Fungsi ini menggunakan penanganan pengecualian terstruktur (SEH) untuk menangkap pelanggaran akses dan kesalahan lainnya. Ketika fungsi ini menangkap kesalahan SEH, fungsi ini mengembalikan NULL tanpa menghentikan string null dan tanpa NULL tanpa menghentikan string null dan tanpa memberi tahu pemanggil kesalahan. Pemanggil tidak aman untuk mengasumsikan bahwa ruang yang tidak mencukup adalah kondisi kesalahan. Argumen pertama, lpString1, harus cukup besar untuk menahan lpString2 dan penutupan '\0', jika tidak, overrun buffer dapat terjadi. Overruns buffer dapat menyebabkan penolakan serangan layanan terhadap aplikasi jika terjadi pelanggaran akses. Dalam kasus terburuk, buffer overrun dapat memungkinkan penyerang untuk menyuntikkan kode yang dapat dieksekusi ke dalam proses Anda, terutama jika lpString1 adalah buffer berbasis tumpukan. Pertimbangkan untuk menggunakan StringCchCopy sebagai gantinya. |
lstrcpyn | Fungsi ini menggunakan penanganan pengecualian terstruktur (SEH) untuk menangkap pelanggaran akses dan kesalahan lainnya. Ketika fungsi ini menangkap kesalahan SEH, fungsi ini mengembalikan NULL tanpa menghentikan string null dan tanpa NULL tanpa menghentikan string null dan tanpa memberi tahu pemanggil kesalahan. Pemanggil tidak aman untuk mengasumsikan bahwa ruang yang tidak mencukup adalah kondisi kesalahan. Jika lpString1 tidak cukup besar untuk berisi string yang disalin, overrun buffer dapat terjadi. Selain itu, saat menyalin seluruh string, perhatikan bahwa sizeof mengembalikan jumlah byte daripada WCHAR, ukuran tersebut mengembalikan jumlah byte daripada karakter, yang salah untuk versi Unicode fungsi ini. Buffer overruns dapat menyebabkan penolakan serangan layanan terhadap aplikasi jika terjadi pelanggaran akses. Dalam kasus terburuk, buffer overrun dapat memungkinkan penyerang untuk menyuntikkan kode yang dapat dieksekusi ke dalam proses Anda, terutama jika lpString1 adalah buffer berbasis tumpukan. Pertimbangkan untuk menggunakan StringCchCopy sebagai gantinya. |
lstrlen | lstrlen mengasumsikan bahwa lpString adalah string null-terminated. Jika tidak, ini dapat menyebabkan buffer diserbu atau penolakan serangan layanan terhadap aplikasi Anda. Pertimbangkan untuk menggunakan salah satu alternatif berikut. StringCbLength atau StringCchLength. |
wsprintf | String yang dikembalikan dalam lpOut tidak dijamin null-dihentikan. Selain itu, hindari format %s, yang dapat menyebabkan buffer diserbu. Jika pelanggaran akses terjadi, itu menyebabkan penolakan layanan terhadap aplikasi Anda. Dalam kasus yang lebih buruk, penyerang dapat menyuntikkan kode yang dapat dieksekusi. Pertimbangkan untuk menggunakan salah satu alternatif berikut. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, atau StringCchVPrintfEx. |
wvsprintf | String yang dikembalikan dalam lpOutput tidak dijamin null-dihentikan. Selain itu, hindari penggunaan format %s, yang dapat menyebabkan overrun buffer. Ini dapat menyebabkan penolakan layanan jika mengakibatkan pelanggaran akses, atau penyerang dapat menyuntikkan kode yang dapat dieksekusi. Pertimbangkan untuk menggunakan salah satu alternatif berikut. StringCbPrintf, StringCbPrintfEx, StringCbVPrintf, StringCbVPrintfEx, StringCchPrintf, StringCchPrintfEx, StringCchVPrintf, atau StringCchVPrintfEx. |
Topik terkait