Buffer Overflow چیست؟| ۶ روش پیشگیری از آن
هکرها هر روز در سراسر دنیا در حال کشف و سوءاستفاده از آسیبپذیریهای وبسایتها، برنامهها و معماری سیستمها هستند. آنها خوب میدانند برنامههایی اجرایی در کامپیوترهای جدید یا قدیمی، در حافظه ذخیره میشوند. همین دانش یک جملهای کافی است تا این آسیبپذیری را هدف قرار دهند و حملهای بهنام سرریز بافر یا buffer overflow را ترتیب دهند. این حملات جدید نیستند و تاکنون بسیاری از سازمانها را در فضای سایبری ویران کردهاند. اما buffer overflow چیست؟ این حملات چطور رخ میدهند؟ چطور باید از وقوع آنها جلوگیری یا با آنها مقابله کرد؟ همراه ما باشید تا راه و چاهش را نشانتان دهیم.
بافر چیست؟
بافر ناحیهای از حافظه است که برای ذخیره دادهها در حافظه رم کامپیوتر استفاده میشود. یک بخش متوالی از حافظه با ظرفیت محدود که به هر چیزی، از یک رشته کاراکتری گرفته تا آرایهای از اعداد صحیح اختصاص داده میشود. این دادهها معمولا برنامههایی هستند که باید اجرا شوند.
سرریز بافر چیست؟
گفتیم که بافر ظرفیت و توان مشخصی دارد. سرریز بافر (buffer overflow) زمانی اتفاق میافتد که حجم دادههای بافر با طول ثابت از ظرفیت آن بیشتر میشود. این اطلاعات اضافی که باید جایی ذخیره شوند، در فضای حافظه مجاور سرریز میشوند و دادههایی که آنجا نگهداری میشوند را خراب یا بازنویسی میکنند. این سرریز معمولا منجر به خرابی سیستم میشود و فرصتی برای مهاجم پدید میآورد تا کد دلخواه را اجرا کند یا با دستکاری کدها، اقدامات مخربی روی سیستم اجرا نماید.
سرریز بافر ممکن است تصادفی یا عمدی باشد:
- تصادفی. زمانی که خود کاربر با اجرای چند فعالیت در یک برنامه، از فضایی که برنامه در اختیار او قرار داده فراتر میرود. در این حالت رفتارهای نامنظم از برنامه سر میزند و حتی ممکن است برنامه از کار بیفتد.
- عامدانه و از قصد. در این حالت مهاجم دادههایی به سمت کامپیوتر کاربر ارسال میکند که بیش از ظرفیت تحمل اوست. این مجموعه داده حاوی کدهایی است که میتواند جایگزین کدهای اصلی و معتبر سیستم شود. با اجرای کد جدید، رفتارهای برنامه طبق انتظار شما پیش نخواهد رفت.
حمله بافر اورفلو یا buffer overflow چیست؟
اما ببینیم حمله buffer overflow چیست و چطور رخ میدهد.
حملات سرریز بافر زمانی اتفاق میافتند که هکر کنترل آدرس بازگشتی یا EIP را در دست بگیرد. وقتی مهاجم اندازه حافظه یک سیستم را بداند، میتواند عامدانه دادههایی روی سیستم بنویسد که از ظرفیت بافر خارج بوده و آن را سرریز کند. سپس مطمئن میشود که EIP یا آدرس برگشتی به برنامهای اشاره میکند که کلید دسترسی به سیستم یا اطلاعات حساس ذخیرهشده در آن است.
حتی مهاجم میتواند دادههایی حاوی کد مخرب بنویسد و از این طریق باعث سرریز بافر شوند. سپس هکر کنترل سیستم را در اختیار میگیرد.
حملات buffer overflow در چند مرحله اجرا میشوند. ابتدا هکر بخشی از حافظه برنامه که در برابر سرریز بافر آسیبپذیر است را پیدا میکند. سپس کاراکترهایی به سمت برنامه میفرستد تا از آسیبپذیر بودن آن اطمینان حاصل کند. در مرحله بعدی آفست را پیدا میکند تا اندازه بافر و آدرس برگشتی را بفهمد. در مرحله آخر حمله یک کد پوسته مخرب وارد میکند تا برنامه را از کار انداخته و سیستم را تحت کنترل خود درآورد.
انواع حملات buffer overflow چیست؟
دو نوع حمله buffer overflow رایج که عوامل مخرب پیاده میکنند، عبارتند از:
حملات سرریز بافر مبتنی بر پشته
حملات مبتنی بر پشته (استک) رایجترین نوع سرریز بافر محسوب میشوند. در این حملات برنامه دادههای بیشتری در بافر مبتنی بر پشته مینویسد. بهمراتب بیشتر از حجمی که در عمل به آن بافر تخصیص داده شده است. در نتیجه سرریز بافر اتفاق میافتد و دادههای مجاور روی پشته تغییر میکنند.
حملات سرریز بافر مبتنی بر هیپ
این نوع سرریز بافر به روشی متفاوت در ناحیه هیپ داده اتفاق میافتد و اجرای آن دشوارتر از حملات مبتنی بر استک است. در این حملات فضای حافظه برنامه با دادههایی پر میشود که برای فرایندهای اجرایی فعلی مورد نیاز نیستند.
زبانهای برنامه نویسی آسیبپذیر در برابر سرریز بافر
بیایید ببینیم تاثیر زبان برنامه نویسی بر حملات buffer overflow چیست؟
مسئله سرریز بافر یکی از قدیمیترین و گستردهترین مشکلات توسعه نرم افزار است که پیشینهاش به زمان معرفی ارتباطات رایانهای برمیگردد و تقریبا تمام برنامهها، سرورهای وب و محیط برنامههای وب را تحت تأثیر قرار میدهد.
بسیاری از زبانهای برنامه نویسی مستعد حملات سرریز بافر هستند. با این حال، میزان چنین حملاتی بسته به زبان مورد استفاده متفاوت خواهد بود. برای مثال کدهای نوشته شده در زبانهای برنامهنویسی پیشرفته مانند پرل و جاوا اسکریپت معمولا در معرض سرریز بافر نیستند. اما برنامهای که به زبانهای C، C++، Fortran یا Assembly نوشته شده، معمولا دست مهاجم را برای اجرای چنین حملاتی باز میگذارد. چون فاقد محافظت داخلی در برابر بازنویسی یا دسترسی به دادهها در حافظه هستند. جالب است بدانید سیستم عاملهای Mac OSX، Windows و Linux همگی از کدهایی استفاده میکنند که به زبان های C و C++ نوشته شدهاند.
در همین راستا این مقاله را بخوانید: چه بحرانهایی منجر به از دست رفتن اطلاعات میشوند؟
روشهای پیشگیری از حملات سرریز بافر
حملات سرریز بافر را میتوان با حفاظت از سیستم عامل در زمان اجرا، استفاده از زبانهای برنامهنویسی امن، تصادفیسازی طرحبندی فضای آدرس و اطمینان از اقدامات امنیتی مناسب کاهش داد. در ادامه چند راهکار کاربردی برای پیشگیری از حملات سرریز بافر معرفی میکنیم.
1. استفاده از OS Runtime Protection
این راهکار تضمین میکند تمام برنامههای اجرایی صرفا در فضای بافر یا حافظه بمانند. بهعلاوه با بررسی و بازنویسی تمام دادههای نوشتهشده در حافظه سیستم، سوء استفاده از آسیبپذیریها برای هکر دشوار میشود.
2. استفاده از زبانهای برنامه نویسی امن
در بخشهای قبلی تا حدی به اهمیت زبان برنامهنویسی در اجرای موفقیتآمیز این حملات آشنا شدیم. اکنون میدانیم در زبانهای برنامهنویسی مانند C و ++C خبری از بررسی آرایهها در زمان اجرا نیست. چون برای بررسی هر برنامه باید کد اضافهای وارد سیستم شود که سرعت را کاهش میدهد. برای کم کردن احتمال این حملات بهتر است سراغ زبانهای برنامهنویسی امنتر مانند سیشارپ، جاوا و پایتون بروید. این زبانها خطر حملات سرریز بافر را کاهش میدهند.
3. استفاده از تصادفیسازی طرحبندی فضای آدرس (ASLR)
این معیار امنیتی آدرس برنامهها و عملکردهای حافظه سیستم را بهطور کاملا تصادفی به مناطق مختلف داده اختصاص میدهد تا پیمایش در عملکردهای حساس حافظه را برای مهاجم دشوار کند.
4. اجرای سیاستهای امنیتی دقیق
منظور از اجرای سیاستهای امنیتی، بهروز نگه داشتن سیستم، اعتبارسنجی تمام دادههای نوشتهشده در سیستم و اختصاص حداقل امتیاز ممکن به کاربران است. با وجود سیاستهای امنیتی مناسب، دیگر نگران حمله سرریز بافر نخواهید بود.
همچنین بخوانید: امنیت شبکه چیست + ۵ راهکار داشتن شبکه امن
۵. استفاده از سیستمعاملهای جدیدتر
وقت آن است که برنامههای قدیمی با سیستمعاملهای تاریخ مصرف گذشته را کنار بگذارید و سراغ نسخههای جدیدتر بروید. سیستم عاملهای Mac OSX، Windows و Linux همگی از کدهایی استفاده میکنند که به زبان های C و C++ نوشته شدهاند و در برابر حملات سرریز بافر آسیبپذیرند. در حالی که کدهای جدیدتر محافظت بیشتری به همراه دارند.
۶. اعمال فشار به توسعهدهندگان برنامه
مدیران سیستم اغلب شکایت دارند که توسعهدهندگان گزارشارت باگ برنامه را نادیده میگیرند و در صدد رفع آنها برنمیآیند. بنابراین انتظار میرود شما بهعنوان مدیر سیستم زمانی که با مشکلی مواجه میشوید که میتواند احتمال سرریز بافر را تقویت کند، خودتان پیگیر مسئله باشید و توسعهدهنده را وادار به ارائه یک راه چاره کنید.
کلام آخر
تا زمانی که سیستمی با انسان در تعامل باشد، احتمال آسیبپذیری وجود دارد و شناسایی آسیبپذیریهای buffer overflow، بهویژه در نرمافزارهای بزرگ و پیچیده، واقعا دشوار است. اما میتوان با اطمینان از اقدامات امنیتی مناسب و رعایت آنها، احتمال حملات را کاهش داد. باید بدانید که برای مقابله با این ناامنی، صرف بهکارگیری شیوههای کدگذاری امن کافی نیست و شرکت فورا باید اقدام به اصلاح نرمافزار آسیبدیده و اطمینان از دسترسی کاربران کند.
به یاد داشته باشید هکرها هر روز دنبال راه تازهای برای سوءاستفاده از آسیبپذیریهای اینچنینی میگردند. این وظیفه شماست که با اطلاع از آخرین پیشرفتهای امنیت سایبری، از آنها جلوتر بمانید.
شما چه اقداماتی برای مقابله با حملات buffer overflow انجام میدهید؟ منتظر شنیدن نظرات شما عزیزان هستیم.
دیدگاهتان را بنویسید