بخشی از مقاله
.1 مقدمه
گسترش نرمافزارها در جوامع، باعث شده است که نـفـوذگـران، را اندازهگیری کنند. در این گزارش، حمله سرریزبافر که نـاشـی از
بیش از پیش در صدد سوءاستفاده از این ابزارها برآیند و پـس از عدم کنترل بافر دریافتکننده داده اسـت، بـهعـنـوان سـومـیـن
کشف آسیبپذیری موجود در نرمافزار، با توجه به نوع نـرم افـزار و آسیب پذیری خطرناک در حوزه نرمافزار بیان شده اسـت. نـتـایـج
نحوه ورود اطلاعات به آنها، از این آسیبپذیـری بـه نـفـع خـود حاصل از این حمله، اجرای کد مخرب، نقض سرویس و از دسـت
بهره برداری میکنند. موسسه SANS1 بههمراه موسسه MITRE2 در دادن داده است. در این میان، آسیب پذیری قالب رشته3، در جایگـاه
سال 2011، بیست و پنج خطای نرمافزاری که منجر به آسیب پذیری بیستوسوم قرار دارد. هزینه لازم جهت رفع این آسیبپذیـری کـم
نرم افزارها میشوند و بهسادگی قابل سوءاستفاده هستنـد را طـی بوده و سوءاستفاده از آن، نیاز به دانش زیادی ندارد. برای دهه هـای
گزارشی بیان کردهاند. این گزارش برای چهار دسـتـه از افـراد از اخیر، این آسیبپذیری به عنوان آسیب پذیری مطرح در گـزارشـات
دیدگاههای مختلف مفید است. دسته اول، برنامهنویسان هستند کـه امنیتی بیان شده است. [1] راهکارهای متعددی در کـنـتـرل ایـن
در تولید برنامههای خود، از وقوع چنین خطاهایی جلوگیری کننـد. آسیبپذیری در مراحل مختلف تولید و استفاده از نرمافزار ارائه شده
دسته دوم، استفادهکنندگان از نرمافزارها هستند تا در انتخاب نـرم؛ است که می توان آنها را در دسته بندیهای مختلفی تقسیم نـمـود.
افزارها از لحاظ امنیتی دقت بیشتری داشته باشند. دسـتـه سـوم، دسته اول، برنامه نویسی و طراحی امن بهعـنـوان عـامـل انسـانـی
محققانی هستند که بر روی آسیب پذیری های مطرحشـده در ایـن تولیدکننده نرم افزار، دسته دوم، زبانهای برنامه سازی، مترجمهـا و
گزارش، بررسی و توجه بیشتری انجام دهند و دسته چهارم، مدیران ابزارهای تست نرمافزار بهعنوان ابزارهای تولید نرمافزار، و دسته سوم،
نرمافزاری هستند تا میزان موفقیت خود در بهبود امنیت تولیداتشان سختافزار و سیستم عامل ها به عنوان بستر اجرای نرم افزار اسـت. از
1. http://www.sans.org 3. Format String
2. http://cwe. mitre.org
* رایانامه نویسنده پاسخگو: g8911534827@ihu.ac.ir
ًِ
طرف دیگر، می توان مکانیزمهای دفاعی در برابر این حمله را با توجه به نوع بافر، به دو دسته حافظه دینامیک هیپ1 و حافـظـه پشـتـه2 تقسیم کرد. در سادهترین نوع این حمله که شکستن پشته3 نام دارد، مهاجم، آدرس بازگشت را با آدرس مورد نظر خود بازنویسی میکند و اجرای برنامه را به مـحل کـد مـخربی کـه در پشـته تـزریق کــرده است، هدایت میکند. [2] چندین راهحلِ زمان اجرا برای جلوگیری از این آسیبپذیری ارائه شده است که اولین نمونه از آن، محافظ پشته4 نام دارد. در این روش، یک مقدار خاص، بعد از آدرس بازگشت قـرار میگیرد و قبل از بازگشت، این مقدار خاص کنترل می شـــود کـه تغییر نکردهباشد.3[] پروژه پَکس5 از جمله پروژههای تحقیقاتی است که در راستای امن سازی سیستمعامل لینوکس اجرا شده اسـت. در این پروژه، روشی با هدف تصادفی کردن مشخصات فرآینـدهـای در حال اجرا در سطح کرنل 6 ارائه شده است که در حـال حـاضـر، در سیستمعاملهای تجاری در حال استفاده است .[4]
در این مقاله، ابتدا روند توسعهای و تکاملی در مـکـانـیـزم هـای دفاعی مرور گردیده و سپس با استفاده از آمار استخراجشده از پایگاه جهانی آسیب پذیری7، تحلیلی آماری بر روند اثربخشی مکانیزم هـای دفاعی ارائه شده است. در نهایت، با بررسی میزان استفاده نرمافزارهـا و مقایسه آن با آمارهای آسیبپذیری، میزان خسارات وارده بـررسـی شده است.
.2 مروری بر تکنیکهای سرریزبافر
مهاجم، پس از کشف و آشکارسازی آسیبپذیری در نـرم افـزار مورد نظر، اقدام به بازبینی و تحقیق در خصوص خطا و آسیب پذیری گزارششده، می نماید. پس از بررسیهای اولیه و بالا بودن احـتـمـال استفاده از آسیب پذیری، برای اکسپلویت اقدام می نماید. در ادامه بـه برخی از روشهای حمله سرریزبافر در پشته و هیپ اشاره می شـود. در تشریح آسیبپذیریها ، بستر اجرا، 32 بیتی فرض شده است.
.1.2 پشته
فرض کنید در بدنه تابع اصلی برنامه، یک تابع احضار شود. پـس از فراخوانی تابع، اتفاقات زیر بهترتیب رخ میدهند:
• یک قاب پشته جدید بر بالای پشته اصلـی ایـجـاد مـی شـود. هماکنون اشارهگر پشته، به ابتدای پشته جدید اشاره میکند.
• تابع فراخوانی میشود. دستورالعمل فراخوانی تابع: ابتدا اشاره گر
مجله علمی؛ پژوهشی ”پدافند الکترونیکی و سایبری“ ، سال دوم، شماره 1، بهار 1393
دستورالعمل جاری8 را بر روی پشته قرار مـی دهـد و سـپـس اشاره گر پشته، به اندازه 4 بایـت کاهـش داده میشود (جـهـت رشد پشته، به سمت پائین فضای آدرس میباشد)
• اشارهگر، به قاب، روی پشته قرار میگیرد.
• مقدار اشاره گر پشته، در اشارهگر قاب پشته قرار میگیرد. با ایـن عمل، قاب پشته جدید در بالای قاب پشته قبل قرار میگیرد.
مهاجم با استفاده از روشهای سعی و خطا، فاصله بین اشاره گـر پشته تا قاب پشته را بهدست میآورد (این عدد برابر با طـول بـافـر است). اگر به این عدد مقدار 4 بایت اضافه شود، محل ذخیره سـازی ثبات 9EIP در پشته، بهدست خواهد آمد. مهاجم با استفاده از یـک رشته به طول این عدد، فضای پشته را بازنویسی می کند. الـبـتـه 4 بایت آخر این بازنویسی، یک آدرس در بدنه برنامه است .[5]
شکل 1)؛الف )، قطعه کد آسیب پذیر و شـکـل 1)؛ب)، نـحـوه استفاده مهاجم از قطعه کد آسیبپذیر در پشته را نشان میدهد.
شکل 1)؛الف): قطعه کد آسیبپذیر [6]
شکل 1)؛ب): مکانیزم سرریزبافر در پشته با استفاده از کد آسیبپذیر [6]
1. Heap 2. Stack 3. Stack Smashing 4. PAX Project
5. KERNEL 6. Stack Guard 7. NVD: National Vurnubility Database : nvd .nist.gov
× 8. Instruction Pointer (in 32bit stsytem is EIX)
9. ثبات ذخیرهکننده آدرس دستورالعمل جاری
تأثیر مکانیزمهای امنیتی بر آسیبپذیریهای نرمافزاری: مهدی غلامی و همکاران ٌِ
مهاجم به دنبال یکی از دستورالعملهای زیر بـرای بـازنـویسـی مقدار ذخیرهشده ثبات EIP بر روی پشته میباشد:
Call Reg
Pop Ret
Push return
Jmp [Reg] +[Offset]
بهصورت کلی، محتوای بافر بهصورت زیر بازنویسی میشود:
آدرس یک دستور پرش + کد مخرب+ 1 سورتمه= 2 محتوای بافر
.2.2 حافظه هیپ
حافظه هیپ، به بلوک های حافظه آزاد به اندازه های یکسـان در گروههای مختلف تقسیم میشود که هرکدام از این گروهها، در یـک ساختار لیست پیوندی دوطرفه مدیریت می شوند . این بـلـوک هـای حافظه، بهصورت لیست دوطرفه در ارتباط با هم قرار دارند. پـس از درخواست حافظه از طرف برنامه، بلوک حافظه تخصیصیافتهشده، در اختیار برنامه قرار میگیرد. نفوذگرها از این مـکـانـیـزم جـداسـازی سوءاستفاده کرده و کنترل اجرای برنامه را در اختیار مـی گـیـرنـد. شکل 2، نحوه قرار گرفتن سه بلوک حافظه آزاد A,B,C بههمراه یـک بلوک حافظه تخصیصدادهشده Uرا نمایش میدهد.
وقتی بلوک حافظه U آزاد میشود، بهدلیل اینکه این بلوک آزاد؛ شده در همسایگی بلوک آزاد B قرار دارد، باید این دو بلوک از طریق عملیاتی با یکدیگر تلفیق شوند. برای این منظور، لازم اسـت ابـتـدا بلوک B از لیستی که در آن قرار دارد جدا شود. شکل3 روش جـدا شدن بلوک B از لیست بلوکهای آزاد را نشان میدهد. حـال اگـر حافظه U قبل از آزاد شدن توسط نفوذگر بازنویسی شود و از طریـق آن، اشارهگرهای حافظه B نیز با مقادیر نفوذگر بازنویسی شوند، ایـن بازنویسی با شرایطی که بیان میشود موجب کنترل اجرای بـرنـامـه توسط نفوذگر و انتقال اجرای برنامه به کد مـخـرب مـی شـود. p، اشارهگر به تابعی است که نفوذگر توان فراخوانی آن را دارد . M، اشارهگر به کد مخربی است که توسط نفوذگر در حافظه تزریق شـده است. بهطور ساده، برای اجرای این کد مخرب لازم است که اشـاره؛ گر p به محل کد مخرب m اشاره کند تا با فراخوانی تـابـعـی کـه اشارهگر آن در p قرار دارد، کد مخرب اجرا شود. برای ایـن امـر، از مکانیزم جداشدن حافظه B از لیست بلـوک هـای آزاد حـافـظـه،
.3 منظور از سرسره یک زنجیره از دستورات nop میباشد که توسط مهاجم قبل از کد مخرب قرار میگیرد.
4. Sell Code
سوءاستفاده میشود. روشی که بیان شد، یکی از روشهای ابـتـدائـی سوءاستفاده از سرریز حافظه هیپ میباشد که جزئیات آن را به طـور کامل در شکل 4 مشاهده میکنید 7] و .[8
شکل .2 نمایش قرار گرفتن شکل.3 نمایش جدا شدن یک بلوک
بلوکهای حافظه حافظه B از لیست بلوکهای آزاد
شکل .4 نمایش نحوه قرار گرفتن و فراخوانی کد مخرب در حافظه
.3 مکانیزمهای امنیتی در برابر حملات سرریزبافر
.1.3 پشته
در اوایل سال 1972 میلادی، در زمانی که مطالعات در خصوص طراحی تکنیکهای امنیتی کامپیوتری مورد توجه قرار گرفتـه بـود، برای اولین بار، حملات سرریزبافر بهصورت عمومی مستند شدند. در این گزارش، اشاره به یک رویه مانیتور شده است که کد ایـن رویـه، آدرس مبدأ و مقصد را بررسی نمی نماید و این باعث می شود تا کاربر
ٍِ
اجازه بازنویسی قسمتهایی از فضای رویه مانیتور را داشته باشد. در نهایت، تزریق کد به فضای مانیتور، کنترل ماشیـن را در اخـتـیـار مـهاجم قرار میدهد .[9]
امروزه در این نوع حملات، فضای کرنل جایگزین فضـای رویـه مانیتور شده است. اولین سند تهاجمی بهره برداری از یـک حـملـه سرریزبافر، در سال 1988 ارائه گردید. این حمله توسط کرم میـرور1 صورت گرفت و با بهرهبرداری از این حمله، توانست خود را در فضـای اینترنت منتشر نماید. برنامه مورد حمله، سرویسی از سیستم عـامـل یونیکس به نام فینگر2 بود . [10] در سال 1995 میـلادی، تـومـاس لوپاتیک3 یک سرریزبافر را کشف نموده و آن را بـر روی لـیـســـت
پسـت امنیتی بـاگتِرَک4 قـرار داد . [11] چند سال بـعـد، در سـال 1996 میلادی، الیاس لوی5 در مجله فارک6 مقالهای تحـت عـنـوان درهم شکستن پشته برای تفریح و کسب درآمد7 ارئـه نـمـود. وی معرفی گام به گام برای بهرهبرداری از آسیب پذیری سرریزبافر مبتنی بر پشته را منتشر نمود[12] از آن زمان به بعد، دستکم دو نـوع از کرمهای اینترنتی از حملات سرریزبافر برای به خطر انداختن تـعـداد زیادی از سیستم ها، بهرهبرداری نمودند. در سال 2001 میلادی، کرم کدرِد8 از آسیبپذیری سرریزبافر در سرویس اطـلاعـات ایـنـتـرنـت
مایکروسافت9 (نسخه (5 بهرهبرداری نمود .[11] در سـال 2003 میلادی، کرم اس کیواِلسالمِر10، ماشینهایی که سرویس اس کیـو اِل سرور مایکروسافت بر روی آنها فعال شده بود را به خطر انداختند .[13] سرریزبافر، در سـال 2003، بـازیهـای تـحـت پـروانـه ایکس باکس11 را با حمله سرریز بافر مورد هدف قرار داد تا بـتـوانـد بازیهای خارج از پروانه این ابزار را فعال نماید .[14]
کریسپینکوآن و همکاران، یک روش مبتنی بر کامپایلر را ارائـه نمودند. [15] آنان موفق شدند با قرار دادن یک مقدار تصادفی تحـت عنوان کلمه قناری12 قبل از آدرس بازگشت، رونویسی آدرس بازگشت ذخیرهشده بر روی پشته را شناسائی نمایند.
بدین صورت که کامپایلر قبل از بازیابی آدرس بازگشت از روی پشته، ابتدا مقدار کلمه قناری را بررسی مینمود. در صورتی که مقدار کلمهقناری تغییر نکرده باشد، روال عادی برنامـه (بـازیـابـی آدرس
مجله علمی؛ پژوهشی ”پدافند الکترونیکی و سایبری“ ، سال دوم، شماره 1، بهار 1393
بازگشت) انجام میگرفت. آنان این روش را بهصورت یک وصله13 بـر روی کامپایلر لینوکسی جی سی سی14 ارائه نمـودند . کریسپینکوآن و همکاران همچنین به ارزیابی روشهـای محـافظت از پشته پرداختند .[16] کوآن روشهای محافظت از پشته را به چهـار دسـتـه کـلـی تقسیمبندی نمود که عبارتاند از: نوشتن کـد صـحـیـح تـوسـط برنامه نویس، بافر غیرقابل اجرا، بررسی محدوده و بررسی جامـعـیـت اشارهگر . کوآن، روش جملهقناری را در دسته بررسـی جـامـعـیـت اشارهگر قرار داده و به بررسی دقیق آن پرداخت و در نهایت، سـربـار پائین این روش را بررسی نموده است. وی در روش بررسی محـدوده، ابزار پیوریفای15 را برای بررسی مجوز اجازه دسترسی به حـافـظـه،
معرفی نموده است. واگـنِـر و هـمـکـاران روشـی بـرای کشـف آسیب پذیریهای بالقوه در کدهای زبان C ارائه نمودنـد.[17] آنـان ابتدا به بررسی متغیرهای رشته موجود در کدهای برنامه پرداختـه و سپس بافر را با استفاده از زوج محدوده بالا و پائین(محدوده متغـیـر) مدل نمودند. سپس با ارائه الگوریتم خاصی، اقدام به بـررسـی کـد برنامه بر مبنای مدل ساخته شده نمودند. آنها ابزاری برای این منظور تهیه کردند که بر مبنای یک تجزیه گر16 ساختهشده بود. لاروشـل و ایوانز ابزار ال سی ال اینت17 را برای شناسائی حـمـلات احـتـمـالـی سرریزبافر از روی کد برنامه ارائه کردند. [18] این ابزار با استفـاده از توضیحات18 برنامهنویس در خط قبل از احضار تابع، اقدام به بررسـی داده های ارسالشده به تابع با استفاده از چهار پیشفرض اصلی بـرای محدوده داده ها19 مینماید. یکی از روشهای جلوگیری از حـمـلات سرریزبافر، محافظت از متغیرهای ایستا و پویا است. کوآن و همکاران، یک تکنیک مبتنی بر کامپایلر برای محافظت از اشارهگر ارائه نمودنـد .[19] در این روش، اشارهگر در هنگام ذخیرهسازی رمز شـده و در هنگام بارگذاری در ثبات پردازنده، رمزگشائی میشود. آنان مـدعـی سربار پائین این روش شدند. هاف و بیشاپ ابزار استوبـو20 را ارائـه نمودند .[20] این ابزار، کد منبع را بهعنوان ورودی دریافت مینماید و سپس از روی آن، کد ثانویه ای تولید میکند که در هـنـگـام اجـرا، رفتاری مشابه با کد اولیه دارد، با این تفاوت که کد ثانـویـه، حـاوی کدهای اضافی برای کمک به ردیابی می باشند. شکل 5)؛الف)، یـک نمونه از کدهای C را نشان میدهد. بازتولیدشده این کـد تـوسـط استوبو، در شکل 5)؛ب) نمایش داده شده است.
1. Morris worm 11. XBOX
2. Finger 12. Canary Word
3. Thomas Lopatic 13. Patch
4. BugTraq 14. Gcc Compiler
5. Elias Levy 15. Purify
6. Phark 16. Parser
7. Smashing the Stack for Fun and Profit 17. LCLint
8. Code Red worm 18. Comment
9 . Internet Information Services) IIS) 5 . 0 19. minSet, maxSet, minRead , maxRead.
10. SQL Slammer worm 20. STOBO means " Systematic Testing Of Buffer Over-
flows "
تأثیر مکانیزمهای امنیتی بر آسیبپذیریهای نرمافزاری: مهدی غلامی و همکاران َِ
شکل 5)؛الف) کد منبع قبل از بازتولید [20]
یکی از وظایف شبهتابع مشاهدهشده در شکل .5) ب)، افـزودن آدرس شروع بههمراه طول بافر به لیست میباشد. در نهایت، لیستـی از توابع مورد خطر بههمراه سطح هشدار، به بـرنـامـه نـویـس ارائـه میشود.
شکل 5)؛ب) کد منبع پس از بازتولید [20]
رُوِیز و اِسلَم ابزاری به نام سیارد 1 ارائه نـمـودنـد[21] کـه بـا استفاده از روش های بررسی محدوده دسترسی حافـظـه، قـادر بـه شناسائی پویای حملات بافر بود و نحوه بررسی محدوده، با استفاده از اشیاء ارجاعی2 صورت میپذیرفت . این روش برای اولین بار تـوسـط جونز وکِلی ارائه گردید. [22] در این روش، ابتدا یک ساختار حـاوی آدرس مبنا و اندازه اشیاء موجود در پشته ساخته می شـود. سـپـس آدرسهای جدید قبل از قرار گرفتن در حافظه، بررسی میشوند تا در محدوده اختصاصدادهشده در اشیاء ایجادشده از قبل، قرار نگـیـرنـد.
رُوِیز و اِسلَم توانستند بهجای استفاده از ساختار جدولی توسط جونز و کلی، از یک جدول درهم 3 استفاده نمایند تا بدین ترتیب، از سربـار زمان اجرا در این روش کم کنند.
ژوزژونـانن و همـکاران به این منـظور، روشـی را ارائـه نـمودهاند .[23] آنها دادههای برنامه را به سه دسته: دادههای غیرقابل سـرریـز، قابل سرریز و قابل سرریز در تئوری، تقسیم نمودند. دسته اول شامل اشارهگرها، متغیرهای عدد صحیح، ساختارها و یونیونهای فاقد آرایه و متغیرهای اعشاری بودند که ممکن است هدف حمله قرار بگیـرنـد. دسته دوم دادههائی هستند که احتمال سرریزبافر دارنـد و شـامـل آرایه ای از اشارهگرها، ساختارها و یونیونهای حاوی آرایه (به استثناء آرایه کاراکترها) و آرایهای از ساختارها میبـاشـنـد. دسـتـه سـوم،
دادههایی از برنامه هستند که مورد علاقه مهاجمین برای سرریزبـافـر هستند، اما استفاده از آنها بهراحتی برنامه را به سمت تـزریـق کـد هدایت نمیکند و این داده ها توسط توابع دستکاری رشته که دارای آسیبپذیری هستند، مورد استفاده قرار میگیرند. در این روش، یـک سپر محافظتی برای جلوگیری از حملات سرریزبافر در سـگـمـنـت داده های ایستا 4، بین این قسمت با دیگر بلوک های داده ای بـرنـامـه، قرار داده شده است. یان و همکاران با استفاده از روش تصادفی کردن متغیر های آرایه و اشارهگر در فضای برنامه، اقدام به محافظت از بافـر داده مورد نظر و آدرس بازگـشت در بـرابر حمـلات ســـرریـز بـافـر نمودند .[24]