Investigating the application of differential fuzzing to support the identification and suppression of equivalent mutants: An experimental study
تُظهر هذه الدراسة التجريبية أن الفحص التفاضلي (differential fuzzing) هو نهج عملي محايد لغوياً لتحديد وقمع الطفرات المتكافئة بكفاءة عبر مشاريع برمجية متنوعة من الواقع، محققاً درجات طفرات تقارب المثالية مع توليد مدخلات قابلة للتنفيذ لتعزيز مجموعات الاختبار التقليدية.
البحث الأصلي مرخَّص بموجب CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). هذا شرح مولَّده بالذكاء الاصطناعي للبحث أدناه. لم يكتبه المؤلفون ولم يصادقوا عليه. وللتحقق من الدقة التقنية، يرجى الرجوع إلى البحث الأصلي. اقرأ إخلاء المسؤولية الكامل
تعد اختبارات البرمجيات عملية للتحقق مما إذا كان برنامج الحاسوب يعمل بشكل صحيح، ولكن العثور على كل خطأ محتمل هو أمر مستحيل تقريبًا لأن البرامج معقدة والمدخلات لا حصر لها. ولمواجهة ذلك، يستخدم الباحثون تقنية تسمى "اختبار الطفرات" (mutation testing)، والتي تعمل من خلال إدخال أخطاء صغيرة وواقعية عمدًا في الكود لمعرفة ما إذا كانت الاختبارات الحالية قادرة على رصدها. فإذا فشل الاختبار في اكتشاف الخطأ، فهذا يعني أن مجموعة الاختبارات ليست قوية بما يكفي. ومع ذلك، تواجه هذه الطريقة عقبة عنيدة: بعض هذه الأخطاء الوهمية دقيقة للغاية لدرجة أنها لا تغير سلوك البرنامج على الإطلاق، مما يجعل اكتشافها مستحيلاً. تُعرف هذه الأخطاء باسم "الطفرات المتكافئة" (equivalent mutants)، ويتطلب تحديدها عادةً خبيرًا بشريًا يقضي وقتًا طويلاً في قراءة الكود سطرًا بسطر، وهي عملية بطيئة ومكلفة أعاقت طويلاً الانتشار الواسع لاستخدام هذه الطريقة في الاختبار.
وفي الوقت نفسه، أصبحت طريقة اختبار أخرى تسمى "التدقيق العشوائي" (fuzzing) أداة قياسية للعثور على الثغرات الأمنية. يعمل التدقيق العشوائي عن طريق تغذية البرنامج بكميات هائلة من البيانات العشوائية أو المشوهة لمعرفة ما إذا كان سيؤدي إلى توقف البرنامج عن العمل (crash). وبينما يعد التدقيق العشوائي فعالاً في العثور على الأخطاء التي تسبب توقف البرنامج، إلا أن التدقيق التقليدي غالبًا ما يفتقر إلى اكتشاف أنواع الأخطاء الدقيقة التي تغير كيفية حساب البرنامج أو سلوكه دون التسبب في توقفه. وتستكشف دراسة جديدة أجراها باحثون في جامعة ساو باولو طريقة لدمج هذين العالمين؛ حيث بحثوا في تقنية تسمى "التدقيق العشوائي التفاضلي" (differential fuzzing)، والتي تقوم بتشغيل البرنامج الأصلي ونسخة تحتوي على خطأ صغير جنبًا إلى جنب، مع تغذيتهما بنفس البيانات تمامًا ومقارنة النتائج. فإذا أنتجت النسختان مخرجات مختلفة، يتم رصد الخطأ. أراد الباحثون معرفة ما إذا كان هذا النهج يمكنه تحديد تلك "الطفرات المتكافئة" المراوغة تلقائيًا وبسرعة أكبر مما يمكن للإنسان القيام به.
ولاختبار هذه الفكرة، اختار الفريق ست وظائف محددة من أربعة مشاريع برمجيات مفتوحة المصدر مشهورة مكتوبة بأربع لغات برمجة مختلفة هي: ++C و C و Go و Python. وشملت هذه المشاريع Bitcoin Core (بروتوكول للعملات الرقمية)، و OpenSSL (مكتبة للتشفير)، و LND (شبكة قنوات دفع)، و Arrow (مكتبة للتواريخ والأوقات). وباستخدام أداة يمكنها توليد أخطاء لأي لغة برمجة، أنشأوا 1,090 تنويعًا صالحًا لهذه الوظائف. وقبل بدء الاختبار الآلي، قام الباحثون بفحص الأخطاء يدويًا لإزالة الأخطاء التي كانت متكافئة بشكل واضح، تاركين مجموعة من الحالات الصعبة لمعرفة ما إذا كان النظام الآلي يستطيع التمييز بين بقية الحالات. ثم قاموا بتشغيل خمس سيناريوهات اختبار مختلفة على هذه الأخطاء، تتراوح من اختبارات الوحدة القياسية إلى جلسات التدقيق العشوائي المحددة بزمن قدره خمس دقائق لكل خطأ.
أظهرت النتائج أن التدقيق العشوائي التقليدي، الذي يبحث فقط عن حالات التوقف (crashes)، كان الطريقة الأقل فعالية، حيث رصد عددًا قليلاً جدًا من الأخطاء. وفي المقابل، أثبت نهج التدقيق العشوائي التفاضلي أنه قوي للغاية؛ فعند منحه مهلة خمس دقائق لاختبار كل خطأ، نجح هذا النهج في تحديد وتأكيد سلوك الأخطاء في خمس من أصل ست وظائف، محققًا معدل نجاح يتراوح بين 98 و100 بالمائة. وبالنسبة للوظيفة الوحيدة التي واجه فيها النظام صعوبة في البداية، وجد الباحثون أن إضافة قائمة بسيطة من الكلمات المفتاحية المتوقعة ساعدت النظام على فهم المدخلات بشكل أفضل، مما سمح له في النهاية بالوصول إلى درجة مثالية أيضًا. كما كشفت الدراسة أن الوقت المطلوب للعثور على هذه الأخطاء كان قصيرًا بشكل مفاجئ؛ ففي المتوسط، وجد النظام الاختلافات في حوالي 30 ثانية، وهو أسرع بكثير من الـ 15 دقيقة التي يستغرقها الإنسان عادةً لتحليل حالة واحدة يدويًا.
وبعيدًا عن مجرد العثور على الأخطاء، اكتشف الباحثون أن البيانات المستخدمة أثناء عملية التدقيق العشوائي تحتوي على قيمة خفية. فمجموعة المدخلات التي ولّدتها أداة التدقيق العشوائي، والمعروفة باسم "مجموعة بذور البيانات" (seed corpus)، احتوت على حالات اختبار محددة فاتتها اختبارات الوحدة القياسية التقليدية. وكانت هذه المدخلات قادرة على "قتل" الطفرات التي لم تستطع مجموعات الاختبار التقليدية اكتشافها. وهذا يشير إلى أن البيانات التي تولدها فرق الأمن يمكن إعادة استخدامها لتعزيز مجموعات الاختبار العادية، مما يحول نتاج اختبارات الأمن إلى مورد لجودة البرمجيات العامة. كما حللت الدراسة المدة الزمنية اللازمة للعثور على أصعب الأخطاء التي يمكن اكتشافها، ووجدت أنه بينما تم العثد على معظمها بسرعة، تطلبت بعضها وقتًا أطول بكثير وأظهرت نمطًا حيث تباينت الصعوبة بشكل كبير، تمامًا كما تستغرق بعض المهام وقتًا أطول قليلاً بينما تستغرق مهام أخرى وقتًا طويلاً جدًا.
وخلص الباحثون إلى أن التدقيق العشوائي التفاضلي يوفر طريقة عملية وغير مرتبطة بلغة برمجة معينة لدعم تصنيف هذه الأخطاء الصعبة. فهو لا يتطلب أدوات جديدة معقدة أو إعدادات خاصة بكل لغة، لأنه ببساطة يقارن الكود الأصلي مقابل النسخة المعدلة. ومن خلال التعامل مع الأخطاء المتبقية كمرشحات للمراجعة اليدوية بدلاً من محاولة تصنيف كل خطأ منها، يقلل هذا النهج بشكل كبير من الجهد البشري المطلوب. وتشير الدراسة إلى إمكانية دمج هذا النهج في سير العمل الحالي لتصفية الأخطاء التي تعتبر حقًا "متكافئة" بكفاءة، وترك الخبراء البشريين يركزون فقط على العدد الصغير من الحالات التي تظل غير مؤكدة. ويشير هذا الاكتشاف إلى أن مقارنة بسيطة ومؤتمتة لسلوكيات البرنامج يمكن أن تحل مشكلة لطالما اعتبرت مكلفة للغاية ومستهلكة للوقت لدرجة تمنع اعتمادها على نطاق واسع في الصناعة.
غارق في أبحاث مجالك؟
تصلك نشرة يومية بأحدث الأبحاث المطابقة لكلماتك البحثية المفتاحية — مع ملخصات تقنية، بلغتك.