dtls-fuzzer एक Java उपकरण है जो DTLS सर्वरों का प्रोटोकॉल स्थिति फज़िंग करता है। अधिक ठोस रूप से, यह निम्नलिखित कार्यक्षमता का समर्थन करता है:
- एक वर्णमाला (alphabet) दिए जाने पर, यह स्वचालित रूप से एक स्थानीय DTLS सर्वर कार्यान्वयन का एक मॉडल उत्पन्न कर सकता है;
- एक परीक्षण (इनपुट का अनुक्रम) और एक वर्णमाला दिए जाने पर, यह DTLS सर्वर कार्यान्वयन पर परीक्षण निष्पादित कर सकता है;
- यह एक बैच लर्निंग कार्य चला सकता है, जिसमें कई लर्निंग रन शामिल हैं।
dtls-fuzzer DTLS संदेशों को उत्पन्न/पार्स करने और स्थिति बनाए रखने के लिए [TLS-Attacker][tlsattacker] का उपयोग करता है।
इसके लिए, TLS-Attacker को DTLS के लिए समर्थन के साथ विस्तारित किया गया है।
dtls-fuzzer TLS-Attacker के [संस्करण 3.0b][tlsattackerver] पर निर्भर करता है, जो DTLS संवर्धन को लागू करने वाला एक संस्करण है।
आर्टिफैक्ट सामग्री
आर्टिफैक्ट में शामिल है:
- dtls-fuzzer की फ़ाइल संरचना का विवरण, जिसमें स्रोत कोड और पेपर में प्रदर्शित के अनुरूप प्रायोगिक डेटा शामिल है;
- चुने गए SUT (सिस्टम अंडर टेस्ट)/ DTLS सर्वर कार्यान्वयन पर dtls-fuzzer का मूल्यांकन करने के लिए एक वॉकथ्रू।
dtls-fuzzer फ़ाइल संरचना
dtls-fuzzer की रूट निर्देशिका में सबसे महत्वपूर्ण फ़ोल्डर हैं:
- 'src', dtls-fuzzer का Java स्रोत कोड वाली निर्देशिका;
- 'examples', वर्णमालाओं, परीक्षणों, विनिर्देशों (अर्थात मॉडल), और तर्क फ़ाइलों के उदाहरणों वाली निर्देशिका, जिन्हें लर्निंग प्रयोग शुरू करने के लिए dtls-fuzzer को आपूर्ति की जा सकती है। इस निर्देशिका में फ़ाइलों का उपयोग लर्निंग प्रयोगों के इनपुट के रूप में किया जाता है;
- 'experiments', प्रयोगों से संबंधित डेटा वाली निर्देशिका। इस डेटा का कुछ भाग लर्निंग प्रयोगों के इनपुट के रूप में भी काम करता है। सबसे उल्लेखनीय फ़ोल्डर हैं:
- 'suts', Java SUTs के लिए बाइनरी के साथ। ये SUTs कस्टम-निर्मित DTLS सर्वर प्रोग्राम हैं जिनका स्रोत कोड सार्वजनिक रूप से उपलब्ध है;
- 'patches', वे पैच जो स्रोत कोड संकलित होने से पहले कुछ SUTs (विशेष रूप से उपयोगिताओं) पर लागू किए गए थे। इन पैच का प्राथमिक उद्देश्य लर्निंग के दौरान समय-प्रेरित व्यवहार को रोकना, SUT में कार्यक्षमता को सक्षम/अक्षम करना, और पूर्व-साझा कुंजी जैसे मापदंडों को कॉन्फ़िगर करना था;
- 'keystore', लर्निंग के दौरान उपयोग की जाने वाली कुंजी सामग्री (जैसे सार्वजनिक-निजी कुंजी जोड़े, Java कीस्टोर);
- 'results', प्रायोगिक परिणाम।
प्रायोगिक परिणाम
'experiments/results' में प्रायोगिक परिणाम शामिल हैं, जो कार्य का मुख्य आउटपुट हैं। विशेष रूप से
- 'all_ciphers' में सभी चलाए गए प्रयोगों के लिए आउटपुट फ़ोल्डर शामिल हैं;
- 'mapper' में प्रायोगिक परिणाम शामिल हैं जो किए गए कुछ मैपर निर्णयों को उचित ठहराने में मदद करते हैं (धारा 5.2 देखें)
- 'included' में अभिसारी प्रयोगों के लिए आउटपुट फ़ोल्डर शामिल हैं (अभिसारी का अर्थ है कि लर्निंग सफलतापूर्वक एक मॉडल उत्पन्न करता है)।
- ध्यान दें कि 'all_ciphers' में सभी प्रयोग सफल नहीं हुए/अंतिम मॉडल के साथ समाप्त नहीं हुए (हम ऐसे मामलों में कहते हैं कि लर्निंग अभिसारी नहीं हुई)
आउटपुट फ़ोल्डर
आउटपुट फ़ोल्डरों का नाम प्रयोग कॉन्फ़िगरेशन के आधार पर रखा गया है, अर्थात:
- परीक्षण किया गया SUT/कार्यान्वयन;
- उपयोग की गई वर्णमाला, कवर किए गए कुंजी विनिमय एल्गोरिदम के संदर्भ में, जहाँ 'all' इंगित करता है कि सभी 4 कुंजी विनिमय एल्गोरिदम का उपयोग किया गया था;
- जहाँ लागू हो, क्या क्लाइंट प्रमाणन आवश्यक था (req), वैकल्पिक (nreq) या अक्षम (none);
- परीक्षण एल्गोरिदम: रैंडम वॉक (rwalk) या इसका एक अनुकूलन (stests);
- अनुकूलन का उपयोग करने वाले प्रयोगों को पेपर में शामिल नहीं किया गया है
- वैकल्पिक रूप से, क्या पुनर्प्रेषण (retransmissions) को आउटपुट में शामिल/बाहर किया गया था (incl या excl)।
- पुनर्प्रेषण डिफ़ॉल्ट रूप से शामिल थे
एक उदाहरण के रूप में, फ़ोल्डर का नाम 'jsse-12_rsa_cert_none_rwalk_incl' DTLS के JSSE 12 कार्यान्वयन पर एक प्रयोग को इंगित करता है, जिसमें RSA हैंडशेक करने के लिए इनपुट शामिल वर्णमाला का उपयोग किया गया है, क्लाइंट प्रमाणपत्र प्रमाणीकरण अक्षम है, परीक्षण एल्गोरिदम रैंडम वॉक है और पुनर्प्रेषण शामिल हैं।
एक आउटपुट फ़ोल्डर में शामिल है:
- 'alphabet.xml', इनपुट वर्णमाला;
- 'command.args', उपयोग की गई तर्क फ़ाइल जिसमें विभिन्न प्रयोग पैरामीटर हैं, विशेष रूप से:
- queries, रैंडम वॉक परीक्षणों की संख्या की सीमा जो एक परिकल्पना को अंतिम माने जाने के लिए पास होनी चाहिए
- equivalenceAlgorithms, नियोजित मॉडल-आधारित परीक्षण एल्गोरिदम
- runWait और timeout, क्रमशः प्रारंभ और प्रतिक्रिया टाइमआउट (हम उन पर बाद में स्पर्श करते हैं)
- 'sul.config', TLS-Attacker के लिए SUT-निर्भर कॉन्फ़िगरेशन, उसी कॉन्फ़िगरेशन का उपयोग TLS-Attacker का उपयोग करके अकेले SUT पर वर्कफ़्लो ट्रेस निष्पादित करने के लिए किया जा सकता है;
- 'hyp[0-9]+.dot', मध्यवर्ती परिकल्पनाएँ;
- 'statistics.txt', प्रयोग आँकड़े जैसे परीक्षणों की कुल संख्या, लर्निंग समय;
- तालिका 4 यह डेटा प्रदर्शित करती है
- 'nondet.log', सामना किए गए गैर-नियतात्मक व्यवहार के लॉग;
- 'learnedModel.dot', लर्निंग अभिसारी होने की स्थिति में, सीखा गया मॉडल (अर्थात अंतिम परिकल्पना);
- 'error.msg', एक त्रुटि संदेश जो प्रयोग विफल होने/लर्निंग रुक जाने की स्थिति में उत्पन्न होता है, और इसलिए, एक अंतिम मॉडल में अभिसारी नहीं होता है।
- मुख्य दोषी समय-संबंधित गैर-नियतत्ववाद है (समान इनपुट विभिन्न परिणाम देते हैं)।
मूल्यांकनकर्ता जाँच सकता है (उदाहरण के लिए) कि 'included' में प्रायोगिक परिणाम तालिका 4 में प्रदर्शित के अनुरूप हैं, या तालिका 2 में परीक्षण किए गए कॉन्फ़िगरेशन भी 'all_ciphers' में दिखाई देते हैं।
ध्यान दें कि पेपर में दिखाई देने वाले मॉडल महत्वपूर्ण छंटाई/ट्रिमिंग का परिणाम थे, जबकि आउटपुट फ़ोल्डरों में दिखाई देने वाले मॉडल अपरिवर्तित हैं।
dtls-fuzzer मूल्यांकन चरण
dtls-fuzzer का मूल्यांकन करने के उद्देश्य के लिए निम्नलिखित चरणों का पालन करना आवश्यक है:
- सुनिश्चित करें कि पूर्वापेक्षाएँ पूरी हों
- dtls-fuzzer स्थापित करें
- SUT सेटअप करें
- SUT के लिए मॉडल उत्पन्न करने के लिए dtls-fuzzer का उपयोग करें
- परिणामों का विश्लेषण करें
इस मूल्यांकन अनुभाग के बाद dtls-fuzzer का उपयोग करने पर एक मार्गदर्शिका दी गई है जो इसके मुख्य उपयोग मामलों का परिचय देती है।
पूर्वापेक्षाएँ सुनिश्चित करना
dtls-fuzzer का परीक्षण Ubuntu 18.04 और Debian 9 Linux वितरणों पर किया गया है।
यह किसी भी हाल के Linux वितरण पर काम करना चाहिए।
अन्य प्लेटफार्मों के लिए समर्थन का परीक्षण नहीं किया गया है।
यह मार्गदर्शिका एक Debian-आधारित वितरण (जिसमें 'apt-get' है) का उपयोग करने की मानती है।
एक Java 8 JDK (जावा डेवलपमेंट किट) वर्चुअल मशीन (VM) की आवश्यकता है।
प्रयोग चलाने के लिए उपयोग किया गया संस्करण 1.8.0_222 है, हालाँकि बाद के Java 8 संस्करणों को भी काम करना चाहिए।
ध्यान दें कि उपकरण Java 9 या बाद के संस्करणों पर नहीं बनता है।
हम निर्भरता प्रबंधन/तैनाती के लिए maven ('mvn' उपयोगिता) पर भी निर्भर हैं।
हम पर्याप्त रूप से शक्तिशाली मशीन का उपयोग करने की सलाह देते हैं, अन्यथा संवेदनशील समय पैरामीटर जैसे प्रतिक्रिया प्रतीक्षा समय, बहुत कम हो सकते हैं, जिससे पेपर में प्राप्त से भिन्न आउटपुट प्राप्त हो सकते हैं।
इससे भी बदतर, वे लर्निंग प्रयोगों को विफल कर सकते हैं।
मूल प्रयोग एक मल्टी-कोर सर्वर पर चलाए गए थे, हालाँकि, हम उम्मीद करते हैं (हालाँकि पूरी तरह से परीक्षण नहीं किया गया है) कि i7 प्रोसेसर वाले डेस्कटॉप पर लर्निंग संभव होनी चाहिए।
समय मापदंडों को तदनुसार ट्यून करने पर कमजोर सिस्टम पर भी लर्निंग संभव है।
अंत में, .dot मॉडल को .pdf में निर्यात करके विज़ुअलाइज़ करने के लिए [graphviz लाइब्रेरी][graphviz] स्थापित करने की आवश्यकता है।
यह माना जाता है कि graphviz द्वारा प्रदान की गई 'dot' उपयोगिता सिस्टम PATH में स्थित है।
संक्षेप में, सलाह दी गई पूर्वापेक्षाएँ हैं:
- हालिया Linux वितरण, अधिमानतः Debian-आधारित
- प्रयोग पुनरुत्पादन/विश्वसनीय लर्निंग के लिए डेस्कटॉप/सर्वर मशीन
- (>=) 4 GB RAM
- Java 8 JDK
- maven
- graphviz
वातावरण स्थापित करना
Java 8 JDK
dtls-fuzzer को Java 8 JDK (जावा डेवलपमेंट किट) की आवश्यकता है।
यदि Java स्थापित नहीं है, तो हम OpenJDK कार्यान्वयन स्थापित करते हैं (Ubuntu पर 'apt-get' के माध्यम से), और इस उपधारा के शेष भाग को छोड़ सकते हैं।
> sudo apt-get install openjdk-8-jdk
यदि java का कोई संस्करण स्थापित है, तो हम चला कर जाँच सकते हैं कि यह कौन सा संस्करण है:
> java -version