Bagikan melalui


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.

 

Keamanan Microsoft

Keamanan dan Identitas

Indeks Cara Penggunaan Keamanan

Microsoft Security Response Center

Praktik Terbaik untuk API Keamanan