۱۳۸۸/۰۱/۱۲

برنامه نويسي امن به زبان C


اگر سخنان بزرگان برنامه نويسي را مطالعه كرده باشيد، يكي از موارد اين بود:
" هيچگاه از gets و sprintf استفاده نكنيد، در غير اينصورت شياطين به زودي به سراغ شما خواهند آمد! (FreeBSD Secure Programming Guidelines) "
به عبارت ديگر استفاده از توابع كتابخانه‌هاي استاندارد زبان C ، بدون ملاحظات لازم (يا همان برنامه نويسي كلاسيك به زبان C )، منشاء بسياري از حملات Buffer overrun است، زيرا اكثر اين توابع اندازه‌ي بافر يا رشته‌ي ورودي را بررسي نمي‌كنند.
براي رفع اين مشكلات كه هنوز كه هنوز است قرباني مي‌گيرد! ، The Safe C Library پديد آمده است. اين كتابخانه بر اساس استاندارد ISO TR24731 تهيه گرديده و در آن يك سري توابع مكمل، جهت بالا بردن امنيت‌ برنامه‌هاي تهيه شده به زبان C مطابق استاندارد ISO/IEC 9899:1999 معرفي شده است.

براي مثال مطابق استاندارد ISO/IEC JTC1 SC22 WG14 N1172 ، تابع نا امن memcpy با تابع امن زير بايد جايگزين شود:
errno_t  memcpy_s(void *dest, rsize_t dmax, const void *src, rsize_t smax)

مستندات آن‌را در فايل safe_lib_html.tar پس از دريافت كتابخانه مي‌توانيد مشاهده نمائيد.

همچنين اخيرا به عنوان مكمل اين مجموعه، يك كتابخانه‌ي رياضي امن نيز تهيه شده است.

پ.ن.
شبيه به همين مورد در اينترفيس پلاگين‌هاي IDA-Pro در نگارش‌هاي اخير آن اعمال شده است و برنامه نويس را وادار مي‌كند كه از نمونه‌هاي معادل امن در آن محيط استفاده كند.
//pro.h
// We forbid using dangerous functions in IDA Pro
#ifndef USE_DANGEROUS_FUNCTIONS
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x560 || __BORLANDC__ >= 0x580) // for BCB5 (YH)
#include <stdio.h>
#endif
#undef strcpy
#define strcpy dont_use_strcpy // use qstrncpy
#define stpcpy dont_use_stpcpy // use qstpncpy
#define strncpy dont_use_strncpy // use qstrncpy
#define strcat dont_use_strcat // use qstrncat
#define strncat dont_use_strncat // use qstrncat
#define gets dont_use_gets // use fgets
#define sprintf dont_use_sprintf // use qsnprintf
#define snprintf dont_use_snprintf // use qsnprintf
#define wsprintfA dont_use_wsprintf // use qsnprintf
#endif
براي مطالعه بيشتر: The Safe C Library