پایگاه دانش

حمله سرریز بافر (Buffer Overflow) چیست و چگونه از آن جلوگیری کنیم؟

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

منظور از بافر چیست؟

بافر (Buffer) یک فضای حافظه موقت است که به طور موقت داده‌ها را ذخیره می‌کند تا پردازش‌های مختلف به صورت مؤثرتر انجام شود. این فضا معمولاً برای ذخیره‌سازی موقتی داده‌هایی که از یک منبع به مقصد منتقل می‌شوند یا برای پردازش‌های بعدی استفاده می‌شود. در سیستم‌های کامپیوتری، بافرها به ویژه در پردازش ورودی/خروجی (I/O)، شبکه‌ها و پردازش‌های چندوظیفه‌ای کاربرد دارند و می‌توانند سرعت پردازش داده‌ها را افزایش دهند.

Buffer Overflow چیست؟

سرریز بافر (Buffer Overflow) یک آسیب‌پذیری رایج در برنامه‌نویسی است که زمانی رخ می‌دهد که یک برنامه حجم داده‌ای بیش از ظرفیت یک بافر (فضای اختصاص‌یافته در حافظه برای ذخیره داده‌ها) را دریافت کند. در نتیجه داده‌های اضافی از مرزهای بافر عبور کرده و به بخش‌های مجاور حافظه وارد می‌شوند. این مسئله می‌تواند باعث اختلال در عملکرد برنامه، ایجاد خرابی (Crash) یا حتی اجرای کدهای مخرب شود. حملات سرریز بافر معمولاً در زبان‌هایی مانند C و C++ که مدیریت حافظه را مستقیماً بر عهده دارند، بیشتر دیده می‌شوند. 

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

Buffer Overflow

سرریز بافر چگونه کار می‌کند؟

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

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

سرریز بافر چگونه کار می‌کند؟

انواع حملات Buffer Overflow

  • حملات سرریز بافر مبتنی بر پشته (Stack-based Buffer Overflow)

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

  • حملات سرریز بافر مبتنی بر هیپ (Heap-based Buffer Overflow)

حملات سرریز بافر مبتنی بر هیپ زمانی رخ می‌دهند که فضای حافظه‌ای که برای داده‌ها تخصیص یافته است، بیش از حد پر شود. هیپ یک ساختار حافظه است که برای تخصیص پویا استفاده می‌شود و اغلب برای ذخیره‌سازی داده‌هایی که اندازه ثابت ندارند، مانند آرایه‌ها و رشته‌ها، به کار می‌رود. در این نوع حملات، مهاجم با دستکاری داده‌ها در هیپ، می‌تواند موجب اختلال در عملکرد برنامه یا اجرای کدهای مخرب شود. برخلاف حملات مبتنی بر پشته، حملات مبتنی بر هیپ پیچیده‌تر هستند و به دلیل ویژگی‌های خاص این ساختار حافظه، دشوارتر می‌توانند بهره‌برداری شوند.

TypesOfBufferOverflow min

سه نمونه واقعی از حملات Buffer Overflow

کرم موریس

کرم موریس که در سال 1988 به عنوان یکی از اولین کرم‌های اینترنتی شناخته شد، از یک آسیب‌پذیری سرریز بافر در سیستم‌عامل UNIX استفاده کرد. این کرم برنامه‌های Sendmail، Finger و RSH/REXEC را آلوده کرد و ظرف دو روز بیش از 10 درصد از اینترنت را تحت تأثیر قرار داد. کرم موریس بیش از 60،000 دستگاه را در مدت زمانی کوتاه آلوده کرد و در نتیجه، بنیاد مقابله با حوادث امنیتی (IRST) شکل گرفت. این حادثه تأثیرات روانی زیادی داشت و باعث تغییرات عمده‌ای در درک امنیت اینترنت شد.

سه نمونه واقعی از حملات Buffer Overflow
کرم موریس

کرم SQL Slammer

کرم SQL Slammer که در ژانویه 2003 منتشر شد، از یک آسیب‌پذیری سرریز بافر در SQL Server 2000 سوء‌استفاده کرد. این کرم با ارسال یک درخواست به پورت 1434 UDP، به سرورهای SQL آسیب رساند و خود را در مقیاس وسیعی تکثیر کرد. در مدت 10 دقیقه، بیش از 75 هزار شبکه مورد حمله قرار گرفتند و این حملات باعث قطع سرویس گسترده (DDoS) در سراسر جهان شدند. این حمله سرعت انتشار بالایی داشت و تأثیرات گسترده‌ای بر شبکه‌ها داشت.

آسیب‌پذیری Heartbleed

Heartbleed یک آسیب‌پذیری خطرناک در OpenSSL بود که در سال 2014 شناسایی شد. این نقص سرریز بافر در پروتکل امنیتی TLS باعث می‌شد که اطلاعات حساس مانند رمزهای عبور و کلیدهای خصوصی به صورت غیرمجاز قابل دسترسی شوند. این آسیب‌پذیری بیش از دو سوم از وب‌سایت‌های HTTPS فعال را تحت تأثیر قرار داد و خسارات مالی زیادی به شرکت‌ها وارد کرد. برای رفع این مشکل، کاربران مجبور به تغییر رمزهای عبور خود در وب‌سایت‌های مختلف شدند.

Heartbleed 1

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

  1. استفاده از تصادفی‌سازی فضای آدرس (ASLR)

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

  1. پیشگیری از اجرای داده‌ها

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

  1. استفاده از زبان‌های برنامه‌نویسی امن

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

  1. اجرای سیاست‌های امنیتی دقیق

اجرای سیاست‌های امنیتی منظم، مانند به‌روزرسانی سیستم‌ها و نرم‌افزارها و همچنین تأیید ورودی‌ها، از ایجاد آسیب‌پذیری‌های سرریز بافر جلوگیری می‌کند. همچنین رعایت اصل حداقل امتیاز (POLP) و اختصاص دسترسی‌های محدود به کاربران می‌تواند مانع از سوء استفاده‌های بیشتر شود.

POLP min

اصل کمترین امتیاز (POLP) یا Principle of Least Privilege چیست؟

  1. استفاده از مقدار کانری (Canaries)

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

  1. محافظت در زمان اجرا

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

  1. نگهداری و به‌روزرسانی سیستم‌ها

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

جمع‌بندی…

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *