Directed Symbolic Execution for Path Feasibility Analysis]{Directed Symbolic Execution for Path Feasibility Analysis in Software Security Testing
यह शोध पत्र एक निर्देशित प्रतीकात्मक निष्पादन (directed symbolic execution) पद्धति प्रस्तुत करता है जो स्वचालित प्रतीकीकरण (automated symbolization) और लूप पुनरावृत्ति सीमाओं (loop iteration limits) के माध्यम से अंतर-प्रक्रियात्मक पथ व्यवहार्यता (interprocedural path feasibility) को कुशलतापूर्वक सत्यापित करके स्थैतिक सुरक्षा विश्लेषण को उन्नत करता है, जिससे वास्तविक दुनिया के बेंचमार्क पर रिकॉल (recall) को बनाए रखते हुए परिशुद्धता (precision) में महत्वपूर्ण सुधार होता है।
मूल पेपर CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
सॉफ्टवेयर सुरक्षा छिपे हुए दोषों के विरुद्ध एक निरंतर युद्ध है, ठीक वैसे ही जैसे एक शहर का योजनाकार यह सुनिश्चित करने की कोशिश करता है कि एक विशाल महानगर में हर पुल और सुरंग भूकंप का सामना कर सके। ऐसा करने के लिए, इंजीनियर स्वचालित उपकरणों का उपयोग करते हैं जो कोड को वास्तव में चलाए बिना उसका स्कैन करते हैं, और इस बात का मानचित्र तैयार करते हैं कि एक प्रोग्राम द्वारा लिए जा सकते वाले सभी संभावित मार्ग क्या हैं। ये मानचित्र, जिन्हें कंट्रोल फ्लो ग्राफ (control flow graphs) कहा जाता है, अविश्वसनीय रूप से विस्तृत होते हैं, जो यह दिखाते हैं कि एक प्रोग्राम कैसे एक निर्देश से दूसरे निर्देश पर कूदता है। हालाँकि, ये मानचित्र अक्सर बहुत अधिक विस्तृत होते हैं; वे उन रास्तों को उजागर करते हैं जो कागज पर तो खतरनाक दिखते हैं लेकिन वास्तविक दुनिया में यात्रा करना भौतिक रूप से असंभव है। यह झूठे अलार्म की बाढ़ पैदा करता है, जिससे मानव विशेषज्ञ मशीन के भीतर दिखने वाले इन 'भूतों' की जांच करने में अपना समय बर्बाद करने के लिए मजबूर होते हैं। चुनौती, फिर, एक ऐसी प्रणाली बनाने की है जो केवल सैद्धांतिक रूप से संभव पथ और वास्तव में निष्पादित (executable) होने वाले पथ के बीच तेजी से अंतर कर सके, बिना संभावनाओं के भारी ढेर में खो जाए।
रूसी-आर्मेनियाई विश्वविद्यालय के शोधकर्ताओं की एक टीम ने इस समस्या को हल करने के लिए एक नया तरीका विकसित किया है, जिसमें 'डायरेक्टेड सिम्बोलिक एक्जीक्यूशन' (directed symbolic execution) नामक तकनीक का उपयोग किया गया है। कल्पना कीजिए कि एक यात्री यह सत्यापित करने की कोशिश कर रहा है कि एक जटिल शहर के माध्यम से एक विशिष्ट मार्ग मौजूद है या नहीं। एक मानक दृष्टिकोण यह होगा कि खोजकर्ताओं को शहर की हर गली में चलकर यह देखने के लिए भेजा जाए कि वे कहाँ ले जाती हैं, जो एक ऐसा कार्य होगा जिसमें अनंत समय लगेगा और टीम को थका देगा। इसके बजाय, शोधकर्ताओं की विधि एक निर्देशित टूर (guided tour) की तरह कार्य करती है। यह एक सुरक्षा स्कैनर द्वारा रिपोर्ट किए गए एक विशिष्ट मार्ग को लेती है और एक आभासी खोजकर्ता को केवल उसी पथ का अनुसरण करने के लिए निर्देशित करती है, उन सभी गलियों को अनदेखा करती है जो गंतव्य तक नहीं ले जातीं। यह "निर्देशित" दृष्टिकोण सिस्टम को यह जांचने की अनुमति देता है कि रिपोर्ट किया गया खतरा वास्तविक है या नहीं, बिना अप्रासंगिक भटकाव पर ऊर्जा बर्बाद किए।
इस कार्य का मूल यह है कि सिस्टम अज्ञात (unknown) को कैसे संभालता है। वास्तविक सॉफ्टवेयर में, प्रोग्राम अक्सर ऐसे डेटा के साथ काम करते हैं जो अभी तक सेट नहीं किया गया है, या वे बाहरी लाइब्रेरी से फंक्शन कॉल करते हैं जहाँ आंतरिक कोड छिपा होता है। एक पारंपरिक खोजकर्ता इन रिक्त स्थानों के सामने आने पर अटक सकता है या हार मान सकता है। शोधकर्ताओं का सिस्टम, हालांकि, इन अज्ञात तत्वों को लचीले वेरिएबल्स (variables) के रूप में मानने के लिए डिज़ाइन किया गया है। यदि कोई प्रोग्राम किसी ऐसे मेमोरी लोकेशन को पढ़ता है जिसे भरा नहीं गया है, तो सिस्टम उसे एक सिम्बोलिक वैल्यू असाइन करता है, जिससे वह उस वैल्यू द्वारा लिए जा सकने वाले हर संभावित परिणाम का पता लगा सके। यह बाहरी फंक्शन्स और जटिल पॉइंटर आर्गुमेंट्स के परिणामों के लिए भी ऐसा ही करता है, जो डायनामिक एड्रेस की तरह कार्य करते हैं और स्थिति के आधार पर अलग-अलग स्थानों की ओर संकेत कर सकते हैं। इन अंतरालों को ठोस अनुमानों के बजाय संभावनाओं के साथ स्वचालित रूप से भरकर, सिस्टम कोड के माध्यम से पथ का पता लगा सकता है, भले ही पूरी तस्वीर दिखाई न दे रही हो।
सॉफ्टवेयर के नेविगेशन में एक अन्य बड़ा अवरोध लूप (loop) है, जो कोड का एक हिस्सा है जो खुद को दोहराता है। एक वास्तविक प्रोग्राम में, एक लूप कुछ बार या लाखों बार चल सकता है, और सिम्बोलिक विश्लेषण में, यह खोजकर्ता को एक अनंत चक्र में फंसा सकता है। शोधकर्ताओं ने एक लूप को कितनी बार फॉलो करना है, इस पर सीमा निर्धारित करके इसे संभालने के लिए एक रणनीति पेश की है। यह कोई यादृच्छिक कट-ऑफ नहीं है; सिस्टम सावधानीपूर्वक रिकॉर्ड करता है कि उन पुनरावृत्तियों (iterations) के दौरान क्या हुआ और फिर उस बिंदु पर कूद जाता है जहाँ लूप स्वाभाविक रूप से समाप्त होगा। यह विश्लेषण को दोहराव वाले अनुभाग से आगे बढ़ने की अनुमति देता है, जिससे यह सुनिश्चित होता है कि टूल उस पथ के अंत तक पहुँच सके जिसकी वह जांच कर रहा है।
अपने तरीके का परीक्षण करने के लिए, टीम ने इसे वास्तविक दुनिया के सॉफ्टवेयर और 'जूलियट सूट' (Juliet suite) नामक टेस्ट केस के एक मानक संग्रह पर लागू किया। उन्होंने पहले अपने सिस्टम की तुलना GNU Coreutils से निकाली गई पथों से की, जो लिनक्स ऑपरेटिंग सिस्टम के लिए उपकरणों का एक मौलिक सेट है। सिस्टम ने सफलतापूर्वक सत्यापित किया कि इनमें से 95.3% वास्तविक पथ वास्तव में व्यवहार्य (feasible) थे, जिससे सिद्ध हुआ कि यह जटिल, आपस में जुड़े कोड को संभालने में सक्षम है। इसके बाद उन्होंने अपने तरीके को MLH नामक एक मौजूदा सुरक्षा उपकरण के साथ एकीकृत किया। इस जुड़ाव से पहले, उपकरण ने हजारों रिपोर्टों में से 666 गलत अलार्म (false alarms) चिह्नित किए थे। नए पथ व्यवहार्यता विश्लेषण को लागू करने के बाद, वे गलत अलार्म पूरी तरह से गायब हो गए, जबकि उपकरण ने पहले से मिले हर वास्तविक भेद्यता (vulnerability) को पकड़ना जारी रखा। इसका मतलब था कि परीक्षण किए गए उपसमुच्चय (subset) पर सुरक्षा जांच की सटीकता 56.6% से बढ़कर 100% हो गई, और इससे वास्तविक बग खोजने की क्षमता में कोई कमी नहीं आई।
शोधकर्ताओं ने अपने दृष्टिकोण की तुलना KLEEF से भी की, जो समान कार्यों के लिए डिज़ाइन किया गया एक अन्य विशेष उपकरण है। जब इसे दो अन्य प्रमुख सुरक्षा स्कैनर्स, Infer और Clang Static Analyzer द्वारा उत्पन्न रिपोर्टों पर परखा गया, तो परिणाम स्पष्ट थे। KLEEF संघर्ष करता दिखा, अधिकांश वास्तविक सकारात्मक (true positive) रिपोर्टों को सत्यापित करने में विफल रहा और इसके कारण इसके प्रदर्शन स्कोर में भारी गिरावट आई। इसके विपरीत, नए तरीके ने मूल स्कैनर्स के प्रदर्शन को बनाए रखा या उसमें थोड़ा सुधार किया। इसने Infer टूल द्वारा रिपोर्ट किए गए सभी वास्तविक भेद्यताओं को सफलतापूर्वक सत्यापित किया और Clang की अधिकांश रिपोर्टों को संभाला, जो दर्शाता है कि यह औद्योगिक स्तर के कोड के साथ काम करने के लिए पर्याप्त मजबूत है।
निष्कर्ष बताते हैं कि यह निर्देशित दृष्टिकोण सॉफ्टवेयर सुरक्षा परीक्षण में शोर (noise) को साफ करने का एक व्यावहारिक तरीका प्रदान करता है। केवल महत्वपूर्ण पथों पर ध्यान केंद्रित करके और मेमोरी एवं बाहरी फंक्शन्स की जटिलताओं को स्वचालित रूप से संभालकर, यह विधि उन असंभव परिदृश्यों को फ़िल्टर करती है जो मानवीय समय बर्बाद करते हैं। हालाँकि सिस्टम चीजों को आगे बढ़ाने के लिए लूप इटरेशन को सीमित करने के रूप में एक गणनात्मक समझौता करता है, लेकिन परिणाम दिखाते हैं कि यह वास्तविक खतरों को चूकने की कीमत पर नहीं आता है। यह कार्य स्वचालित सुरक्षा उपकरणों को अधिक विश्वसनीय बनाने के लिए एक स्पष्ट मार्ग प्रदान करता है, यह सुनिश्चित करता है कि जब कोई चेतावनी दी जाए, तो वह एक वास्तविक खतरा हो जिसकी जांच की जानी चाहिए।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।