رفتن به مطلب

پست های پیشنهاد شده

ارسال شده در

This is the hidden content, please

This is the hidden content, please

 

سرریز بافر (Buffer Overflow) چیست؟
 سرریز بافر یک مشکل امنیتی و خطای برنامه نویسی است که وقتی اتفاق می افتد که یک برنامه سعی میکند دادههای بیشتری از حد ظرفیت مشخص شده در یک فضای ذخیره سازی موقت (به نام بافر) بنویسد. این اتفاق شبیه این است که یک لیوان را آنقدر پر کنید که آب از لبههای آن سرریز شود!
توضیح ساده با مثال:
فرض کنید یک برنامه کامپیوتری دارید که یک فیلد برای وارد کردن نام کاربری دارد. این فیلد طوری طراحی شده که فقط ۱۰ کاراکتر جای میدهد (مثل یک لیوان کوچک). حالا اگر کسی به جای ۱۰ کاراکتر، ۱۵ کاراکتر وارد کند، ۵ کاراکتر اضافی جایی میروند که نباید بروند! این داده های اضافی ممکن است به بخشهای دیگر حافظه کامپیوتر که برای کارهای مهم دیگر (مثل ذخیره پسورد یا دستورات برنامه) استفاده میشوند، نفوذ کنند.

چرا خطرناک است؟
۱. تغییر رفتار برنامه: اگر هکر بتواند داده های سرریز شده را کنترل کند، ممکن است بتواند برنامه را مجبور به اجرای کدهای مخرب کند (مثلاً باز کردن در پشتی برای دسترسی به سیستم).
 ۲. ازکاراندازی سرویس: سرریز بافر میتواند باعث کرش کردن برنامه یا سیستم شود.
 ۳. دسترسی غیرمجاز: در بدترین حالت، هکرها از این آسیب پذیری برای نفوذ به سرورها، سرقت اطلاعات، یا انتشار بدافزار استفاده میکنند.

چطور اتفاق میافتد؟
برنامهنویسان گاهی فراموش میکنند محدودیت اندازه دادهها را بررسی کنند.
زبانهای برنامهنویسی مثل C یا C++ که کنترل کاملی روی حافظه دارند، بیشتر در معرض این خطا هستند.
مثال معروف: بسیاری از ویروسها و کرمهای کامپیوتری قدیمی (مثل کرم موریس در سال ۱۹۸۸) از همین آسیب پذیری استفاده می کردند.

This is the hidden content, please

چگونه جلوگیری کنیم؟
۱. بررسی اندازه داده ها: قبل از نوشتن داده در بافر، مطمئن شوید اندازه آن از حد مجاز بیشتر نباشد.
 ۲. استفاده از زبانهای امنتر: زبانهایی مانند Python یا Java به صورت خودکار از سرریز بافر جلوگیری میکنند.
 ۳. ابزارهای محافظتی:
Stack Canaries: قطعه داده هایی که تغییر غیرمنتظره آنها هشدار می دهد.
ASLR: تصادفی سازی آدرس حافظه برای سخت تر کردن نفوذ.
DEP: جلوگیری از اجرای کد در بخشهای غیر مجاز حافظه.

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

This is the hidden content, please

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

۱. تاریخچه طولانی و تاثیر گسترده
سرریز بافر از دهه ۱۹۸۰ تا امروز به عنوان یک نقطه ضعف کلیدی در حملات سایبری استفاده شده است.
مثال تاریخی: کرم موریس در سال ۱۹۸۸ که با سوءاستفاده از این آسیب‌پذیری، ۱۰% از سیستم‌های متصل به اینترنت را آلوده کرد.
حتی در سال‌های اخیر، آسیب‌پذیری‌هایی مثل Heartbleed (۲۰۱۴) یا EternalBlue (۲۰۱۷) از مکانیزم‌های مشابه استفاده کرده‌اند.
نتیجه: آشنایی با این آسیب‌پذیری کمک می‌کند الگوهای حملات قدیمی و جدید را تشخیص دهید.

۲. پتانسیل تخریب بالا
سرریز بافر به هکرها اجازه می‌دهد:
کدهای مخرب را اجرا کنند (مثلاً باز کردن دسترسی از راه دور).
برنامه یا سیستم را کرش کنند (مانند حملات DOS).
داده‌های حساس (مانند پسوردها یا اطلاعات بانکی) را سرقت کنند.
مثال: یک سرریز بافر در یک سرور وب می‌تواند به هکر اجازه دهد کل سیستم را کنترل کند.

۳. شیوع در زبان‌ها و سیستم‌های پراستفاده
زبان‌های C و C++ به دلیل دسترسی مستقیم به حافظه، بیشتر در معرض این آسیب‌پذیری هستند.
سیستم‌هایی که با این زبان‌ها نوشته شده‌اند (مثل سیستمعامل‌ها، مرورگرها، برنامه‌های Embedded) هنوز هم ممکن است حاوی چنین خطاهایی باشند.
حتی برنامه‌های مدرن (مثل بازی‌ها یا نرم‌افزارهای سازمانی) می‌توانند به دلیل کدنویسی ضعیف آسیب‌پذیر باشند.
نتیجه: تا زمانی که سیستم‌های Legacy یا کدهای قدیمی استفاده می‌شوند، سرریز بافر یک تهدید زنده است.

۴. پایه‌ای برای یادگیری امنیت سایبری
درک سرریز بافر به شما کمک می‌کند مفاهیم زیر را عمیقاً بفهمید:
نحوه کارکرد حافظه کامپیوتر (Stack، Heap، و غیره).
تفاوت بین زبان‌های مدیریت حافظه (مانند Rust) و زبان‌های Unmanaged (مانند C).
مکانیزم‌های محافظتی مثل ASLR، DEP، و Stack Canaries.
این مفاهیم برای تحلیل سایر آسیب‌پذیری‌ها (مثل SQL Injection یا ROP Attacks) نیز ضروری هستند.

۵. ضرورت پیشگیری و رفع آسیب‌پذیری
توسعه‌دهندگان با یادگیری سرریز بافر می‌توانند:
از توابع ناامن (مثل strcpy در C) اجتناب کنند.
از توابع ایمن (مثل strcpy با بررسی طول) استفاده کنند.
ابزارهای تحلیل کد (مثل Valgrind یا AddressSanitizer) را به کار گیرند.
سازمان‌ها نیز با آموزش تیم‌های خود، ریسک حملات را کاهش می‌دهند.

۶. جلوگیری از حملات زنجیره‌ای
بسیاری از حملات پیشرفته (مثل APTها یا حملات روز صفر) ترکیبی از چندین آسیب‌پذیری هستند.
سرریز بافر اغلب به عنوان اولین قدم برای دسترسی به سیستم استفاده می‌شود.
مثلاً هکر ابتدا با سرریز بافر کنترل بخشی از حافظه را می‌گیرد، سپس از تکنیک‌هایی مانند ROP برای اجرای کد مخرب استفاده می‌کند.

۷. اهمیت در آزمون‌های نفوذ
تسترهای نفوذ و هکرهای اخلاقی (Ethical Hackers) باید بتوانند سرریز بافر را شناسایی و شبیه‌سازی کنند.
ابزارهایی مثل Metasploit یا Immunity Debugger برای اکسپلویت کردن این آسیب‌پذیری طراحی شده‌اند.
آزمون‌های موسسه‌هایی مانند OSCP نیز بر شناسایی چنین آسیب‌پذیری‌هایی تمرکز دارند.

۸. تاثیر بر قوانین امنیتی
استانداردهایی مانند CWE (Common Weakness Enumeration) سرریز بافر را در رده CWE-120 به عنوان یک نقطه ضعف بحرانی فهرست می‌کنند.
سازمان‌ها برای رعایت مقرراتی مثل GDPR یا ISO 27001 موظفند چنین آسیب‌پذیری‌هایی را برطرف کنند.

جمع‌بندی نهایی
سرریز بافر تنها یک «خطای برنامه نویسی» ساده نیست، بلکه یک گره امنیتی حیاتی است که در صورت نادیده گرفتن، می‌تواند به فاجعه منجر شود. درک این مفهوم:
به توسعه‌دهندگان کمک می‌کند کدهای امن‌تری بنویسند.
به مدافعان امنیت سایبری اجازه می‌دهد حملات را پیش‌بینی و خنثی کنند.
به سازمان‌ها در جلوگیری از زیان‌های مالی و اعتباری کمک می‌کند.

This is the hidden content, please

جلوگیری از تاثیرات منفی
برای کاهش خسارت‌های سرریز بافر:
 ۱. استفاده از زبان‌های ایمن (مثل Rust یا Python) که مدیریت حافظه خودکار دارند.
 ۲. فعال‌سازی مکانیزم‌های دفاعی:
ASLR (تصادفی‌سازی آدرس حافظه).
DEP (جلوگیری از اجرای کد در حافظه داده).
Stack Canaries (شناسایی تغییرات غیرمجاز در Stack).
 ۳. بررسی منظم کد با ابزارهای تحلیل استاتیک (Static Analysis).
 ۴. آزمون نفوذپذیری (Penetration Testing) برای شناسایی آسیب‌پذیری‌ها.

نتیجه‌گیری
سرریز بافر تنها یک خطای فنی نیست، بلکه یک تهدید امنیتی چندوجهی است که می‌تواند امنیت داده‌ها، حریم خصوصی، و حتی جان انسان‌ها را به خطر بیاندازد. درک عمیق این آسیب‌پذیری و پیاده‌سازی راهکارهای پیشگیرانه، برای تمام سازمان‌ها و توسعه‌دهندگان ضروری است. 😊
حافظه و پشته (Stack)
ساختار حافظه:
در سیستم‌های کامپیوتری، حافظه به بخش‌های مختلفی تقسیم می‌شود که هر کدام کارکرد خاصی دارند:
کد (Text Segment): شامل کد برنامه اجرایی است. این بخش فقط خواندنی است و حافظت‌هایی در برابر نوشتن روی آن وجود دارد.


داده (Data Segment): برای ذخیره متغیرهای سراسری (global) و داده‌های مقداردهی شده استفاده می‌شود.


پشته (Stack): برای ذخیره اطالاعات محلی توابع، آرگومان‌ها و آدرس بازگشت استفاده می‌شود. در پشته، آخرین داده‌ای که افزوده شده، اولین داده‌ای است که حذف می‌شود (LIFO).


هیپ (Heap): برای تخصیص حافظه‌ی پویا در طول اجرای برنامه استفاده می‌شود. مدیریت حافظه در این بخش باید به صورت صریح توسط برنامه‌نویس انجام شود.


پشته و نحوه عملکرد آن (LIFO):
پشته براساس اصل Last In, First Out عمل می‌کند. در اکثر زبان‌های برنامه‌نویسی، مانند C و C++، وقتی یک تابع فراخوانی می‌شود، فضای لازم برای متغیرهای محلی و آدرس بازگشت در پشته تخصیص داده می‌شود.
نقش پشته در فراخوانی توابع:
پشته نقش مهمی در فراخوانی توابع ایفا می‌کند. هنگام فراخوانی یک تابع:
آرگومان‌ها و آدرس بازگشت تابع در پشته ذخیره می‌شود.
پس از بازگشت از تابع، آدرس بازگشت خوانده شده و برنامه به آنجا ادامه پیدا می‌کند.
متغیرها و بافرها
تعریف متغیرها و بافرها:
متغیر: در برنامه‌نویسی، متغیرها مکان‌هایی در حافظه هستند که برای ذخیره داده‌ها تعریف می‌شوند.


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


نحوه ذخیره داده‌ها در بافرها و اهمیت اندازه بافر:
بافر‌ها به صورت متوالی در حافظه ذخیره می‌شوند و در صورت استفاده ناصحیح، ممکن است منجر به مشکلاتی مانند “Buffer Overflow” شوند. اگر ورودی بافر‌ها به درستی کنترل نشود، می‌تواند باعث مشکلات امنیتی جدی شود.
نحوه فراخوانی توابع و بازگشت آدرس
نحوه فراخوانی توابع در C/C++:
هنگام فراخوانی تابع، آدرس دستور بعدی در پشته ذخیره می‌شود تا برنامه پس از اجرای تابع به این دستور برگردد. این مکان با استفاده از آدرس بازگشت مدیریت می‌شود.
نقش پشته در ذخیره آدرس بازگشت:
هر بار که تابعی فراخوانی می‌شود، آدرس بازگشت در پشته ذخیره می‌شود. اگر این آدرس دچار تغییر شود (مانند حالتی که در حملات امنیتی رخ می‌دهد)، می‌تواند جریان اجرای برنامه را به یک مسیر غیرمنتظره ببرد.
 

This is the hidden content, please

نکات مهم:
در تابع vulnerableFunction، تابع strcpy مستقیماً از ورودی کاربر استفاده کرده و آن را به buffer کپی می‌کند. اگر ورودی بزرگتر از اندازه بافر باشد، باعث “Buffer Overflow” می‌شود.
استفاده از gets خطرناک است زیرا هیچ کنترلی بر روی اندازه ورودی ندارد.

 

معرفی محافظت‌های رایج
Stack Canaries: مقادیر خاصی که بین بافر و آدرس بازگشت قرار می‌گیرند. اگر این مقدار تغییر کند، سیستم از وقوع “Buffer Overflow” آگاه می‌شود.


Address Space Layout Randomization (ASLR): مکان‌های خاصی از حافظه را در هر اجرا تغییر می‌دهد تا بهره‌برداری از آسیب‌پذیری‌ها دشوارتر شود.


Data Execution Prevention (DEP/NX): جلوگیری از اجرای کد در بخش‌هایی از حافظه که فقط برای داده‌ها تعیین شده‌اند.


نحوه دور زدن محافظت‌ها (به صورت مختصر)
شامل تکنیک‌های پیچیده‌ای مانند Return-Oriented Programming (ROP) است. این روش به بهره‌برداران اجازه می‌دهد که با استفاده از توابع موجود در باینری و بدون اجرای مستقیم کد مخرب، سیستم را به نیات خود هدایت کنند.
استفاده از توابع امن مانند strncpy به جای strcpy.
همواره اندازه ورودی‌ها را بررسی کرده و از توابعی که به صورت پیشفرض امن نیستند، با احتیاط استفاده کنید.
از روش‌های استاندارد برای مدیریت حافظه و محافظت از برنامه‌ها در برابر آسیب‌پذیری‌ها بهره ببرید، مانند استفاده از پشته‌های محافظت شده و ارزیابی دقیق کد

This is the hidden content, please

تابع gets ورودی بیش از حد مجاز دریافت می‌کند.
تابع strcpy ورودی را بدون بررسی به buffer منتقل می‌کند.
تغییرات منجر به خرابی یا اجرای کد دلخواه می‌شود.
gdb -q ./vulnerable
(gdb) run
> Enter a long input: AAAAAAAAAAAAAAAAAAA
> Received: AAAAAAAAA

می‌توان مشاهده کرد که چگونه ورودی طولانی، باعث تغییر آدرس‌ها در پشته می‌شود.
مثال توابع امن:
استفاده صحیح از strncpy به جای strcpy:

This is the hidden content, please

 کد نهایی عملی 🫡

This is the hidden content, please

This is the hidden content, please

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • ایجاد مورد جدید...