سرریز هیپ
سرریز هیپ یک نوع سرریز بافر میباشد که در ناحیهٔ دادههای هیپ (heap) رخ میدهد. سرریز هیپ به شیوههای متفاوت بنابر سرریزهای مبتنی بر استک بهرهبرداری (استخراج) میشود. حافظه در هیپ به صورت پویا در زمان اجرا توسط برنامه تخصیص داده میشود و بهطور کلی شامل دادههای برنامه میباشد. استثمار با تخریب کردن دادهها در روشهای خاص برای ایجاد برنامههای کاربردی به منظور بازنویسی ساختارهای داخلی مثل اشاره گر لیست پیوندی انجام میشود. تکنیک سرریز هیپ استاندارد، بر روی حافظهٔ پویایی که به صورت پیوندی اختصاص داده میشود (مانند دادههای متا) رونویسی میشود و با استفاده از نتایج معاوضهٔ اشاره گر، یک اشاره گر تابع برنامه را بازنویسی میکند.
یک مثال نمونه بر روی لینوکس این است که دو بافردر کنار یکدیگر بر روی هیپ اختصاص داده میشود. نوشتن فراتر از مرز اولین بافر اجازه میدهد که دادههای متا را در بافر دوم بازنویسی کنیم. بیت مورد استفاده از بافر دوم را به صفر تنظیم میکنیم و طول را نیز به یک مقدار منفی که اجازه میدهد بایتهای تهی (null) کپی شوند، تنظیم میکنیم. وقتی که برنامه تابع free() را بر روی بافر اول اجرا میکند، آن تلاش خواهد کرد که دو بافر را در یک بافر ادغام کند. هنگامی که این اتفاق میافتد، بافری که آزاد فرض میشود، انتظار میرود که دو اشاره گر FD و BK را در هشت بایت اول بافری که قبلاً اختصاص داده شدهاست نگه دارد. اشاره گر BK به روی FD مینویسد و میتواند برای بازنویسی یک اشاره گر استفاده شود. به هر حال به دلایل مختلف این دیگر امکانپذیر نیست.
دست آورد (نتیجهٔ منطقی)
[ویرایش]یک رویداد سرریز ممکن است در تخریب دادهها یا رفتار غیر منتظره توسط هر پروسهای که تمایل دارد از حافظه استفاده کند، نتیجه شود. در سیستم عاملهای بدون حفاظت از حافظه، این میتواند هرگونه فرایندی بر روی سیستم باشد. یک استثمار عمدی ممکن است در دادهها در یک مکان خاص نتیجه شود که با یک روش خاص به تغییر داده میپردازد یادر کدهای دلخواه که در حال اجراست، آن را تغییر میدهد. آسیب پذیری Microsoft JPEG GDI+، MS04-028 یک مثالی از خطر سریز هیپ است که میتواند به یک کاربر کامپیوتر ارائه شود. فرار از زندان آیفون (iOS jailbreaking) اغلب از سرریز هیپ برای به دست آوردن کدهای دلخواه، معمولاً برای استثمار هسته به منظور رسیدن به توانایی جایگزین کردن هسته با یک jailbreak فراهم میشود.
تشخیص و پیشگیری
[ویرایش]همچنانکه سرریز بافر رخ میدهد، سه راه اصلی برای محافظت سرریز هیپ وجود دارد. چندین سیستم عامل مدرن مانند ویندوز و لینوکس چندین پیادهسازی را برای هر سه روش فراهم میکند.
- جلوگیری از اجرای payload با جدا کردن کد و دادهها، بهطور معمول با ویژگیهای سخت افزاری مانند NX-bit در سیستمهای مدرن.
- معرفی تصادفی به طوری که هیپ در یک آفست ثابت ایجاد نشود.
- معرفی چک سلامت در مدیریت هیپ.
کتابخانهٔ libc از نسخهٔ 2.3.6، شامل راهکارهایی امنیتیست که میتواند سرریز هیپ را پس از رخ دادن تشخیص دهد، برای مثال با چک کردن ثبات اشاره گر هنگامی که unlike (جداکردن) رافراخوانی میکند. اما مادامی که این راهکارها محافظت در برابر استثمارهای به سبک قدیمی انجام میدهند، قابل اعتماد و غیرقابل استثمار نیستند. همانطور که در Malloc Maleficarum توصیف شدهاست، توصیفات بیشتری نیز در Malloc Des-Maleficarum داده شدهاست. علاوه بر این سیستمعاملهای مبنی بر لینوکس از سال ۲۰۰۵ از ASLR پشتیبانی کردهاست. هرچند PaX با پیادهسازی بهتری در سالها قبل معرفی شده بود. همچنین لینوکس پشتیبانی از NX-bit را از سال ۲۰۰۴ را فراهم کردهاست. مایکروسافت از ماه آوریل سال ۲۰۰۳ در ویندوز سرور ۲۰۰۳ و در اوت ۲۰۰۴ در ویندوز xp با [۱] در برابر سرریزهای هیپ مقیم در بافر محافظت کردهاست. این کاهش لغو پیوند و کوکیهای هدر ورودی هیپ را بی خطر میسازد. نسخههای بعدی ویندوز مثل ویستا، سرور ۲۰۰۸ و ویندوز ۷ این موارد را شامل میشوند: حذف ساختارهای دادهای که معمولاً مورد هدف قرار میگیرند، ورودی هیپ متا دادههای تصادفی، گسترش نقش کوکی هدر هیپ، تصادفی کردن آدرس پایهٔ هیپ، تابع رمزگذاری اشاره گر، پایان دادن به تخریب هیپ و تنوع الگوریتم. جلوگیری از اجرای دادههای معمولی (DEP) و همچنین ASLR به کاهش این حمله کمک میکند.
منابع
[ویرایش]پیوند به بیرون
[ویرایش]- https://web.archive.org/web/20060713194734/http://doc.bughunter.net/buffer-overflow/heap-corruption.html
- Heap Overflow article at Heise Security
- Defeating Microsoft Windows XP SP2 Heap protection and DEP bypass
مطالعه بیشتر
[ویرایش]- پخش کردن هیپ (Heap spraying)
- سرریز بافر (Buffer overflow)
- سرریز استک (Stack overflow)
- سرریز بافر استک (Stack buffer overflow)
- استثمار (Exploit)
- Shellcode