الخميس، أبريل 07، 2011

الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack)

إغراق ذاكرة التخزين المؤقت (Buffer Overflow) يحدث عندما يحاول برنامج ما تخزين بيانات أكثر من سعة المخزن المؤقت (Buffer) مما يؤدي إلى فيضان المعلومات الإضافية إلى الـمخازن المؤقتة المجاورة لتقوم بالتخزين فوق البيانات التي تحويها هذه المناطق .
الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack)عرفته شركة Microsoft على النحو التالي :
هجوم يتم عن طريق استغلال المهاجم للمخازن المؤقتة التي لم يتم التحقق من عزلها في برنامج ما ، و كتابة رموزه الخاصة فوق رموز البرنامج. نتيجة لاستبدال رموز البرنامج الأصلية برموز المهاجم، سيعمل البرنامج وفقا لما يمليه عليه المهاجم .على وجه العموم، الهجوم بإغراق ذاكرة التخزين المؤقت يتم على مختلف البيانات (سواء كانت متغيرات أو عناوين).
آلية الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack)
يقوم الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack) باستغلال سوء تنفيذ بعض البرامج التي تعمل على نقل البيانات بين عناوين ذاكرة النظام. النوع الأكثر شيوعا يستغل الافتقار إلى الدقة في عملية التحقق من طول البيانات المدخلة. إهمال التحقق من الطول المناسب لمدخلات البرنامج، يمكن المهاجمين من تكوين مدخلات يفوق طولها ما يمكن للبرنامج التعامل معه، وإعادة توجيه البرنامج إلى عنوان معين في ذاكرة النظام حيث تم وضع تعليمات المهاجم.
من أشهر أساليب إغراق ذاكرة التخزين المؤقت (Buffer Overflow) التي يستخدمها المهاجمون, أسلوب يعتمد على الثغرة المتعلقة بإرسال طلبات عناوين مواقع (URL) تالفة إلى خادم الويب (web server).عندما يستقبل خادم الويب (web server) طلب عنوان الموقع ((URL، يقوم بتحميله إلى داخل مخزن الذاكرة المؤقت ((memory buffer. مخزن الذاكرة المؤقت ((memory buffer عبارة عن مساحة معينة في الذاكرة، محجوزة لاستخدام متغير برنامج معين. عدم تحقق البرنامج من أن المخزن المؤقت ((Buffer المخصص لطلب ما يمكنه احتواء طول عنوان الموقع ()URL الذي تم طلبه يشكل ثغرة يمكن استغلالها من قبل المهاجمين.
أساليب الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack)
يعتمد الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack) على اثنين من الأساليب (وعادة مايكون مزيج منهما):
1- كتابة البيانات إلى عناوين معينة في الذاكرة.
2- امتلاك نظام تشغيل يسيء استخدام أنواع البيانات المختلفة.
هذا يعني أن لغات البرمجة قوية النمط و بيئاتها لا تسمح بالوصول المباشر للذاكرة, و بالتالي تمنع حدوث بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack.
تقنيات التجنب العامة
1- " تدقيق الكود آلياً أو يدوياً.
2- تدريب المطورين: على فحص الحدود المسموحة من الذاكرة واستعمالات التوابع غير الآمنة والمعايير القياسية.
3- المكدسات (Stacks) غير القابلة للتنفيذ: العديد من أنظمة التشغيل تملك على الأقل بعض الدعم لها.
4- أدوات الترجمة: StackShield, StackGuard, Libsafe وغيرها.
5- التوابع الآمنة : كاستعمال تابع (strncat) بدلاً من (strcat) و (strncpy) بدلاً من (strcpy).
6- فحص التطبيق بشكل دوري بواحدة أو أكثر من الفاحصات المتوفرة والتي تبحث عن أخطاء إغراق ذاكرة التخزين المؤقت (Buffer Overflow) في منتجات الخادم وتطبيقات الويب المتخصصة ".
أنواع إغراق ذاكرة التخزين المؤقت (Buffer Overflow)
إغراق المكدس (Stack Overflow)
هو النوع الأكثر شيوعا من أنواع إغراق ذاكرة التخزين المؤقت (Buffer Overflow).
أساسيات إغراق المكدس (Stack Overflow) :
1) هناك نوعان من المخازن المؤقتة (Buffers):
1. مخزن المصدر المؤقتSource Buffer.
يحتوي على مدخلات اعتباطية (تم افتراضها من قبل المهاجم).
2. مخزن الوجهة المؤقت ((Destination Buffer.
يقع فوق المكدس ( (Stackومجاور للدالة (return address) الموجودة داخل المكدس ( (Stack، و هو صغير جدا بالنسبة لمدخلات الهجوم.
2) أن يحتوي البرنامج خطأ برمجي، نتيجة لذلك يهمل التحقق من أن حجم مخزن المصدر المؤقت ((Source Buffer يمكن احتواؤه بواسطة مخزن الوجهة المؤقت ((Destination Buffer ، ويقوم بنسخ مدخلات الهجوم إلى مخزن الوجهة المؤقت ((Destination Buffer ، مما يؤدي إلى الكتابة فوق المعلومات الموجودة داخل المكدس ((Stack (متل دالة "return address").
3) عندما نريد تنفيذ الدالة "return address" (التي طالها التغيير) ، يقوم المعالج ((CPU باستخراجها من المكدس (Stack).
4) الآن، لم تعد الدالة تعمل كما في السابق. بدلا من ذلك ، يتم تنفيذ تعليمات برمجية عشوائية (من اختيار المهاجم) .
إغراق الكومة (Heap Overflow)
يحدث هذا النوع في منطقة بيانات الكومة ((heap ويمكن استغلاله بطريقة مختلفة عن إغراق المكدس (Stack Overflow).
يتم تخصيص الذاكرة للكومة ((heap بشكل حيوي، وذلك بواسطة التطبيق (أثناء تشغيله)، وعادة ما يحتوي على بيانات البرنامج بحيث يفيض المخزن المؤقت ((buffer الأول مما يؤدي إلى الكتابة فوق محتويات المخزن المؤقت(buffer) الثاني
الإغراق بواسطة تنسيق متسلسلة حروف (Format String Overflow)
تستفيد ثغرات التنسيق لمتسلسلة من الحروف ((Format String من مزيج المعلومات و بيانات التحكم لدالة معينة, مثل " C/C++'s printf ".هذا البرنامج البسيط يأخذ مدخلات من المستخدم ويعرضها على الشاشة. متسلسلة الحروف ((String "%s " يعني أن العامل الآخر, str, ينبغي أن يتم عرضه كمتسلسلة حروف ((String. هذا المثال ليس عرضة للإغراق بواسطة تنسيق متسلسلة حروف (Format String Overflow), لكن إذا قام أحد ما بتغيير السطر الأخير, سيصبح عرضة لهذا النوع من الهجوم
عن طريق بناء المدخلات على هذا النحو ، يمكن استغلال البرنامج لطباعة أول خمس تدوينات من المكدس  (Stack).
الإغراق باستخدام الشفرة الموحدة (Unicode Overflow)
استغلال الشفرة الموحدة (Unicode) أصعب قليلاً من طرق إغراق ذاكرة التخزين المؤقت
(buffer overflow) النموذجية, لكن ذلك لا يعني أن استخدام الشفرة الموحدة (Unicode) يحمي من إغراق ذاكرة التخزين المؤقت (buffer overflow) . من أمثلته : طروادة المدمر
devastating Trojan)) و (Code Red).
الإغراق بواسطة الأرقام الصحيحة (Integer Overflow)
عندما يجري تطبيق ما عملية على رقمين ذوي حجم ثابت, فإن النتيجة قد تكون أكبر حجماً. مثلاً, إذا كان لدي رقمين كل منهما مكون من 8 bits 198 و 208 وأجرينا عليهما عملية جمع, و قمنا بتحزين نتيجة العملية في 8 bits, فإن النتيجة لن يتم احتواؤها لكبر حجمها :
1100 0000
+ 1101 0000
= 0001 1001 0000
يمكن استغلال الشفرة  لأن عملية التحقق من صحة المدخلات لم تتم على القيمة المدخلة (65580), لكن بدلا من ذلك تم تحويل القيمة التي تليها إلى قيمة قصيرة و عديمة الإشارة .
يعد الإغراق بواسطة الأرقام الصحيحة (Integer Overflow) مشكلة في أي لغة حيث يمكن استغلاله عندما تستخدم الأرقام الصحيحة كمؤشرات ل array و في العمليات الرياضية الضمنية القصيرة .