سرریز هیپ

سرریز هیپ یک نوع سرریز بافر می‌باشد که در ناحیه داده‌های هیپ (heap) رخ می‌دهد. سرریز هیپ به شیوه‌های متفاوت بنابر سرریزهای مبتنی بر استک بهره برداری (استخراج) می‌شود. حافظه در هیپ به صورت پویا در زمان اجرا توسط برنامه تخصیص داده می‌شود و به طور کلی شامل داده‌های برنامه می‌باشد. استثمار با تخریب کردن داده‌ها در روش‌های خاص برای ایجاد برنامه‌های کاربردی به منظور بازنویسی ساختارهای داخلی مثل اشاره گر لیست پیوندی انجام می‌شود. تکنیک سرریز هیپ استاندارد، بر روی حافظه پویایی که به صورت پیوندی اختصاص داده می‌شود (مانند داده‌های متا) رونویسی می‌شود و با استفاده از نتایج معاوضه اشاره گر، یک اشاره گر تابع برنامه را بازنویسی می‌کند.
یک مثال نمونه بر روی لینوکس این است که دو بافردر کنار یکدیگر بر روی هیپ اختصاص داده می‌شود. نوشتن فراتر از مرز اولین بافر اجازه می‌دهد که داده‌های متا را در بافر دوم بازنویسی کنیم. بیت مورد استفاده از بافر دوم را به صفر تنظیم می‌کنیم و طول را نیز به یک مقدار منفی که اجازه می‌دهد بایت‌های تهی (null) کپی شوند، تنظیم می‌کنیم. وقتی که برنامه تابع free() را بر روی بافر اول اجرا می‌کند، آن تلاش خواهد کرد که دو بافر را در یک بافر ادغام کند. هنگامی که این اتفاق می‌افتد، بافری که آزاد فرض می‌شود، انتظار می‌رود که دو اشاره گر FD و BK را در هشت بایت اول بافری که قبلا اختصاص داده شده است نگه دارد. اشاره گر BK به روی FD می‌نویسد و می‌تواند برای بازنویسی یک اشاره گر استفاده شود. به هر حال به دلایل مختلف این دیگر امکان پذیر نیست.
دست آورد (نتیجه منطقی)
یک رویداد سرریز ممکن است در تخریب داده‌ها یا رفتار غیر منتظره توسط هر پروسه‌ای که تمایل دارد از حافظه استفاده کند، نتیجه شود. در سیستم عامل‌های بدون حفاظت از حافظه، این می‌تواند هرگونه فرایندی بر روی سیستم باشد. یک استثمار عمدی ممکن است در داده‌ها در یک مکان خاص نتیجه شود که با یک روش خاص به تغییر داده می‌پردازد یادر کدهای دلخواه که در حال اجراست، آن را تغییر می‌دهد. آسیب پذیری Microsoft JPEG ، یک مثالی از خطر سریز هیپ است که می‌تواند به یک کاربر کامپیوتر ارائه شود.
فرار از زندان آیفون (iOS jailbreaking) اغلب از سرریز هیپ برای به دست آوردن کدهای دلخواه، معمولا برای استثمار هسته به منظور رسیدن به توانایی جایگزین کردن هسته با یک jailbreak فراهم می‌شود.
تشخیص و پیشگیری
همچنانکه سرریز بافر رخ می‌دهد، سه راه اصلی برای محافظت سرریز هیپ وجود دارد. چندین سیستم عامل مدرن مانند ویندوز و لینوکس چندین پیاده سازی را برای هر سه روش فراهم می‌کند.
جلوگیری از اجرای payload با جدا کردن کد و داده‌ها، به طور معمول با ویژگی‌های سخت افزاری مانند NX-bit در سیستم‌های مدرن.
معرفی تصادفی به طوری که هیپ در یک آفست ثابت ایجاد نشود.
معرفی چک سلامت در مدیریت هیپ.
کتابخانه GNU libc از نسخه 2.3.6، شامل راهکارهایی امنیتیست که می‌تواند سرریز هیپ را پس از رخ دادن تشخیص دهد، برای مثال با چک کردن ثبات اشاره گر هنگامی که unlike (جداکردن) رافراخوانی می‌کند. اما مادامی که این راهکارها محافظت در برابر استثمارهای به سبک قدیمی انجام می‌دهند، قابل اعتماد و غیرقابل استثمار نیستند. همانطور که در توصیف شده است، توصیفات بیشتری نیز در داده شده است. علاوه بر این سیستم‌عامل‌های مبنی بر لینوکس از سال ۲۰۰۵ از پشتیبانی کرده است. هرچند با پیاده‌سازی بهتری در سالها قبل معرفی شده بود. همچنین لینوکس پشتیبانی از NX-bit را از سال ۲۰۰۴ را فراهم کرده است.
مایکروسافت از ماه آوریل سال ۲۰۰۳ در ویندوز سرور ۲۰۰۳ و در اوت ۲۰۰۴ در ویندوز xp با در برابر سرریزهای هیپ مقیم در بافر محافظت کرده است. این کاهش لغو پیوند و کوکی‌های هدر ورودی هیپ را بی‌خطر می‌سازد. نسخه‌های بعدی ویندوز مثل ویستا، سرور ۲۰۰۸ و ویندوز ۷ این موارد را شامل می‌شوند: حذف ساختارهای داده‌ای که معمولا مورد هدف قرار می‌گیرند، ورودی هیپ متا داده‌های تصادفی، گسترش نقش کوکی هدر هیپ، تصادفی کردن آدرس پایه هیپ، تابع رمزگذاری اشاره گر، پایان دادن به تخریب هیپ و تنوع الگوریتم. جلوگیری از اجرای داده‌های معمولی (DEP) و همچنین ASLR به کاهش این حمله کمک می‌کند.