أسلوب وآلية وطرق منع الهجوم بإغراق ذاكرة التخزين المؤقت buffer overflow attack

نظرة عامة

في هذا المقال سنتحدث عن الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack), متطرقين إلى آليته, أساليبه, تقنيات تجنبه وأنواعه.

المقدمة

إغراق ذاكرة التخزين المؤقت (Buffer Overflow)
يحدث عندما يحاول برنامج ما تخزين بيانات أكثر من سعة المخزن المؤقت (Buffer) مما يؤدي إلى فيضان المعلومات الإضافية إلى الـمخازن المؤقتة المجاورة لتقوم بالتخزين فوق البيانات التي تحويها هذه المناطق[1] .

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

عرفته شركة Microsoft على النحو التالي :
هجوم يتم عن طريق استغلال المهاجم للمخازن المؤقتة التي لم يتم التحقق من عزلها في برنامج ما ، و كتابة رموزه
الخاصة فوق رموز البرنامج. نتيجة لاستبدال رموز البرنامج الأصلية برموز المهاجم، سيعمل البرنامج وفقا لما يمليه عليه المهاجم [2].
على وجه العموم، الهجوم بإغراق ذاكرة التخزين المؤقت يتم على مختلف البيانات (سواء كانت متغيرات أو عناوين).

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

يقوم الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack) باستغلال سوء تنفيذ بعض البرامج التي تعمل على نقل البيانات بين عناوين ذاكرة النظام. النوع الأكثر شيوعا يستغل الافتقار إلى الدقة في عملية التحقق من طول البيانات المدخلة. إهمال التحقق من الطول المناسب لمدخلات البرنامج، يمكن المهاجمين من تكوين مدخلات يفوق طولها ما يمكن للبرنامج التعامل معه، وإعادة توجيه البرنامج إلى عنوان معين في ذاكرة النظام حيث تم وضع تعليمات المهاجم.
من أشهر أساليب إغراق ذاكرة التخزين المؤقت (Buffer Overflow)  التي يستخدمها المهاجمون, أسلوب يعتمد على الثغرة المتعلقة بإرسال طلبات عناوين مواقع (URL) تالفة إلى خادم الويب (web server).عندما يستقبل خادم الويب (web server) طلب عنوان الموقع ((URL، يقوم بتحميله إلى داخل مخزن الذاكرة المؤقت ((memory buffer. مخزن الذاكرة المؤقت ((memory buffer عبارة عن مساحة معينة في الذاكرة، محجوزة لاستخدام متغير برنامج معين. عدم تحقق البرنامج من أن المخزن المؤقت ((Buffer المخصص لطلب ما يمكنه احتواء طول عنوان الموقع ()URL الذي تم طلبه يشكل ثغرة يمكن استغلالها من قبل المهاجمين[5].

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

يعتمد الهجوم بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack)  على اثنين من الأساليب (وعادة مايكون مزيج منهما):

1-  كتابة البيانات إلى عناوين معينة في الذاكرة.

2- امتلاك نظام تشغيل يسيء استخدام أنواع البيانات المختلفة.

هذا يعني أن لغات البرمجة قوية النمط و بيئاتها لا تسمح بالوصول المباشر للذاكرة, و بالتالي تمنع حدوث بإغراق ذاكرة التخزين المؤقت (Buffer Overflow Attack) [3].

 

table
الجدول1 : مواصفات اللغات

 

تقنيات التجنب العامة

1-  ” تدقيق الكود آلياً أو يدوياً.
2- تدريب المطورين: على فحص الحدود المسموحة من الذاكرة واستعمالات التوابع غير الآمنة والمعايير القياسية.
3-  المكدسات (Stacks) غير القابلة للتنفيذ: العديد من أنظمة التشغيل تملك على الأقل بعض الدعم لها.
4-  أدوات الترجمة: StackShield, StackGuard, Libsafe وغيرها.
5-  التوابع الآمنة : كاستعمال تابع (strncat) بدلاً من (strcat) و (strncpy) بدلاً من (strcpy).
6-  فحص التطبيق بشكل دوري بواحدة أو أكثر من الفاحصات المتوفرة والتي تبحث عن أخطاء إغراق ذاكرة التخزين المؤقت (Buffer Overflow) في منتجات الخادم وتطبيقات الويب المتخصصة ” [4].

أنواع إغراق ذاكرة التخزين المؤقت (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)    الآن، لم تعد الدالة تعمل كما في السابق. بدلا من ذلك ، يتم تنفيذ تعليمات برمجية عشوائية (من اختيار المهاجم) [6].

 

إغراق الكومة (Heap Overflow)

يحدث هذا النوع في منطقة بيانات الكومة ((heap ويمكن استغلاله بطريقة مختلفة عن إغراق المكدس (Stack Overflow).
يتم تخصيص الذاكرة للكومة ((heap بشكل حيوي، وذلك بواسطة التطبيق (أثناء تشغيله)، وعادة ما يحتوي على بيانات البرنامج.

المثال التالي,مكتوب بلغة ال C, يوضح الهجوم بإغراق الكومة (heap overflow attack) :

 

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BSIZE 16
#define OVERSIZE 8 /* overflow buf2 by OVERSIZE bytes */

void main(void) {
u_long b_diff;
char *buf0 = (char*)malloc(BSIZE);        // create two buffers
char *buf1 = (char*)malloc(BSIZE);

b_diff = (u_long)buf1 – (u_long)buf0;    // difference between locations
printf(“Initial values:  “);
printf(“buf0=%p, buf1=%p, b_diff=0x%x bytes\n”, buf0, buf1, b_diff);

memset(buf1, ‘A’, BUFSIZE-1), buf1[BUFSIZE-1] = ‘\0’;
printf(“Before overflow: buf1=%s\n”, buf1);

memset(buf0, ‘B’, (u_int)(diff + OVERSIZE));
printf(“After overflow:  buf1=%s\n”, buf1);
}

[root /tmp]# ./heaptest

Initial values:  buf0=0x9322008, buf1=0x9322020, diff=0xff0 bytes
Before overflow: buf1=AAAAAAAAAAAAAAA
After overflow:  buf1=BBBBBBBBAAAAAAA

البرنامج البسيط أعلاه يظهر اثنين من المخازن المؤقتة (Buffers) يقعان في منطقة الكومة ((heap, بحيث يفيض المخزن المؤقت ((buffer الأول مما يؤدي إلى الكتابة فوق محتويات المخزن المؤقت(buffer)  الثاني [6].

 

الإغراق بواسطة تنسيق متسلسلة حروف (Format String Overflow)

تستفيد ثغرات التنسيق لمتسلسلة من الحروف ((Format String من مزيج المعلومات و بيانات التحكم لدالة معينة, مثل ” C/C++’s printf “.

أسهل طريقة لفهم هذا النوع هي عرض المثال التالي :

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

void main(void) {
char str[100] = scanf(“%s”);
printf(“%s”, str);
}

هذا البرنامج البسيط يأخذ مدخلات من المستخدم ويعرضها على الشاشة. متسلسلة الحروف ((String “%s ” يعني أن العامل الآخر, str, ينبغي أن يتم عرضه كمتسلسلة حروف ((String. هذا المثال ليس عرضة للإغراق بواسطة تنسيق متسلسلة حروف (Format String Overflow), لكن  إذا قام أحد ما بتغيير السطر الأخير, سيصبح عرضة لهذا النوع من الهجوم :

printf(str);

لنرى كيف يتم ذلك, نعتبر أن المستخدم قام بإدخال :

%08x.%08x.%08x.%08x.%08x

عن طريق بناء المدخلات على هذا النحو ، يمكن استغلال البرنامج لطباعة أول خمس تدوينات من المكدس       [6] (Stack).

الإغراق باستخدام الشفرة الموحدة (Unicode Overflow)

استغلال الشفرة الموحدة (Unicode) أصعب قليلاً من طرق إغراق ذاكرة التخزين المؤقت
(buffer overflow) النموذجية, لكن ذلك لا يعني أن استخدام الشفرة الموحدة (Unicode) يحمي من إغراق ذاكرة التخزين المؤقت (buffer overflow) . من أمثلته : طروادة المدمر
devastating Trojan)) و  [6] (Code Red).

الإغراق بواسطة الأرقام الصحيحة (Integer Overflow)

عندما يجري تطبيق ما عملية على رقمين ذوي حجم ثابت, فإن النتيجة قد تكون أكبر حجماً. مثلاً, إذا كان لدي رقمين كل منهما مكون من 8 bits (198 و 208) وأجرينا عليهما عملية جمع, و قمنا بتحزين نتيجة العملية في 8 bits, فإن النتيجة لن يتم احتواؤها لكبر حجمها :

1100 0000
+ 1101 0000
= 0001 1001 0000

يوضح المثال التالي هذا النوع من إغراق ذاكرة التخزين المؤقت (buffer overflow) :

#include <stdio.h>
#include <string.h>

void main(int argc, char *argv[]) {
int i = atoi(argv[1]);         // input from user
unsigned short s = i;          // truncate to a short
char buf[50];                  // large buffer

if (s > 10) {                  // check we’re not greater than 10
return;
}

memcpy(buf, argv[2], i);       // copy i bytes to the buffer
buf[i] = ‘\0’;                 // add a null byte to the buffer
printf(“%s\n”, buf);           // output the buffer contents

return;
}

[root /tmp]# ./inttest 65580 foobar
Segmentation fault

يمكن استغلال الشفرة أعلاه لأن عملية التحقق من صحة المدخلات لم تتم على القيمة المدخلة (65580),  لكن بدلا من ذلك تم تحويل القيمة التي تليها إلى قيمة قصيرة و عديمة الإشارة (45).
يعد الإغراق بواسطة الأرقام الصحيحة (Integer Overflow) مشكلة في أي لغة حيث يمكن استغلاله عندما تستخدم الأرقام الصحيحة كمؤشرات ل array و في العمليات الرياضية الضمنية القصيرة [6].

الخلاصة

في نهاية هذا المقال أرجو أن يكون في إمكان القارئ معرفة ما يحويه نظامه من ثغرات, ويحرص على معالجتها, وتطبيق التقنيات المختلفة لتجنبها.

الكاتب ayman

ayman

مواضيع متعلقة

اترك رداً