Thursday, September 16, 2010

Memory Protection (live with more safety) #1

به نام دوست

مکانیزمهای محافظت حافظه برنامه، شیوه‌هایی جهت محدود کردن فعالیتهای خرابی حافظه مانند Buffer overflow میباشند.
آنچه در ادامه می‌آید کنجکاوی یک غیر‌حرفه‌ای در این زمینه است:


FORTIFY_SOURCE
ایده کلی: حالتهایی وجود دارد که کامپایلر میتواند میزان حافظه اختصاص داده شده به buffer را تشخیص بدهد ( گرفتن حافظه به صورت static یا با استفاده از malloc) در این صورت، امکان کنترل فانکشنهایی که بر روی آنها کار میکنند وجود دارد تا به این واسطه از بروز overflow جلوگیری شود.
به عبارتی نمونه‌هایی امن از توابع غیر امن به کار گرفته میشوند که کنترلهای ویژه‌ای بر روی فعالیتهای حافظه جهت اطمینان از عدم بروز overflow انجام میدهند.
این شیوه از مجموعه مشخصی از توابع به شرح زیر پشتیبانی میکند:

mem{cpy,pcpy,move,set},
st{r,p,nc}py, str{,n}cat, {,v}s{,n}printf
شیوه استفاده:

gcc -D_FORTIFY_SOURCE=2 -O2
کاربرد این روش تا آنجاست که امکان تشخیص محدوده حافظه وجود داشته باشد.
به مثالهای زیر توجه کنید:
char buf[5];
/* 1) Known correct.
      No runtime checking is needed, memcpy/strcpy
      functions are called (or their equivalents inline).  */
memcpy (buf, foo, 5);
strcpy (buf, "abcd");
/* 2) Not known if correct, but checkable at runtime.
      The compiler knows the number of bytes remaining in object,
      but doesn't know the length of the actual copy that will happen.
      Alternative functions __memcpy_chk or __strcpy_chk are used in
      this case that check whether buffer overflow happened.  If buffer
      overflow is detected, __chk_fail () is called (the normal action
      is to abort () the application, perhaps by writing some message
      to stderr.  */
memcpy (buf, foo, n);
strcpy (buf, bar);
/* 3) Known incorrect.
      The compiler can detect buffer overflows at compile
      time.  It issues warnings and calls the checking alternatives
      at runtime.  */
memcpy (buf, foo, 6);
strcpy (buf, "abcde");
/* 4) Not known if correct, not checkable at runtime.
      The compiler doesn't know the buffer size, no checking
      is done.  Overflows will go undetected in these cases.  */
memcpy (p, q, n);
strcpy (p, q);

 منابع:
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html
http://fedoraproject.org/wiki/Security/Features
http://wiki.debian.org/Hardening
و اینجا

No comments: