Banyak risiko keamanan yang mungkin terjadi ketika
programmer gagal untuk menangani kondisi kesalahan dengan benar.Sangat
disayangkan pada kenyataannya masalah kehandalan pada sebuah program yanbg
mengarah pada crashing, aborting, atau
restarting adalah masalah penolakan
layanan dan untuk itu bisa menjadi masakah keamanan, terutama untuk server code.
Setiap bahasa pemograman yang menggunakan kesalahan untuk
pengembalian nilai, seperti ASP, PHP, C, dan C + +, dan setiap bahasa yang
bergantung dengan pengecualian, seperti C#, Ruby, Python, VB.NET, dan Java.
Ada lima macam dari dosa ini:
1.
Menghasilkan terlalu banyak informasi
Kita berbicara tentang masalah
ini di berbagai judul dalam buku, terutama di Sin 12. Masalah ini sangatumum:
terjadi kesalahan dan, dalam kepentingan dari "kegunaan," anda
memberitahu persis pengguna apa yang gagal, mengapa, dan dalam beberapa kasus, bagaimana
untuk memperbaiki masalah ini. Masalahnya adalah anda hanya mengatakan
kepadaorang jahat informasi yang benar-benar penting, data yang dapat dia
digunakan untuk membantu dia berkompromi dengan sistem.
2.
Mengabaikan kesalahan
Kesalahan pengembalian nilai-nilai
adalah alasan yang sangat baik: untuk menunjukkan kondisi potensi kegagalansehingga
kode anda dapat bereaksi. Mungkin ada beberapa kesalahan yang tidak
serius. Misalnya, pengembalian nilai printfsangat jarang diperiksa, jika
nilai positif, maka pengembalian nilaimenampilkan nilai. Jika itu -1, maka
terjadi kesalahan.
3.
Salah menafsirkan kesalahan
Beberapa fungsi ada yang aneh,
seperti recv(), yang dapat mengembalikan tiga nilai. Setelah berhasil dan
selesai, recv() mengembalikan panjang pesan dalam byte. Contoh lain adalah
fgets(), yang mengembalikan nilai NULL jika ada kesalahan atau jika kode ini
berada pada akhir file. Anda harus menggunakan feof() / ferror() untuk
membedakannya.
4.
Menggunakan nilai-nilaireturn yang tidak berguna
Beberapa standar fungsi run-time C bisa sangat berbahaya misalnya,strncpy(),
yang mengembalikan nilai yang tidak berguna, hanya pointer ke buffer tujuan,
terlepasdari keadaan buffer tujuan.
5.
Menggunakan nilai-nilai return yang tidak salah
Contoh dari hal ini adalah
fungsi MulDiv() yang ditemukan pada sistem operasi Windows.Fungsi itu telah ada
untuk waktu yang lama, hal itu dimaksudkan untuk memungkinkan programmer untuk
melakukan perhitungan matematika 64-bit sebelum OSdapat mendukung untuk 64-bit
bilangan bulat. Fungsi ini setara dengan penulisan:
int result = ((long long)x * (long long)y)/z;
Hal ini memungkinkan perkalian
meluap membahayakan jika pembagi membawa nilai ke kisaran yang didukung oleh
32-bit integer. Masalahnya adalah bahwa fungsimengembalikan nilai -1 pada
kesalahan, yang merupakan hasil sempurna yang dapat diterima untuk banyak
masukan.
Dalam sampel kode yang berikut, pengembang memeriksa
fungsireturn yangmenghasilkan nilai
yang benar-benar tidak berguna nilai return
dari strncpy() adalah pointer awal ke buffer tujuan. Ini sedikit
digunakan, tetapi memungkinkan panggilan fungsi berantai setidaknya itu maksud
asli dari C. Dengan asumsi, tentu saja, tidak ada buffer berjalan bersamaan.
char dest[19];
char *p =
strncpy(dest, szSomeLongDataFromAHax0r,19);
if (p) {
// everything
worked fine, party on dest or p
}
Seperti yang telah disebutkan sebelumnya, Windows mempunyai
fungsi peniruan yang mungkin gagal. Bahkan, sejak peluncuran Windows
Server 2003 pada tahun 2003, hak istimewa baru ditambahkan keOS untuk membuat
peniruan hak istimewa yang diberikan hanya untuk account tertentu, seperti serviceaccount (local system, local service, and network service) dan
administrator. Secara simpel berarti kode anda bisa gagal saat memanggil
fungsi peniruan, seperti yang ditunjukkan:
ImpersonateNamedPipeClient(hPipe);
DeleteFile(szFileName);
RevertToSelf();
Masalahnya di sini adalah jika proses berjalan sebagai Local System, dan pengguna menggunakan kode
ini pada pengguna dengan hak istimewa yang rendah, maka untuk melakukan
DeleteFile() mungkin gagal karena pengguna tidak memiliki akses ke file. Namun,
jikafungsi peniruan gagal, dan thread
masih mengeksekusi dalam konteks proses, pada Local System, yang mungkin dapat menghapus file.
Sebenarnya tidak ada cara untuk mendefinisikan pola dosa
dengan mudah. Peninjauan
kode secara menyeluruh adalahcara yang paling efisien untuk menangani hal ini.Pengujian
cukup
sulit, karena anda dapat mebuat fungsi gagal secara sistematis. Dari
biayaefektivitas dan perspektif usaha manusia, peninjauan kode adalah yang
termurah dan paling efektif.
Maka dari itu periksalah semua nilai fungsi return yang berhubungan dengan keamanan.
Jangan pula mengandalkan pengecekan error dengan hanya menggunakan assert().
Jangan berikan keterangan penjelasan kegunaan kode. Jangan memberitahukan informasi kesalahan / kegagalan pada pengguna
yang tidak bisa dipercaya.
Sumber: ringkasan dari ebook 24 DEADLY SINS OF SOFTWARE SECURITY
No comments:
Post a Comment