عملية fuzz testing :
هي عملية اختبار البرمجيات بحثا عن العلل والاخطاء والتي تتعلق بكيفة تعامل البرنامج مع البيانات المدخله اليه وكيف يقوم بادارتها في الذاكرة وايضاتعامله في حالة تم ادخال اليه بيانات غير متوقعة او عشوائية .

تتم عملية الاختبار عن طريق ادخال بيانات كبيره وعشوائيه لمدخلات البرنامج على غير عادة نوع او كمية البيانات التي هو مبرمج لأستقبالها والنظر في كيفية تعامل البرنامج مع هذه المدخلات وكيفية تحكمه ومعالجتة لهذه المدخلات ،محاولين التسبب في حدوث فشل او عطل في شفرة البرنامج وأنهياره (crashe) على سبيل المثال لدي مدخل في برنامج ما، قيمته نصيه وهي مدخل لكتابة تاريخ الميلاد الشخص ،البرنامج مبرمج على استقبال قيمه نصية صغيره لا تتجاوز الاربعة ارقام لها حجم معين ، ولكن عند ادخال بيانات اكبر من قيمة المتغير فأن البرنامج لا يستطيع ان يعالج هذا القدر من البيانات فيحدث انهيار للبرنامج .والغرض من ذلك النظر في كيفية تعامل البرنامج مع هذه المدخلات.لكي نتاكد من سلوك البرنامج في التعامل مع البيانات المستقبله اليه ،في حالة حدث انهيار للبرنامج او خطأ اثبتنا في هذه الحاله ان هناك طفح في الذاكره وعدم مقدرته البرنامج من معالجه المدخل ، نقوم بمتابعة تقرير الانهيار واخطاء البرنامج حتى الوصول القيمة بالتحديد والتي كان فيها طفح الذاكرة (Memory leak) .
مثل هذة الاخطاء لا تكون متوقعة من المبرمج اثناء كتابة البرنامج ، وخطرها كبير جدا لما تسببه الانهيارات في البرامج في حدوث ثغرات امنيه خطيرة تهدد أمن وسلامة البرنامج ونظام التشغيل ، عندما ينهار البرنامج يحاول بناء الشفرة مرة اخرى بعد انهياره ، لحظتها قوم المختبر بحقن شفرة من خارج البرنامج ليقوم البرنامج بتنفيذها مستغلين هذا الخطا بحقن باك دور واختراق النظام بشكل كامل .

عملية fuzz testing يتم تنفيذها بشكل يدوي او باستخدام برامج وادوات مساعدة تقوم بعملية الاختبار بشكل تلقائي وأي نوع من انواع البرمجيات يمكن ان تتم فيه عملية fuzz testing الشرط الوحيد هو ان البرنامج يقوم باستقبال البيانات من الخارج قد تكون البيانات على شكل ملف او امتداد خاص بالبرنامج او بيانات من خارج الشبكة اومدخلات يتلقاها من المستخدم .

ماهي الاجزاء التي يمكن اختبارها؟
الواجه الرسومية للبرنامج من حقول نصيه ومدخلات واحداث الماوس والكيبورد والاوامر في حالة البرامج التي تعمل عن طريق command line .
بروتكولات الشبكة والبيانات التي ينقلها عن طريق توليد او تتغير جزء من البيانات التي ينقلهاالى بيانات عشوائيه او تالفه والنظر هل سوف يواصل عمله بشكل طبيعي ام سوف ينهار ويتوقف عن العمل .

عملية fuzz testing الاهتمام بها اقوى في المشاريع التجاريه الضخمه فقط بسبب التكاليف المرتفعه المترتبه على حماية اجزاء البرنامج وتأمينها . ايضا تتم العملية جنب الى جنب مع ادوات وبرمجيات منها المجاني والمدفوع للمساعدة في تحليل سير سلوك البرنامج واكتشاف نقاط الضعف .

دعونا نأخذ مثال تطبيقي بشكل مبسط عن عملية fuzzing .

اكتشاف المشكلة :
على مختبر الاختراق الذي يقوم بعملية fuzzing ان يملك القدره على تحديد اماكن الضعف في البرنامج او في الشفره -اذا كان البرنامج مفتوح المصدر- والتركيز على المدخلات التي غير محدده للتعامل مع نوع معين او كمية محدده من البيانات واستهدافها لتنفيذ عملية fuzzing ، عند تنفيذ اي برنامج فأن البرنامج يقوم بحجز مساحه من الذاكره يحتاجها لتنفيذ العمليات الخاصه به  تدعى المكدس . اذا المبرمج لم يحصر استقبال البيانات لمتغير على كم ونوع البيانات محدد بالضبط  فهو عرضه ان يستقبل بيانات اكبر مما هو معرف به فيكون عرضه للانهيار او حصول طفح الذاكره . ‎
مثال بسيط :

int main(int argv,char **argc) {
        char buf[256];
        strcpy(buf,argc[1]);
}

في هذا الكود قمنا بتعريف متغير يقوم بأستقبال سلسة نصيه حجمها 256 bytes  يستقبلها عن طريق الداله strcpy.
نحن متفقون بان عند حجز متغير وتعريفه ب 256 بايت فأنه عند تشغيل البرنامج يقوم المتغير بحجز المساحه الخاصه به والتي في مثالنا هي 256 بايت ، هذا يعني ان المتغير يملك مساحه قدرها 256 في الذاكره  – اين هي المشكلة ؟ – هنا تكمن المشكله ، ماذا اذا قام الشخص بأدخال 300 بايت او اكثر المتغير يملك مساحه لأستضافه بيانات بحجم 256 بايت البقيه اين يذهب بهم في هذه الحاله يحصل كراش للبرنامج او ما يسمى بطفح الذاكره ، من المفروض ان البرنامج يتاكد من نوع وحجم البيانات قبل تمريرها الى المتغير كي لا يفاجئ ببيانات اكبر من المساحه التي يملكها .

قم بوضع الكود السابق في ملف نصي وقم بتسميته buf.c ، الان سوف نقوم بعمل Compile للكود سنستخدم الامر

gcc -o code-e buf.c

الان ظهر لدينا ملف جديد اسمه code-e الناتج من عمليه  Compile للكود ، سوف نقوم بتجربه البرنامج ونعطيه قيمه للمتغير .

code-e test-input/.

البرنامج قام باستقبال المتغير بشكل سليم وكل شي على مايرام ، الان سوف نستخدم لغة بيرل في ادخال قيمه نصيه للبرنامج حجمها اكبر من 256 بايت هل البرنامج سوف يستقبلها ام سيظهر خطا .

./code-e $(perl -e ‘print “A”x257 . “\n”‘)

سوف يظهر البرنامج خطا بسبب ان مساحه البيانات اكبر من 256 بايت ، الان حدث طفح للذاكره او انهيار للبرنامج .
الان الكود السابق مصاب وربما يتسبب في ثغره خطيره بسبب انه لا يوجد اي دوال تتاكد من حجم ونوع البيانات قبل ان يتم ادخالها .

هذه كانت نبذه بسيطه جدا اردت فقط التعريف ماذا يعني  بـ fuzzing ، الجزء الثاني من المقال سوف نتعرف ونتعمق اكثر عن العملية .