سرریز بافر (Buffer overflow) یک آسیبپذیری نرم افزاری متداول است که بر اثر مقداردهی بیش از حد به بافر ایجاد میشود. زمانی که مقدار بیشتری از ظرفیت بافر به آن اعمال شود اطلاعات در فضای بیرون از بافر نوشته میشود و ممکن است اطلاعات قبلی از بین برود. از سوی دیگر این نوع آسیب پذیری به عنوان روشی جهت اعمال حملات منع سرویس (DoS) توسط مهاجمین مورد استفاده قرار می گیرد. در این مقاله به معرفی حملات سرریز بافر می پردازیم و بصورت مختصر درباره شناسایی و راه های مقابله و جلوگیری از این حملات صحبت خواهیم کرد.
تهدیدات نرمافزاری طی چند سال گذشته رشد چشمگیری داشته اند. آسیبپذیریهای مربوط به نرمافزار و برنامه کاربردی باعث آسیبهای بسیاری به سازمانها و افراد مختلف شده است. نمودار زیر شدت آسیبپذیریهای شناسایی شده در برنامههای کاربردی و شبکه را نشان داده شده است:
نرخ وقوع آسیبپذیری ها به عنوان یک درصد از همه آسیبپذیری ها کشف شده
هنگام نوشتن کد نرمافزار، ایدهآل این است که کدی بدون اشکال(باگ) نوشته شود. با این حال، حتی اگر این امکان وجود داشت که نرم افزار بدون باگ نوشته شود، ماهیت مدولار توسعهنرمافزار، این کار را غیرممکن میسازد زیرا کتابخانهها و قطعههای کد مورد استفاده که در طول توسعه به برنامه اضافه میشوند ممکن است باعث ایجاد اشکالات و آسیبپذیریهای امنیتی گردند.
از سال 1960 که مسئله "سر و صدا پشته برای سرگرمی و سود(Smashing the stack for fun and profit)" توسط ALP1 مطرح شد تا کنون سرریزهای بافر یکی از آسیبپذیریهای مهم در حوزه امنیت اطلاعات باقی مانده است.
بافر یک قطعه فیزیکی برای ذخیره اطلاعات موقت هست که بر روی رم قرار دارد. برخلاف حافظه کش(Cach) که برای بالابردن سرعت استفاده میشود، بافر برای هماهنگی سرعت بین دو سخت افزار بکار میرود. به عنوان مثال، وقتی ویدئویی را آنلاین میبینیم در روند پخش ویدئو به طور همزمان، ویدئو دانلود و در بافر ذخیره میشود. بنابراین، کاهشی کوچک در سرعت اتصال یا وقفه سرویس، سریع بر عملکرد پخش ویدئو تاثیر نمیگذارد و یا زمان چاپ کردن اسناد، این بافر هست که بین سیستم و چاپگر قرار میگیرد و اطلاعات برای چاپ را با سرعت مناسب از سیستم میگیرد و سرعت انتقال اطلاعات را با سرعت چاپگر تنظیم میکند.
بر روی RAM دو مدل بافر وجود دارد Stack و Heap که حافظه پشته (Stack) بصورت LIFO و حافظه هیپ (Heap) بصورت تصادفی اطلاعات بر رویشان نوشته و خوانده میشود. سرعت استخراج اطلاعات از روی حافظه پشته سریعتر میباشد. حافظه پشته (Stack)، فضاهای ایستای (استاتیک) هستند ولی حافظه هیپ (Heap) جزء فضاهای پویای(دینامیک) هستند که زمان اجرای برنامه ساخته میشوند. زمانی که دادههای پرکاربرد و با اندازه کوچک نیاز هست از پشته استفاده میشود و هر زمان به قطعات بزرگ داده و مدیریت آنها نیاز هست از حافظه Heap استفاده میشود.
سرریز بافر یک آسیبپذیری است که بر اثر مقداردهی بیش از حد به بافر ایجاد میشود. زمانی که مقدار بیشتری از ظرفیت بافر به آن اعمال شود اطلاعات در فضای بیرون از بافر نوشته میشود و اطلاعات قبلی از بین میرود. آسیبپذیری سرریز بافر معمولا زمانی رخ میدهد که کد:
حمله سرریز بافر زمانی رخ میدهد که نفوذگر اقدام به انجام سرریز بافر کرده و با برنامهریزی دقیق قصد به خطر انداختن سیستم را دارد. این حمله جزء خطرناکترین حملات حساب میشود و اکثر نفوذگران به قصد حمله به سیستم عامل از این آسیبپذیری بهره میبرند. اهداف نفوذگران برای انجام این حمله به شرح زیر میباشد:
باید توجه داشت که حملات انکار سرویس(DoS) هدفشان فقط از کار انداختن سیستم قربانی است ولی در حملات سرریز بافر هدف اصلی بدست آوردن دسترسی به سیستم قربانی میباشد.
حملات سرریز بافر از استراتژیهای مختلفی استفاده میکنند و بخشهای مختلفی از کد را مورد هدف قرار میدهند. در زیر به معرفی چند حمله شناخته شده سرریزبافر میپردازیم:
به عنوان مثال، یک عدد صحیح 16 بیتی وجود دارد که ممکن است یک عدد صحیح بدون علامت را از 0 تا 65535 و یا عدد صحیح علامت دار از -32768 تا 32767 را ذخیره کند. بنابراین، در طی عملیات محاسباتی، اگر نتایج بیش از فضای اختصاص داده شده باشد ( مانند 65535 + 1)، کامپایلر ممکن است خطا را به طور کامل نادیده بگیرید و یا برنامه را لغو کند. اکثر کامپایلرها، سرریز را نادیده میگیرند و خروجی یا خطا غیر منتظره را ذخیره میکنند. این امر منجر به حملات مختلفی مانند سرریز بافر می گردد که باعث اجرای برنامههای مخرب و یا افزایش سطح دسترسی میشود.
استفاده از توابع زیر منجر به رخ دادن حمله سرریز فرمت رشته می شوند:
حملات سرریز بافر مسئول برخی از بزرگترین نقض داده ها در تاریخ هستند. برخی از نمونه های قابل توجه عبارتند از:
در زبانهای برنامه نویسی مانند C و C++ بدلیل اینکه اجازه دسترسی مستقیم به فضاهای حافظه داده میشود و شیء از نوع قوی (strong object types) وجود ندارد، بهراحتی حملات سرریز بافر پیادهسازی میشود و کنترل دسترسی حافظه به دست نفوذگر میافتد. در زبانهای برنامه نویسی سطح بالا مانند پایتون، پی اچ پی، پرل، جاوا، یا جاوا اسکریپت که اغلب برای ساخت برنامههای کاربردی وب استفاده میشوند، چنین حملاتی بدلیل ساختار این زبانها کمتر رخ میدهد ولی بخاطر اینکه برنامه نوشته شده با این زبانها در آخر باید بر روی سیستم عاملهایی که بر پایه C هستند و یا زمان اجرا از runtime های نوشته شده با زبان C استفاده میکنند، باید احتمال وقوع چنین حملاتی را داد و پیشگیریهای لازم را اعمال کرد.
اگر به وبسایت owasp سر بزنید در خصوص آسیب پذیری سرریز بافر خواهید دید این آسیب پذیری از نظر شدت آسیب پذیری(Severity ) رتبه خیلی بالا(Very High ) و از نظر احتمال بهره برداری، بالا رو به خیلی بالا (High to Very High) مشخص شده است.
بهترین راه برای تشخیص این نوع آسیب پذیری، استفاده از یک تجزیه کننده کد استاتیک است. در زیر دو ابزار در این زمینه معرفی شده است:
2. ابزار Kiuwan: این نرم افزار به عنوان یک نرم افزار خدمات استاتیک تجزیه و تحلیل نرم افزار چند تکنولوژی برای تجزیه و تحلیل نرم افزار، کیفیت و اندازه گیری امنیت و مدیریت است. در سال ۲۰۱۲ توسط شرکت firm که در سال ۲۰۰۸ تاسیس شد، منتشر شده است. این ابزار یکی از ابزارهای موجود در وب سایت امنیت وب سایت Open Web Application Security Project (OWASP) است و نیز فینالیست برای جایزه IBM Beacon 2015 بود. به عنوان یک ابزار چند تکنولوژی، Kiuwan از بسیاری از زبانهای برنامهنویسی پشتیبانی میکند، مثل:
ABAP, C, C++, C#, Objective-C, COBOL, Java, Java Server Pages (JSP), JavaScript, JCL, PHP, PL/SQL, Transact-SQL, SQL, Visual Basic, Visual Basic .NET, RPG, SQL*Forms, Android or Hibernate.
روشهای پیشگیری از حملات سرریز بافر به شرح زیر است:
5. محافظت از حافظه با کمک مکانیزم SEH(Structured exception handler overwrite protection/SEHOP): این ویژگی برای جلوگیری از سوء استفاده هایی که از تکنیک بازنویسی استثنایی ساختار یافته (SEH) استفاده می کنند، طراحی شده است. این مکانیزم برای حفاظت در زمان اجرا ارائه شده است. همانطور که در تصویر زیر مشخص است تابع FinalExceptionHandler در DLL به عنوان اولین کنترل کننده استثنا در همه چرخهها ثبت شده است. همانطور که کنترل کننده های استثنای اضافی ثبت می شوند ، آنها یک لیست پیوندی را تشکیل میدهند که آخرین رکورد همیشه به FinalExceptionHandler اشاره دارد. توزیع کننده استثنا در این لیست پیوند یافته قرار می گیرد و تأیید می کند که آخرین رکورد هنوز به آن عملکرد اشاره دارد. اگر یک مهاجم قسمت بعدی یک رکورد کنترل کننده استثنا را رونویسی کند، حلقه اعتبارسنجی به آخرین رکورد نمی رسد و خرابی زنجیره SEH شناسایی می شود. با این تکنیک جلو اجرای کد مخرب گرفته میشود و دیگر نفوذگر نمیتواند روند اجرا را دستکاری کند و حمله سرریزبافر را پیاده سازی کند.
6. اقدامات توسعه امنیتی(Secure development practices): با بررسی کد امن و نظارت مستمر میتواند برنامه را از سرریز بافر محافظت کند(با نرم افزارهایی که در بخش روش شناسایی اعلام شده است). وقتی برنامه و یا محصول جدیدی استفاده میشود، باید در مقاطع مختلف بررسی شود و اگر وصله(پچ) امنیتی برایش اعلام میگردد، در اسرع وقت اقدام شود. از سیستم عامل های جدید استفاده شود(سیستم عامل های جدید نسبت به حملات سرریز بافر حفاظت شده اند).
7. استفاده از مقدار کانریها(Canaries): کانری ها مقادیر نگهبان هستند که میتوانند از سرریز های بافر جلوگیری کنند. مقدار canary بین بافر و کنترل داده در پشته برای رصد کردن سرریز پشته قرار میگیرد. . در زمان سرریز بافر، معمولاً اولین دادهای که خراب میشود مقدار canary است. پس از خرابی مقدار canary هشدار سرریز بافر منتشر میشود و سپس میتوان این خطا را مدیریت کرد. سه نوع مقدار canary وجود دارد: خاتمهدهنده، تصادفی، XOR تصادفی. نسخه فعلی StackGuard از هر سه نوع پشتیبانی میکند در حالی که ProPolice صرفاً از نوع خاتمه دهنده و تصادفی پشتیبانی میکند.
در این مقاله با حمله سرریزبافر و انواع آن آشنا شدید و راههای پیشگیری از آن را آموختید. همواره پیشگیری بهتر از درمان هست.
به عنوان برنامهنویس و توسعهدهنده نرمافزارها باید توجه داشته باشید که با افزایش روزافزون حملات یکی از بهترین راههای جلوگیری از آنها، کدنویسی امن، توجه به بهروزکردن ابزارهای مورد استفاده و بالابردن سطح آگاهی خود است. ارزیابی امنیتی دورهای کمک شایانی جهت جلوگیری از حملات دارد. میتوان برای ارزیابی امنیتی برنامه های تحت وب، ارزیابی برنامه های دسکتاپی و یا ارزیابی برنامه های موبایل به سایت آشنا ایمن بخش آزمون نفوذپذیری مراجعه کنید.
به عنوان یک کاربر نیز باید همواره جدیدترین و بهروزترین نرم افزارها را استفاده کنید و اخبار IT را دنبال کنید تا به محض اعلام کشف نقص امنیتی در ابزارها یا نرم افزارهای مورد استفاده، سریع اقدام به اعمال وصله امنیتی ارائه شده از سمت سازنده، کنید. در صورت علاقمندی به کسب اطلاعات بیشتر در مورد سایر حملات مانند حملات متداول در سطح شبکه و راههای امن سازی آنها و یا معرفی حملات APT و راههای شناسایی و مقابله با آن میتوانید به مقالات تخصصی وبلاگ آشنا ایمن مراجعه کنید.