ثغرات الفيض Buffer Overflow
تحدث ثغرات الفيض Buffer Overflow عندما يتم كتابة بيانات زائدة فى البفر اكثر مما ينبغى وتحدث نتيجة عدم التحقق من مدخلات المستخدم الذى استطاع ان يضيف بيانات اكثر مما يحمله البفر. اكثر تعريف مبسط لهذه الثغرة هو انه عندما تملىء كوب ماء عن اخره فيحدث فيض للماء خارج الكوب .
هذه الثغرة تلزم معرفة بلغة السى ولغة الأسمبلى .
البفر buffer هو جزء من الذاكرة لحمل البيانات بشكل مؤقت وله حجم ثابت.
الهيب heap هو جزء من الذاكرة وحجمه يتغير بحسب متطلبات وعمليات البرنامج.
الستاك “المكدس” stack هو جزء من الذاكرة والتى تستخدمه دوال البرنامج .PUSH تضيف بيانات الى stack .وPOP تحذف بيانات من stack.
مثال مبسط لتوضيح الفكرة “لاحظ الكود التالى” :
المصفوفة buffer تتكون من 10 بايت .عندما نريد اضافة اى بيانات ف index لدينا من صفر الى 9 .لكننا استخدمنا 10 من اجل اضافة القيمة i فيحدث الفيض فالمصوفة فاضت عن حجمها الطبيعى .
لنوضح اكثر “لاحظ الكود التالى” :
سنملىء المصفوفة buffer بما يزيد عن حجمها الطبيعى لذا استخدمنا الدالة srtcpy لإضافة هذه السلسلة النصية Buffer Overflow isecur1ty وبالطبع حجمها اكبر من حجم المصفوفة وبالتالى سيحدث خطأ فى الذاكرة ويتوقف البرنامج لحدوث crash.
خطورة ثغرات الفيض Buffer Overflow :
ثغرات الفيض تسبب توقف البرنامج وتقوم بتنفيذ اكواد خبيثة “shell code” خارج نطاق اكواد البرنامج مما تسبب الحصول على صلاحيات اعلى او الإختراق الكامل.
تستخدم ايضا فى هجمات حرمان الخدمة dos attack على المواقع.
انواع ثغرات الفيض Buffer Overflow :
1. Stack Overflow
2. Heap Overflow
3. Format String Overflow
منها اللوكال local داخل الشبكة المحلية او سيرفر لك صلاحيات عليه
ومنها الريموت remote خارج الشبكة وفيه يتم الإختراق عن طريق ip وله شروط اخرى.
لإستغلال ثغرات الفيض سنحتاج
اولا: الى شيل كود والذى سيتم تشغيله بجهاز الهدف وتنفيذ ما فيه اوامر وتانى تكون غالبا اختراق الهدف .يمكن ان تكتب الشيل كود بنفسك لكنه عملية معقدة وتحتاج خبرة او يمكنك تكوين شيل كود من خلال مشروع الميتاسبلويت وهذه هى الطريقة الأسهل والأنسب للمبتدئين.
ثانيا:سنحتاج تحديد المكان اللازم لحقن الشيل كود وذلك عن طريق استخدام المنقح وليكن مثلا GDB
ثال1 من نوع Stack Overflow
هذا البرنامج يأخذ مدخلات المستخدم ثم يقوم بطباعتها وعرضها
عند تشغيل البرنامج وادخال اقل من 256 بايت يعمل البرنامج ويطبع القيمة المخزنة فى buffer ولكن ماذا اذا كانت القيمة اكبر من 256 بايت :سيظهر الخطأ التالى
عند تشغيل البرنامج وادخال اقل من 256 بايت يعمل البرنامج ويطبع القيمة المخزنة فى buffer ولكن ماذا اذا كانت القيمة اكبر من 256 بايت :سيظهر الخطأ التالى
مكنك ان تفتح البرنامج بالمنقح وتكتشف ما المشكلة .
مثال2 من نوع Stack Overflow
برنامج بسيط يطلب الباسود من المستخدم .اذا كان الباسورد هو isecur1ty يعرض لك ان الباسورد صحيح ويمنحك صلاحيات الروت واى باسورد اخر سيعرض لك Wrong Password
لكن لو حجم الباسورد اكبر من حجم buffer سيعرض لك Wrong Password ولكنه سيمنحك صلاحيات كاملة كما لو كنت الأدمن وبدون معرفة لكلمة المرور الصحيحة
وذلك لأن الدالة ()gets مصابة فلا تتحقق من القيم .
اساسيات GDB:
افتح الترمنال واكتب gdb واضغط انتر
اهم الأوامر :
run:لتشغيل البرنامج المراد تنقيحه
quit:لغلق المنقح
break:لعمل نقطة توقف مثلا عن السطر رقم 20 break buffer.c:20
info break:لعرض نقاط التوقف
list :لعرض السورس كود
continue :لإستكمال تشغيل البرنامج
backtrace:لعرض المكدس stack
info registers:لعرض المسجلات registers
help:لعرض الأوامر وشرحها
لمنع ثغرات الفيض :
1/استبدل الدوال التقليدية بدوال امنة
مثلا استخدم ()fgets بدلا من ()gets
و ()strncmp بدلا من ()strcmp
()strncpy بدلا من ()strcpy
2/استخدام ادوات لفحص الكود تلقائيا مثل its4
3/استخدام ادوات لمراقبة العمليات فى الذاكرة مثل valgrind memcheck
4/استخدام اداوت تتحقق من stack مثل StackGuard