سرریز حوضچه ورودی
سرریز حافظه میانگیر، سرریز بافر (انگلیسی: Buffer overflow یا Buffer overrun) در امنیت کامپیوتر و برنامه نویسی حالتی است که در آن برنامه، هنگامی که در حال نوشتن دادهها در داخل حافظه میانگیر است، از مرز حافظه میانگیر تخطی میکند و باعث رونویسی حافظه مجاور میشود. این یک مورد خاص از نقض ایمنی حافظهاست و گاه مورد توجه خرابکاران یا هکرهای اینترنتی هم به منظور افزایش سطح دسترسی واقع میگردد.
سرریزهای حافظه میانگیر توسط ورودی نامناسب توسط کاربران ناآگاه یا خرابکاران برای اجرای کد خاصی، راه عمل برنامه را تغییر میدهند. این امر ممکن است در رفتار نامنظم، از جمله خطاهای دسترسی به حافظه، نتایج نادرست، تصادف، یا نقض امنیت سیستم منجر شود. بنابراین، آنها اساس بسیاری از آسیبپذیریهای نرمافزاری میباشند و میتوانند مخرب بوده یا مورد سوء استفاده قرار بگیرند.
زبان برنامه نویسی معمولاً با سرریزهای حافظه میانگیر همراه عبارتند از C و C + +، ساخته شدهاست، در حفاظت در برابر دسترسی یا جای نوشتن دادهها در هر بخشی از حافظه و انجام بهطور خودکار نیست بررسی کنید که دادهها به آرایه (ساخته شده در نوع حافظه میانگیر) داخل مرزهای آن آرایه نوشته شدهاست. توصیف فنی سرریز حافظه میانگیر هنگامی رخ میدهد که دادهها نوشته شده در داخل یک حافظه میانگیر، با توجه به مرزهای کافی بررسی، فساد مقادیر داده در حافظه آدرس مجاور به حافظه میانگیر اختصاص دادهاست. شایعترین این زمانی اتفاق میافتد که کپی کردن رشته از کاراکترها از یک حافظه میانگیر به دیگری است.
مثال پایهای
در مثال زیر، یک برنامه تعریف شده دو داده که مجاور در حافظه: ۸-بایت حافظه میانگیر رشتهای، A، و یک عدد صحیح دو بایتی، B. در ابتدا،A دارای هیچ چیزی صفر بایت و B شامل شماره ۱۹۷۹. طول هر کاراکتر یک بایت است.
variable name | A | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
value | [null string] | ۱۹۷۹ | ||||||||
hex value | ۰۰ | ۰۰ | ۰۰ | ۰۰ | ۰۰ | ۰۰ | ۰۰ | ۰۰ | ۰۷ | BB |
در حال حاضر، برنامه اقدام به ذخیرهسازی رشته تهی پایان "بیش از حد" در حافظه میانگیرA. با شکست چک کردن طول رشته، آن را رونویسی مقدار B:
variable name | A | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
value | 'e' | 'x' | 'c' | 'e' | 's' | 's' | 'i' | 'v' | ۲۵۸۵۶ | |
hex | ۶۵ | ۷۸ | ۶۳ | ۶۵ | ۷۳ | ۷۳ | ۶۹ | ۷۶ | ۶۵ | ۰۰ |
با وجودی که برنامه نویس قصد ندارد برای تغییر B در مقدار B در حال حاضر تعداد شکل گرفته از بخشی از رشته کاراکتر جایگزین میشود. در این مثال، بر روی یک سیستم big-endian است که با استفاده از ASCII، "E" به دنبال یک بایت صفر تبدیل شدن به تعداد ۲۵۲۵۶ است. اگر B تنها متغیر قلم دوم از اقلام دادههای تعریف شده توسط برنامه بود، نوشتن یک رشته طولانی که رفت و گذشته از B میتواند باعث خطا مانند گسل تقسیمبندی شود، فسخ این روند بود.
بهرهبرداری
تکنیک بهرهبرداری از آسیبپذیری سرریز حافظه میانگیر با توجه به نوع معماری، سیستم عامل و منطقه حافظه متفاوت است. به عنوان مثال، بهرهبرداری بر اساس هیپ (برای حافظه به صورت پویا اختصاص داده شدهاستفاده میشود)، بسیار متفاوت از بهرهبرداری در پشته است.
پشته مبتنی بر بهرهبرداری
کاربر تمایل به لحاظ فنی ممکن است سرریزهای حافظه میانگیر مبتنی بر پشته این برنامه برای دستکاری در یکی از راههای مختلفی را به نفع خود بهرهبرداری کند:
با جای نوشتن یک متغیر محلی است که در نزدیکی حافظه میانگیر در حافظه در پشته به تغییر رفتار از برنامهای که ممکن است مهاجم بهره مند شوند
با جای نوشتن آدرس برگشت در قاب پشته. پس از بازده عملکرد، اجرا خواهد شد در آدرس برگشت، به عنوان مهاجم، معمولاً پر از حافظه میانگیر ورودی کاربر را مشخص سر گرفته شود.
با جای نوشتن تابع یک اشاره گر، یا برنامه کنترل استثنا است که پس از آن اجرا شدهاست.
با استفاده از یک روش به نام "trampolining"، در صورتی که آدرس دادههای کاربر را تأمین ناشناختهاست، اما محل در ثبت نام ذخیره میشود، و سپس آدرس برگشت، میتواند با آدرس شناسنده رونویسی است که باعث میشود که اجرای حکم اعدام به پرش تأمین شده توسط کاربر دادهاست.
اگر محل در ثبت نام R ذخیره میشود، سپس پرش محل حاوی شناسنده برای مراجعه R، تماس R یا دستورالعمل مشابه، اعدام از دادههای کاربر عرضه میشود. محل opcodes مناسب، یا بایت در حافظه، میتواند در DLLها یا اجرایی خود را در بر داشت.
با این حال آدرس شناسنده بهطور معمول هر کاراکتر تهی نیست و محل این opcodesها میتواند در میان برنامهها و نسخههای سیستم عامل متفاوت باشد. پروژه Metasploit یک پایگاه دادههای چنین opcodes مناسب است، هر چند تنها افراد موجود در سیستم عامل ویندوز ذکر شدهاست.
هیپ، مبتنی بر بهرهبرداری
سرریز حافظه میانگیر در منطقه پشته داده به عنوان یک سرریز پشته اشاره میشود و بهرهبرداری را به شیوهای متفاوت از سرریزهای مبتنی بر پشته انجام میدهد. حافظه پشته به صورت پویا توسط برنامه در زمان اجرا اختصاص داده شده و بهطور معمول شامل دادههای برنامه میباشد. استثمار با فساد این دادهها در روشهای خاص باعث میشود برنامه را بازنویسی سازههای داخلی مانند اشاره گر لیست پیوندی انجام میشود. روش سرریز پشته استاندارد، رونویسی پیوندی تخصیص حافظههای پویا (مانند دادههای meta malloc) و با استفاده از ارز اشاره گر منجر به بازنویسی برنامه اشاره گر تابع است.
موانع استثمار
دستکاری حافظه میانگیر رخ میدهد که قبل از آن خوانده میشود یا اعدام شدهاست، ممکن است منجر به شکست تلاش بهرهبرداری شود. این دستکاری میتواند تهدید از بهرهبرداری، کاهش، اما ممکن است آن را غیرممکن سازد. دستکاری میتواند تبدیل به بالا یا پایینتر مورد، حذف metacharacters و فیلترینگ از رشتههای غیر الفبایی باشد. با این حال، تکنیکها یی برای دور زدن این فیلتر و دستکاری وجود داشته باشد ؛کد عدد و الفبایی، کدهای چند شکلی، خود را تغییر کد و بازگشت به حملات-libc. از روش مشابه میتواند مورد استفاده قرار گیرد برای جلوگیری از شناسایی توسط سیستمهای تشخیص نفوذ است. در برخی موارد، از جمله که در آن کد را به یونیکد تبدیل شده، خطر از آسیبپذیری شدهاند تحریف توسط disclosers به عنوان انکار تنها از خدمات که در واقع اعدام از راه دور کد دلخواه، امکانپذیر است.
نکات بهرهبرداری
در دنیای واقعی سوء استفادههای مختلف از چالشهای است که باید بر طرف شود برای سوء استفاده به عمل قابل اعتماد وجود دارد. این عوامل عبارتند از بایتهای پوچ در آدرسها، تنوع در محل شل کد، تفاوت میان محیطهای مختلف مقابله با اقدامات در عمل است.
NOP روش سورتمه
NOP-سورتمه قدیمیترین و روش بهطور گستردهای شناخته شده برای موفقیت بهرهبرداری از یک سرریز حافظه میانگیر پشتهاست.
راه حل این مشکل، پیدا کردن آدرس دقیق از حافظه میانگیر بهطور مؤثر افزایش اندازه از منطقه هدف است.
برای انجام این بخش بسیار بزرگتر از پشتهها را با دستورالعمل دستگاه بدون عملیات خراب شدهاست. در پایان از دادههای مهاجم تأمین، پس از دستورالعملهای بدون عمل، دستورالعمل به انجام پرش نسبت به حافظه میانگیر که در آن شل کد واقع شدهاست. این مجموعهای از هیچ OPS به عنوان "NOP-سورتمه" میگویند چرا که اگر آدرس بازگشت با هر آدرس در منطقه بدون عملیات حافظه میانگیر رونویسی است از آن خواهد شد "اسلاید" پایین بدون-OPS تا آن را به کد مخرب واقعی پرش در پایان هدایت میشود. این روش نیاز به مهاجم که در پشته NOP-سورتمهاست به جای استفاده ازشل کد نسبتاً کوچک، آن راحدس زد.
از آنجا که از محبوبیت از این روش، بسیاری از فروشندگان سیستمهای پیشگیری از نفوذ این الگوی دستورالعمل دستگاه بدون عملیات در تلاش برای شناسایی شل کد در استفاده از جستجو میباشد.
این مهم است توجه داشته باشید که NOP-سورتمه لزوماً شامل دستورالعمل دستگاه تنها سنتی بدون عملیات، دستور العملها که ماشین حالت به یک نقطه که در آن شل کد اجرا نمیشوند ومی تواند از سخت افزار مورد استفاده قرار میگیرد.
در نتیجه آن سورتمه روش معمول برای بهرهبرداری نویسندگان بدون عملیات با دستورالعمل که هیچ اثر واقعی در مورد اعدام شل کد نوشتن تبدیل شدهاست.
پیوند به بیرون
- "Smashing the Stack for Fun and Profit" by Aleph One
- An Overview and Example of the Buffer-Overflow Exploit. pps. 16-21.
- CERT Secure Coding Standards
- CERT Secure Coding Initiative
- Secure Coding in C and C++
- SANS: inside the buffer overflow attack
- "Advances in adjacent memory overflows" by Nomenumbra
- A Comparison of Buffer Overflow Prevention Implementations and Weaknesses
- More Security Whitepapers about Buffer Overflows
- Computer Security Technology Planning Study, James P. Anderson, ESD-TR-73-51, ESD/AFSC, Hanscom AFB, Bedford, MA 01731 (October 1972) [NTIS AD-758 206]