
dtls-fuzzer هو مختبر حالة البروتوكول لتطبيقات خادم DTLS.
dtls-fuzzer هي أداة Java تقوم بتنفيذ اختبارات الحالة البروتوكولية (protocol state fuzzing) لخوادم DTLS . بشكل أكثر تحديدًا، فهي تدعم الوظائف التالية:
يستخدم dtls-fuzzer TLS-Attacker لإنشاء/تحليل رسائل DTLS وكذلك للحفاظ على الحالة.
لتحقيق ذلك، تم توسيع TLS-Attacker لدعم DTLS.
يعتمد dtls-fuzzer على الإصدار 3.0b من TLS-Attacker، وهو إصدار يطبق تحسين DTLS.
تحتوي القطعة الأثرية على:
المجلدات الأكثر أهمية في الدليل الجذر لـ dtls-fuzzer هي:
يحتوي 'experiments/results' على النتائج التجريبية، وهي المخرجات الرئيسية للعمل. على وجه الخصوص:
يتم تسمية مجلدات المخرجات بناءً على تكوين التجربة، أي:
كمثال، يشير اسم المجلد 'jsse-12_rsa_cert_none_rwalk_incl' إلى تجربة على تطبيق JSSE 12 لـ DTLS، باستخدام مجموعة حروف تشمل مدخلات لإجراء مصافحات RSA، ومصادقة شهادة العميل معطلة، وخوارزمية الاختبار هي المشي العشوائي وعمليات إعادة الإرسال مضمنة.
يحتوي مجلد المخرجات على:
يمكن للمقيّم التحقق (على سبيل المثال) من أن النتائج التجريبية في 'included' تتوافق مع تلك المعروضة في الجدول 4، أو أن التكوينات التي تم اختبارها في الجدول 2 تظهر أيضًا في 'all_ciphers'. لاحظ أن النماذج التي تظهر في الورقة البحثية كانت نتيجة تقليم / تشذيب كبير، بينما النماذج التي تظهر في مجلدات المخرجات غير معدلة.
لغرض تقييم dtls-fuzzer من الضروري تنفيذ الخطوات التالية:
يتبع هذا القسم الخاص بالتقييم دليل حول استخدام dtls-fuzzer يقدم حالات الاستخدام الرئيسية له.
تم اختبار dtls-fuzzer على توزيعات Ubuntu 18.04 و Debian 9 من Linux. يجب أن يعمل على أي توزيعة Linux حديثة. لم يتم اختبار الدعم للمنصات الأخرى. يفترض هذا الدليل استخدام توزيعة قائمة على Debian (والتي تحتوي على 'apt-get').
يلزم وجود جهاز افتراضي (VM) Java 8 JDK (Java Development Kit). الإصدار المستخدم لتشغيل التجارب هو 1.8.0_222، على الرغم من أن الإصدارات الأحدث من Java 8 يجب أن تعمل أيضًا. لاحظ أن الأداة لا تُبنى على Java 9 أو أحدث. نعتمد أيضًا على maven (أداة 'mvn') لإدارة التبعيات / النشر.
نوصي باستخدام جهاز قوي بما فيه الكفاية، وإلا قد تصبح معلمات التوقيت الحساسة مثل وقت انتظار الاستجابة منخفضة جدًا، مما يسبب مخرجات مختلفة عن تلك التي تم الحصول عليها في الورقة البحثية. والأسوأ من ذلك، يمكن أن تتسبب في فشل تجارب التعلم. تم تشغيل التجارب الأصلية على خادم متعدد النوى، ومع ذلك، نتوقع (على الرغم من أننا لم نختبر بدقة) أن التعلم يجب أن يكون ممكنًا على جهاز مكتبي بمعالج i7. التعلم ممكن أيضًا على الأنظمة الأضعف إذا تم ضبط معلمات التوقيت وفقًا لذلك. أخيرًا، تتطلب تصور نماذج .dot عن طريق تصديرها إلى .pdf تثبيت مكتبة graphviz. من المفترض أن تكون أداة 'dot' التي توفرها graphviz موجودة في PATH النظام.
باختصار، المتطلبات الأساسية الموصى بها هي:
يتطلب dtls-fuzzer Java 8 JDK (Java Development Kit). إذا لم يكن Java مثبتًا، نقوم بتثبيت تطبيق OpenJDK (عبر 'apt-get' على Ubuntu)، ويمكننا تخطي بقية هذا القسم الفرعي.
> sudo apt-get install openjdk-8-jdk
إذا كان إصدار java مثبتًا، يمكننا التحقق من الإصدار عن طريق تشغيل:
> java -version
يجب أن يبدأ رمز الإصدار بـ 1.8 (مثل 1.8.0_242)، ويجب أن يكون الجهاز الافتراضي "Server VM" (مما يشير إلى أن JDK الكامل مثبت، وليس فقط بيئة التشغيل). إذا كان الأمر كذلك، فقد انتهينا من Java. إذا لم يكن كذلك، يمكننا التحقق مما إذا كان Java 8 JDK مثبتًا على منصتنا ولكن غير محدد حاليًا، عن طريق سرد أجهزة Java الافتراضية المثبتة عبر:
> update-java-alternatives --list
إذا ظهر Java 8 JDK، يمكننا استخدام نفس الأمر لتكوين Java 8 JDK ليكون تطبيق Java الافتراضي.
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64
خلاف ذلك، نحتاج إلى إجراء التثبيت الكامل كما هو موضح في البداية. لسوء الحظ، لا ينجح 'update-java-alternatives' أحيانًا، كما تشير رسائل "error". إذا نشأت مثل هذه الحالة، يمكننا استخدام 'update-alternatives' لتكوين أي جهاز Java افتراضي يتم تحديده بواسطة 'java' (المفسر) و 'javac' (المترجم) بشكل تفاعلي.
> sudo update-alternatives --config java
> sudo update-alternatives --config javac
مع ضبط Java 8، ننتقل إلى تثبيت التبعيات الأخرى، maven، graphviz بالإضافة إلى بعض تبعيات SUT الشائعة. ثم نستنسخ مستودع dtls-fuzzer إلى مجلد من اختيارنا، مع التحقق من فرع القطعة الأثرية. للإنهاء، نجعل هذا المجلد هو الدليل الحالي لدينا.
> sudo apt-get install maven graphviz autotools-dev automake libtool
> git clone -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git ~/dtls-fuzzer
> cd ~/dtls-fuzzer
نقوم أولاً بتشغيل البرنامج النصي 'prepare.sh' الذي يقوم بتثبيت المكتبات التي يعتمد عليها dtls-fuzzer، وهما ملفا .jar محليان و TLS-Attacker 3.0b. ثم نقوم بتثبيت الأداة نفسها. ستكون الأوامر الناتجة على نظام POSIX كما يلي:
> bash prepare.sh
> mvn clean install
بعد هذه الخطوات، يجب أن يكون قد تم إنشاء دليل باسم 'target' يحتوي على 'dtls-fuzzer.jar'. هذه هي مكتبتنا القابلة للتنفيذ. من هذه النقطة فصاعدًا، يُفترض أن يتم تشغيل الأوامر من الدليل الجذر لـ dtls-fuzzer.
لنفترض أننا نريد إنشاء نموذج لـ OpenSSL 1.1.1b باستخدام PSK فقط (المفاتيح المشتركة مسبقًا). يتم التشغيل السريع لـ dtls-fuzzer على النحو التالي.
أولاً نقوم بإعداد الـ SUT، والذي يتم تلقائيًا بواسطة برنامج نصي 'setup_sut.sh'.
> bash setup_sut.sh openssl-1.1.1b
ثم نختار ملف وسائط من مجلد 'args/openssl-1.1.1b'. نلاحظ أن هناك العديد من ملفات الوسائط للاختيار من بينها، وهي:
learn_openssl-1.1.1b_all_cert_none_rwalk_incl
learn_openssl-1.1.1b_all_cert_nreq_rwalk_incl
learn_openssl-1.1.1b_all_cert_req_rwalk_incl
learn_openssl-1.1.1b_psk_rwalk_incl
ملف الوسائط المهم هو 'learn_openssl-1.1.1b_psk_rwalk_incl'، حيث يشير اسم الملف إلى PSK. نختاره بالتالي، ونشغل المختبر عليه. نضيف أيضًا حدًا لعدد الاختبارات إلى 200، لتقصير وقت التعلم. أخيرًا، بالنسبة لـ OpenSSL، يجب تعيين LD_LIBRARY_PATH إلى دليل التطبيق ('suts/openssl-1.1.1b/'). قبل تشغيل التعلم، قد نرغب في تنفيذ اختبار بسيط للتحقق من أن الإعداد يعمل بشكل صحيح. الاختبار الجيد هو مجرد إكمال مصافحة. نقوم بتوفير ملف الوسائط، بالإضافة إلى اختبار مقابل من 'examples/tests' كمعامل. نحصل على:
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -test examples/tests/psk
إذا سارت الأمور على ما يرام، يجب أن يكون الخادم قد طبع "هذه رسالة ترحيب"، وهي رسالة نرسلها بعد إكمال المصافحة. بمعرفة أن الإعداد يعمل، يمكننا الآن بدء التعلم عن طريق تشغيل:
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -queries 200
نلاحظ أنه تم إنشاء دليل مخرجات، 'output/openssl-1.1.1b_psk_rwalk_incl/' للتجربة. يمكننا استخدام الأمر 'ls' لهذا الدليل للتحقق من الحالة الحالية للتجربة (عدد الفرضيات التي تم إنشاؤها...).
> ls output/openssl-1.1.1b_psk_rwalk_incl/
إذا سارت الأمور على ما يرام، بعد 20-30 دقيقة، يجب أن يحتوي دليل المخرجات على ملف 'learnedModel.dot'. يمكننا عرض الملف باستخدام أداة graphviz 'dot'، عن طريق التصدير إلى .pdf وفتح ملف .pdf باستخدام عارض .pdf المفضل لدينا.
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
أخيرًا، يمكننا استخدام 'trim_model.sh' لإنشاء نسخة أفضل / أكثر تشذيبًا من النموذج. يمكن القيام بذلك على النحو التالي:
> bash trim_model.sh --output output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
يمكننا الآن تحديد امتثال النظام عن طريق التحقق من النموذج مقابل المواصفات...
عند استخدام الأمر 'ls' على دليل المخرجات قد نجد ملف 'error.msg'. هذه علامة على فشل التجربة وانتهاء التعلم بشكل مفاجئ. في مثل هذه الحالات، يكشف عرض المحتويات عن سبب الفشل.
> cat output/openssl-1.1.1b_psk_rwalk_incl/error.msg
لاحظ أنه لا يزال من الممكن التحقق من الامتثال على آخر فرضية تم إنشاؤها، طالما تم التحقق من النتائج المحتملة مقابل النظام (كما ينبغي أن تكون على أي حال).
نوفر برنامجًا نصيًا لإعداد الـ SUT. يقوم هذا البرنامج النصي بتنزيل ملفات المصدر، وتثبيت بعض التبعيات (jvm) وبناء الـ SUT. لعرض الـ SUTs التي يتم توفير الإعداد التلقائي لها، قم بتشغيل:
> bash setup_sut.sh
لإعداد، على سبيل المثال، تطبيق tinydtls الخاص بـ Contiki-NG، قم بتشغيل:
> bash setup_sut.sh ctinydtls
سينشئ البرنامج النصي مجلدين في الدليل الجذر لـ dtls-fuzzer.
لسوء الحظ، فإن أتمتة إعداد SUT هي عملية معقدة، لذلك نتخذ الاختصارات التالية. بالنسبة لـ SUTs بلغة Java (JSSE, Scandium) لا نقوم ببناء التطبيقات، بدلاً من ذلك نستخدم ملفات .jar المجمعة من دليل 'experiments/suts'. لاحظ أن الكود المصدري لتطبيقات Java هذه (تطبيقات الخادم) متاح للعموم عبر الإنترنت، انظر Scandium و JSSE، وهو أيضًا الحال بالنسبة لـ PionDTLS. قد يطالب التثبيت التلقائي للتبعيات بالوصول إلى 'sudo'. يحدث هذا لـ GnuTLS الذي يعتمد على مكتبات خارجية مثل nettle، و Eclipse's TinyDTLS، الذي يعتمد على autoconf. أخيرًا، لا نقدم إعدادًا تلقائيًا / ملفات وسائط لـ NSS و PionDTLS بسبب تعقيد إعداد هذه الأنظمة.
إذا توقفت الأمور في عملية الإعداد عن العمل، فقد يؤدي حذف مجلد 'suts' (أو مجلد 'suts/SUT' الخاص بـ SUT) وإعادة تشغيل البرنامج النصي للإعداد إلى حل المشكلة. أيضًا، في حالة فشل البناء، يجب أن يظل الكود المصدري للتطبيق قد تم تنزيله إلى دليل 'suts'. الحل البديل هو بناء التطبيق يدويًا. طالما تم بناء التطبيق، يجب أن يعمل الإعداد لدينا.
نقدم هنا شجرة غير كاملة للتبعيات التي تمتلكها SUTs المختلفة. تلك المائلة هي تبعيات يحاول 'setup_sut.sh' تثبيتها باستخدام الوصول إلى 'sudo'.
نحن الآن جاهزون لتعلم تكوين SUT. يتم توفير ملفات وسائط لتكوينات SUT المختلفة في دليل 'args' الموجود في الدليل الرئيسي لـ dtls-fuzzer. يصف اسم كل ملف وسائط إعداد التجربة (SUT، مجموعة الحروف، المصادقة) كما هو موصوف بواسطة أسماء مجلدات المخرجات في 'experiments/results/'. لبدء التعلم لـ SUT باستخدام ملف وسائط، قم بتشغيل:
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file
سيتم تخزين مجلد المخرجات في دليل 'output' تم إنشاؤه.
مقارنة بتجارب الورقة البحثية، قمنا بزيادة مهلة الاستجابة لعدة SUTs كتكيف مع أجهزة أقل قوة. لتقصير وقت التعلم، نقترح تقليل حد الاختبار لخوارزمية المشي العشوائي من 20000 إلى 5000. يمكن القيام بذلك عن طريق:
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -queries 5000
سيؤدي هذا إلى الكتابة فوق إعداد الحد في ملف الوسائط. بصرف النظر عن GnuTLS و PionDTLS و JSSE، نتوقع أن ينتج التعلم نفس النماذج لهذا الحد الأدنى.
يمكن أن يصبح التوقيت مشكلة، مما يتسبب في عدم الحتمية، يليه إنهاء مفاجئ مع ملف 'error.msg' إعلامي. في مثل هذه الحالات، هناك مقبضان يمكن ضبطهما:
يمكن تعديل هذه المعلمات عن طريق الكتابة فوق (على الأرجح بقيمة أعلى) الإعدادات المقابلة في ملف الوسائط:
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeout new_response_timeout -runWait new_start_timeout
لتجنب المشكلات المتعلقة بالتوقيت، نقترح تشغيل التجارب على جهاز قوي بما فيه الكفاية. السبب الرئيسي لعدم الحتمية هو أن الـ SUT يستغرق وقتًا طويلاً للبدء أو لتوليد استجابة. تقل هذه الاحتمالية مع زيادة قوة الحوسبة.
قد نرغب في إنهاء التجارب تلقائيًا بعد فترة معينة، خاصة التجارب التي لا يُتوقع أن تنتهي أبدًا. يعد تعيين هذه الفترة ممكنًا عبر معلمة الحد الزمني التي يتم تعيينها على الحد الأقصى للمدة المسموح بها للتجربة. يتم توفير هذه المدة بتنسيق ISO 8601. لتحديد وقت تنفيذ تجربة بـ 60 دقيقة، سنقوم بتشغيل:
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeLimit "PT60M"
من الممكن تشغيل تجارب متعددة في وقت واحد بشرط أن تكون الخوادم مهيأة للاستماع إلى منافذ مختلفة. يمكننا اختيار تشغيل كل تجربة في محطة منفصلة. بدلاً من ذلك، يمكننا تشغيل التجارب في محطة واحدة باستخدام أداة 'disown':
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk 1>/dev/null 2>&1 & disown
ومع ذلك، فإن تشغيل أكثر من عدد قليل (>2) يضع عبئًا إضافيًا على الجهاز. كما أنه يزيد من فرصة فشل التعلم بسبب تعارض المنافذ العرضي. في معظم التكوينات، يتم تكوين الخوادم للاستماع إلى بعض المنافذ المبرمجة عبر localhost، وتستخدم التكوينات المقدمة في 'args' منافذ مبرمجة متميزة. بالنسبة لتكوينات JSSE و Scandium، يختلف الإعداد. في كل اختبار، يقوم الـ SUT بتشغيل خادم يستمع إلى منفذ يتم اختياره ديناميكيًا ويتواصل مع المنفذ عبر مآخذ TCP إلى dtls-fuzzer. هذا له ميزة إعلام dtls-fuzzer عندما يكون الخادم جاهزًا لاستقبال الحزم (بدون ذلك، سيتعين على dtls-fuzzer الانتظار بشكل أعمى لمدة زمنية عشوائية حتى يبدأ الخادم). الجانب السلبي هو أن المنفذ المخصص قد يكون هو نفسه بعض المنافذ المبرمجة لتجربة مختلفة، حيث تم إيقاف خيط خادم مؤخرًا ولم يبدأ خيط جديد بعد (مما يعني أنه يمكن استخدام المنفذ المبرمج في التخصيص الديناميكي). لتجنب هذا النوع من التعارض، ننصح بتشغيل تجارب Scandium و JSSE بشكل منفصل عن جميع التجارب الأخرى.
نقترح التكوينات التالية التي يكون فيها البناء التلقائي موثوقًا، ويكون التعلم أسرع أو تم العثور على أخطاء مثيرة للاهتمام. تأكد من إعداد الـ SUT قبل تشغيل الأمر المقدم. ستلاحظ أننا نركز على تكوينات PSK حيثما أمكن. ذلك لأن PSK مع كلمات مرور صغيرة يتطلب وقت معالجة أقل بكثير من أي آلية تشفير أخرى.### OpenSSL 1.1.1b يمكن تجربة أي إعداد لـ openssl-1.1.1b (على سبيل المثال 'args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl'). تنتهي التجارب بسرعة (أقل من يوم)، مع ممارسة جميع خوارزميات تبادل المفاتيح. الأمر لتكوين شهادة العميل المطلوبة باستخدام جميع خوارزميات تبادل المفاتيح (PSK, RSA, ECDH, DH):
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl -queries 5000
ملاحظة، عند تعلم OpenSSL من الضروري توجيه متغير LD_LIBRARY_PATH إلى دليل التثبيت.
يمكن استخدام أي إعداد لـ mbedtls-2.16.1 لنفس أسباب OpenSSL. تستغرق التجارب وقتًا أطول لإكمالها لأن SUT أبطأ. الأمر لتكوين تعطيل مصادقة شهادة العميل باستخدام جميع خوارزميات تبادل المفاتيح:
> java -jar target/dtls-fuzzer.jar @args/mbedtls-2.16.1/learn_mbedtls_all_cert_none_rwalk_incl -queries 5000
تظهر نسخة منقحة من النموذج الذي تم الحصول عليه لهذا التكوين في الملحق. يمكننا استخدام حد اختبار منخفض قدره 2000 نظرًا لأن الأبجدية المدخلة صغيرة، مما يجعل الاختبار أسهل.
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk -queries 2000
بالنسبة لـ WolfSSL نقدم تكوين PSK حيث يجب أن ينتهي التعلم بسرعة نسبية.
> java -jar target/dtls-fuzzer.jar @args/wolfssl-4.0.0/learn_wolfssl-4.0.0_psk_rwalk -queries 2000
أنتج إصدار GnuTLS الأحدث الذي قمنا بتحليله نماذج جميلة ومدمجة. للأسف، أدى تمكين مصادقة العميل إلى زيادة حادة في عدد الاختبارات المطلوبة. نقترح تكوينًا يعطلها لتقصير وقت التعلم:
> java -jar target/dtls-fuzzer.jar @args/gnutls-3.6.7/learn_gnutls-3.6.7_all_cert_none_rwalk_incl -queries 2000
تظهر نسخة منقحة من النموذج الذي تم الحصول عليه لهذا التكوين في الورقة البحثية. يكشف النموذج عن أخطاء مهمة، لكن للأسف، التجربة طويلة. لا ينبغي تشغيل التجربة بالتوازي مع تجارب لا تتضمن Scandium أو JSSE. الأمر:
> java -jar target/dtls-fuzzer.jar @args/scandium-2.0.0/learn_scandium-2.0.0_psk_rwalk -queries 2000
تظهر نسخة منقحة من النموذج الذي تم الحصول عليه لهذا التكوين في الورقة البحثية. يكشف النموذج عن أخطاء مهمة. لا ينبغي تشغيل التجربة بالتوازي مع تجارب لا تتضمن Scandium أو JSSE. لاحظ أن التعلم لـ JSSE لا ينتهي / لا يتقارب، مما يبني فرضيات مع المزيد والمزيد من الحالات. لذا قمنا بتكوين تجارب JSSE لتنتهي تلقائيًا بعد يوم واحد (يومين في الورقة البحثية). الأمر لتبادل مفاتيح RSA:
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl
بدلاً من التعلم الشاق، قد نرغب ببساطة في اختبار ما إذا كان يمكن إتمام المصافحة في هذا الإعداد دون إرسال أي رسائل شهادة. يمكن القيام بذلك عن طريق تشغيل:
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl -test examples/tests/rsa
بمجرد الانتهاء من التعلم، الأشياء التي يجب تحليلها في دليل الإخراج هي:
يمكن تصور النموذج المُتعلم بصيغة .dot باستخدام مكتبة graphviz، عن طريق التحويل إلى .pdf:
> dot -Tpdf learnedModel.dot > learnedModel.pdf
لسوء الحظ، مع نمو النماذج في الحجم، تصبح ملفات .pdf التي تم إنشاؤها باستخدام هذه الطريقة صعبة القراءة بشكل متزايد. لذلك قمنا بتطوير / استخدام / استيراد نصوص برمجية للتقليم يتم الوصول إليها بواسطة 'trim_model.sh'. يوفر البرنامج النصي معلومات الاستخدام عن طريق تشغيل:
> bash trim_model.sh
ننصح باستخدام البرنامج النصي في أبسط صوره، وهو:
> bash trim_model.sh learnedModel.dot
يقوم البرنامج النصي بما يلي:
تتطلب (5) تثبيت مكتبة mypydot Python 3 المخصصة الموجودة في 'experiments\scripts'. تستخدم جميع الخطوات الأخرى 'sed' العادي بالإضافة إلى مكتبة dot-trimmer Java. يتم تضمين ملف .jar لهذه المكتبة في 'experiments\scripts'.
قم بتشغيل:
> java -jar target/dtls-fuzzer.jar -help
قد يكون عدد الخيارات مربكًا. لتعلم تطبيق خادم DTLS، يحتاج المرء فقط إلى تحديد عدد قليل من الخيارات، وهي "-connect ip_address:port" وهو العنوان الذي يستمع إليه خادم DTLS قيد التشغيل. يتم تعيين جميع الخيارات الأخرى إلى قيم افتراضية، بما في ذلك الأبجدية.
لتشغيل تعلم لخادم محلي موجود مثلاً يستمع على المنفذ 20000، قم بتشغيل:
> java -jar target/dtls-fuzzer.jar -connect localhost:20000
من المحتمل أن تكون هناك مشكلات مع هذا النوع من التعلم. يتطلب التعلم القدرة على إعادة تعيين الخادم بعد كل اختبار. بعض الخوادم تحمل بعض الحالة من اختبار إلى آخر. قد يؤدي هذا إلى عدم الحتمية أثناء التعلم، وبالتالي فإن النهج الأفضل هو تشغيل مؤشر ترابط خادم جديد في كل اختبار باستخدام أمر محدد. يتم قتل مؤشر ترابط الخادم بمجرد تشغيل الاختبار، مما يضمن إعادة تعيين صحيحة. مثال لـ OpenSSL:
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -cmd "openssl s_server -accept 20000 -dtls1_2"
مع وجود العديد من المعلمات، يمكن أن تصبح الأوامر طويلة جدًا. يستخدم dtls-fuzzer JCommander لتحليل الوسائط، والذي يمكنه أيضًا قراءة المعلمات من ملف. انتقل إلى 'experiments/args' للحصول على أمثلة على الوسائط. لتزويد dtls-fuzzer بملف وسائط، قم بتوفيره كمعامل مسبوق بـ "@". يمكنك أيضًا إضافة وسائط صريحة أخرى إلى الأوامر (والتي ستستبدل تلك الموجودة في ملف الوسائط)
> java -jar target/dtls-fuzzer.jar @arg_file ...وسائط مستبدلة...
لتشغيل دفعة من عمليات التعلم، يمكن استخدام البرنامج النصي 'launcher.py' في 'experiments/scripts'. بشرط وجود دليل يحتوي على ملفات وسائط، ستقوم الأداة بتشغيل عملية تعلم لكل ملف وسائط.
> python3 experiments/scripts/launcher.py --jar target/dtls-fuzzer.jar --args args_folder
قبل تشغيل تجارب التعلم، من المفيد التحقق من صحة ضبط الوسائط، خاصة معلمات التوقيت. لتحقيق هذه الغاية، يمكن لـ dtls-fuzzerr تنفيذ مجموعة اختبار مخصصة (مجموعة من الاختبارات) على SUT، وتقديم ملخص للمخرجات. يمكن أيضًا استخدام هذه الوظيفة عند تشخيص تجارب التعلم الفاشلة، أي معرفة الخطأ الذي حدث.
لتشغيل مجموعة الاختبار على خادم باستخدام الأبجدية الافتراضية، يمكنك تشغيل:
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file
للحصول على أمثلة على ملفات الاختبار، انتقل إلى 'examples/tests'. يتكون ملف الاختبار من قائمة مدخلات مفصولة بأسطر جديدة. يتم فصل الاختبارات بأسطر جديدة فارغة. نهاية كل اختبار هي إما نهاية الملف، أو سطر جديد فارغ. يتم استخدام "#" للتعليق على سطر.
إذا كان لديك نموذج / مواصفة، يمكنك أيضًا تشغيل مجموعة الاختبار ومقارنة المخرجات مع تلك الموجودة في المواصفة.
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -specification model
عدد مرات تشغيل الاختبارات قابل للتكوين بواسطة المعلمة '-times'، والتي تكون قيمتها الافتراضية 1. يساعد ضبطها على رقم مرتفع في اكتشاف عدم الحتمية في تكوينات التعلم، من خلال مقارنة مخرجات كل اختبار.
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -times 10
أخيرًا، إذا كان لديك ملف وسائط لتجربة تعلم، يمكنك استخدامها لتشغيل الاختبارات على SUT المعني عن طريق إضافة وسائط الاختبار اللازمة:
> java -jar target/dtls-fuzzer.jar @learning_arg_file -test test_file