Buffer overflow adalah hal yang besar. Tidak ada dalam C yang dicentang kisaran secara default, jadi sangat mudah untuk menimpa buffer. Ada fungsi pustaka standar gets()
,, yang tidak dapat berhenti meluap dari buffer, dan hampir tidak boleh digunakan.
Ada beberapa teknik tingkat implementasi untuk menghambat eksploitasi, seperti pengacakan tumpukan blok, tetapi itu tidak akan menghentikan buffer overflows di buffer lokal, yang sering dapat melakukan hal-hal menarik seperti mengubah alamat tempat fungsi akan kembali.
Tidak ada solusi umum yang baik dalam C. Banyak fungsi perpustakaan memiliki versi yang akan membatasi jumlah yang akan mereka tulis. meski menghitung itu bisa canggung. Ada perangkat lunak yang dapat mendeteksi tumpukan buffer berlebih dalam pengujian, selama pengujian yang sesuai dijalankan, dan stack overflow sering muncul sebagai crash dalam pengujian. Selain itu, ini adalah masalah pengkodean dan tinjauan kode yang cermat.
Masalah terkait adalah masalah penulisan ke buffer terlalu kecil oleh satu karakter, lupa bahwa string C yang panjang n karakter memerlukan n +1 karakter dalam memori, karena '\0'
terminator. Jika penyerang dapat mengelola untuk menyimpan string tanpa terminator, fungsi C apa pun yang mengharapkan string akan terus memproses hingga mencapai nol byte, yang dapat mengakibatkan menyalin atau mengeluarkan informasi lebih banyak dari yang diinginkan (atau memukul memori yang dilindungi untuk serangan DOS) ). Solusinya, sekali lagi, adalah kesadaran, kepedulian, dan ulasan kode.
Ada risiko lain dengan printf()
keluarga. Jika Anda pernah menulis char * str; ... printf(str);
, Anda sedang mengatur diri sendiri untuk masalah jika str
berisi '%' saat dicetak. The %n
Format direktif memungkinkan printf()
untuk menulis ke memori. Solusinya adalah printf("%s", str);
atau puts(str);
. (Juga, gunakan C99 snprintf()
sebagai ganti sprintf()
.)
Menggunakan bilangan bulat yang tidak ditandatangani, terutama sebagai indeks loop, dapat menyebabkan masalah. Jika Anda menetapkan nilai negatif kecil untuk yang tidak ditandatangani, Anda mendapatkan nilai positif yang besar. Itu dapat merusak hal-hal seperti hanya memproses N contoh sesuatu, atau dalam fungsi terbatas seperti strncpy()
. Periksa semua bilangan bulat yang tidak ditandatangani. Anda mungkin ingin menghindari unsigned short
, karena nilai besar di salah satu dari mereka akan dikonversi ke nilai positif besar dalam int
.
Jangan lupa bahwa konstanta karakter, dalam C, sebenarnya adalah int
. Menulis sesuatu seperti char c; while((c = getchar()) != EOF) ...
dapat dengan mudah gagal, karena EOF
tidak dapat diwakili dalam char
.
Ada banyak kesalahan karakteristik C yang bisa saya pikirkan, tetapi ini bisa menyebabkan masalah keamanan.