Monday, May 13, 2013

FAILURE TO HANDLE ERRORS CORRECTLY


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
Programming Flaws and How to Fix Them

No comments:

Post a Comment