دسته‌ها: Security

حمله سر ریز بافر (Buffer Overflow Attack)

سريز بافر از قديمي ترين مشكلات امنيتي سيستم هاي کامپيوتری بوده است. در این مقاله به بررسی حمله سر ریز بافر می پردازیم و سپس در پايان، روش هايي براي جلوگيري از اين نوع حملات ارائه خواهیم داد.

حافظه بافر چیست؟

بافر رابط حافظه ای بین دو دستگاه یا سخت افزار می باشد. بافر وظیفه یکسان سازی و متعادل کردن سرعت پردازش های متفاوت را بر عهده دارد. برای مثال در هارددیسک ها، حافظه بافر وظیفه یکسان سازی سرعت انتقال اطلاعات از کامپیوتر به هارددیسک و بالعکس را عهده دار می باشد یا مثلا در رم برای ذخیره سازی اطلاعات موقت استفاده می شود.

تاریخچه حملات سرریز بافر

در نوامبر سال ۱۹۹۶ مقاله ای توسط آقای آلف وان منتشر شد که نگاه جدیدی را در دنیای امنیت دیجیتال به وجود آورد. این مقاله توضیح می داد که چگونه ضعف در برنامه نویسی می تواند باعث دسترسی به یک نرم افزار یا از کارانداختن آن شود که این نوع حمله را سرریز بافر یا Buffer Overflow Attack می نامند.

بافر قسمتی از حافظه است که به طور موقت برای نگه داری اطلاعات یک نرم افزار اختصاص یافته است. اطلاعات پیش از رسیدن به محل اصلی در مکانی به نام بافر به صورت موقت ذخیره می شوند. بافر معمولا یک ظرفیت از پیش مشخص شده دارد که توسط برنامه نویس تعیین می شود. 

Security Focus —–>  حاوی ضعف هاي امنيتي نرم افزارهاي مختلف

بر طبق این سایت، حداقل 3/1 از اين ضعف ها مربوط به Buffer Overflow مي شوند. اين مشكل در تمام سيستم عامل ها ديده شده است.

ظرفیت بافرها با اندازه ثابت، از قبل و در زمان کامپایل تعیین شده‌ و در صورتی که اطلاعات بیشتری در آن‌ ها نوشته شود، سرریز خواهند شد و باگ‌ به وجود خواهند آورد. 

تصور کنید نرم افزاری دارید که یک بافر با سایز ثابت ۱۲۸ بایت دارد. حال اگر مهاجم ۱۰۰۰ بایت دیتا برای این بافر ارسال کند، چه اتفاقی رخ می دهد؟ ظرف شما از آب پر می شود و سر ریز اتفاق می افتد. در چنین حالتی یک نرم افزار واکنش های متفاوتی از خودش بروز می دهد که قابل پیش بینی نیست.

در حمله سرریز بافر، یک فرآیند بیش از اندازه‌ ی مورد نیاز خود اطلاعات دریافت می‌ کند.

اگر این فرآیند به گونه‌ ای طراحی نشده باشد که در چنین مواقعی از خود پاسخ درستی ارائه دهد، با به وجود آمدن چنین حالتی این امکان را برای مهاجم ایجاد می‌ کند که از نرم افزار مربوطه سوء استفاده کند و موجب حمله سر ریز بافر شود. بعد از پر شدن بافر، برنامه دچار کرش می شود و بعد از آن می توان هر دستوری که میخواهیم به برنامه بدهیم (مثل تزریق کردن شل کد برای ایجاد دسترسی).

 یک نوع حمله به نام Ping Of Death  وجود دارد که در این نوع حمله مهاجم بسته‌ های اطلاعاتی ICMP از نوع ECHO را با حجمی بیش از اندازه معمول آن، یعنی بیش‌ تر از 65 کیلوبایت برای سرور مقصد ارسال می‌ کند، این‌کار می‌ تواند باعث از کار افتادن سرور مقصد و به هم خوردن متغیرهای سیستم و در نهایت منجر به حمله سر ریز بافر شود.

انواع حملات سرریز بافر

  • حملات Stack Based
  • حملات Heap Based

Stack و Heap موقعیت های ذخیره سازی برای متغیرهای تامین شده توسط کاربر برای برنامه در حال اجرا هستند. متغیرها تا زمانی که برنامه به آنها نیاز داشته باشند در Heap  و یا stack ذخیره سازی می شوند.

Stack فضاهای استاتیک و ایستای ذخیره سازی در حافظه هستند، در صورتی که Heaps فضاهای دینامیک و پویای ذخیره سازی هستند که وقتی برنامه اجرا می شود ایجاد می شوند.

قبل از کپی شدن داده‌ ها

به منظور تشخیص آسیب پذیری های سرریز بافر برنامه که در نتیجه سورس کد نوشته شده مخرب است، یک هکر مقادیر زیادی داده را از طریق وب فرم به اپلیکیشن ارسال می کند و نتیجه را مشاهده می کند.

نحوه اجرا حمله سرریز بافر توسط هکر

  1. یک متغیر در بافر وارد می شود تا مقدار حافظه پشته پر شود.
  2. حال مقادیر داده ای بیشتر از آنچه که حافظه برای آن در نظر گرفته شده است وارد می شود که نتیجه آن سرریز بافر می باشد.
  3. سپس یک متغیر دیگر را در بافر وارد می کنند تا مقدار قبلی را بپوشاند و به برنامه بگوید چه چیزی را اجرا کند.
  4. در نتیجه اگر هکر با موفقیت اشاره گر کد را بپوشاند، برنامه کد هکر را اجرا می کند.

اکثر هکرها نیازی به داشتن دانش درباره این کدها ندارند، زیرا کد های آماده زیادی در اینترنت وجود دارد.

اگر برنامه‌ ای که دچار سرریز بافر شده، امتیاز و دسترسی‌های بالایی داشته باشد، این باگ می‌ تواند آسیب‌ پذیری امنیتی بالقوه محسوب شود. 

سوء استفاده (Exploitation) از يك  Stack بر مبناي Buffer overflow، در حالت كلي به فرآيند Overwrite كردن آدرسی از كد شل خودمان بر روي آدرس برگشت تابع اطلاق مي شود. 

قبل از حمله سر ریز بافر
پس از حمله سر ریز بافر

Heapview ابزاري است كه به كمك آن مي توان قسمت هايي از هيپ كه به برنامه اختصاص داده شده را به همراه تغييراتي كه در حين اجرای برنامه روي هيپ رخ مي دهد را مشاهده كرد. فرض كنيد برنامه ای منتظر باشد تا كاربر نام خود را وارد نمايد، ولي به جاي اينكه كاربر نامش را وارد كند، هكر يك دستور اجرايي را وارد می ­كند كه باعث سرريز بافر می­ شود. در نتيجه برنامه نمی ­تواند كار خود را ادامه دهد. حال برنامه در این قسمت، به دنبال يك راه بازگشت می گردد. زمانی كه برنامه برای دريافت داده از ورودی آماده می ­شود آدرسی براي بازگشت خود ذخيره می ­كند.

در این قسمت هكر وارد عمل شده و آدرس بازگشت برنامه را با آدرس يک دستور مخرب جا به جا مي­ كند. در نتيجه پس از وقوع سرريز، برنامه به سراغ دستور مخرب رفته و آن را اجرا مي ­كند، از طرفي از آنجایی كه اين دستور توسط اين برنامه اجرا می ­شود، اغلب با اولويت همان برنامه نيز اجرا می­ گردد و در نتيجه فرد هكر كنترل سيستم عامل را به دست می­ گيرد.

جلوگیری از این نوع حملات

جهت جلوگیری از سر ریز بافر از توابعی همچون strcpy و gets نباید استفاده شود.
  • اگر برنامه نویس هستید فراموش نکنید که از همان ابتدا کد نویسی و طراحی، امنیت را یک گوشه از ذهن تان قرار بدهید.
  • تمام ورودی های کاربر را از قبیل فرم ها را بررسی کنید تا فقط اطلاعات مورد نظر شما امکان عبور را داشته باشند. نرم افزارها و اپلیکیشن ها را اپدیت نگه دارید.
  •  تست نرم افزارتان را برای این گونه حملات فراموش نکنید و در پایان سرویس هایی را که استفاده نمی کنید، غیرفعال کنید.
  • این حملات از ضعف حاصل از عدم تست اندازه داده ورودي استفاده مي کنند، لذا مهمترين اصل در برنامه نويسي يک سرويس يا برنامه مقاوم در برابر آن ها، چک کردن اندازه تمام ورودی ها به برنامه، قبل از انجام هر کاری روی داده ها می باشد. براي برنامه نويسان محيط unix/linux، کتابخانه هايی مانند StackGuard وجود دارند که برنامه نويس می تواند با لينک کردن اين کتابخانه ها به نرم افزار خود، جلوی بسياري از این نوع حملات را بگیرد.
منتشر شده توسط
n.mahdizadeh_server