प्रत्येक 'दुष्ट' रेगेक्स के लिए, क्या कोई गैर-बुराई विकल्प मौजूद है, या व्याकरण में शैतान है?


16

जाहिर है, रेदोस कुछ (अन्यथा उपयोगी) नियमित अभिव्यक्तियों की विशेषताओं का शोषण करता है ... अनिवार्य रूप से एनएफए द्वारा परिभाषित ग्राफ के माध्यम से संभावित रास्तों के विस्फोट का कारण बनता है।

क्या समतुल्य evil नॉन-बैड ’रेगेक्स लिखकर ऐसी समस्याओं से बचना संभव है? यदि नहीं (इस प्रकार, व्याकरण को व्यावहारिक स्थान / समय में NFA द्वारा नियंत्रित नहीं किया जा सकता है), तो पार्सिंग दृष्टिकोण क्या बेहतर होगा? क्यों?


अगर मैं सटीक तकनीकी भाषा का उपयोग करने में कामयाब रहा, तो यह एक दुर्घटना है। कृपया गैर-शैक्षणिक :-)
डेविड बुलॉक

1
मैं वास्तव में सिर्फ ReDos'd होने से बचने का एक व्यावहारिक तरीका खोजने की कोशिश कर रहा हूं , और यह सवाल सामने आया।
डेविड बुलक

अपने प्रश्न (?) को पुनःप्रकाशित करने के लिए: क्या प्रत्येक नियमित भाषा की एक नियमित अभिव्यक्ति होती है जिसकी लंबाई बहुपद द्वारा उसके न्यूनतम NFA के राज्यों की संख्या में बंधी होती है?
अचुल

1
@ A.Schulz। मुझे नहीं लगता कि यह सवाल है। ऐसा नहीं है कि रेदोस हमले कैसे काम करते हैं। ReDos हमले में, regexp को प्रोग्राम स्रोत कोड में हार्डकोड किया जाता है और डेवलपर द्वारा आपूर्ति की जाती है, जिसे विश्वसनीय माना जाता है। फिर, विरोधी को एक इनपुट स्ट्रिंग की आपूर्ति करने के लिए मिलता है, जो प्रोग्राम regexp के खिलाफ मेल खाता है। यदि विरोधी एक इनपुट स्ट्रिंग पा सकता है जो मिलानकर्ता को वास्तव में लंबे समय तक चलने का कारण बनता है, तो विरोधी जीत जाता है। इसलिए, हम प्रतिकूल आदानों के बारे में चिंतित हैं, न कि प्रतिकूल नियमित अभिव्यक्तियों के बारे में। (जारी)
DW

नतीजतन, मुझे लगता है कि प्रश्न इसके बजाय है: क्या प्रत्येक नियमित भाषा में एक नियमित अभिव्यक्ति होती है जैसे कि एक -ractracter स्ट्रिंग से मेल खाने से उस नियमित अभिव्यक्ति के लिए O ( f ( n ) ) समय लगता है, जहां f ( n ) कुछ नहीं भी है- n का तेजी से बढ़ता कार्य (कहते हैं, बहुपद या ऐसा कुछ)? [संयोग से, यह पुन: सूत्रीकरण यह स्पष्ट करता है कि उत्तर मिलान के लिए उपयोग किए जाने वाले एल्गोरिदम पर निर्भर करेगा ... जैसा कि मैंने अपने उत्तर में उल्लेख किया है।] न्यूनतम NFA के आकार के कार्य के रूप में नियमित अभिव्यक्ति का आकार नहीं है। यहाँ वास्तव में बात है। nहे((n))(n)n
डीडब्ल्यू

जवाबों:


14

यह इस बात पर निर्भर करता है कि आपको एक नियमित अभिव्यक्ति मिली है या एक regexp: regexps बुराई है, लेकिन नियमित अभिव्यक्ति सुंदरता की चीज है और यह कभी भी आप पर बुराई नहीं करेगी।

Regexp के द्वारा, मेरा मतलब है एक आधुनिक नियमित अभिव्यक्ति: यानी, बैकरेफरेंस जैसे अतिरिक्त आधुनिक सुविधाओं के साथ एक नियमित अभिव्यक्ति - जैसे, एक पर्ल-संगत नियमित अभिव्यक्ति। यह एक औपचारिक भाषाओं / ऑटोमेटा सिद्धांत की पाठ्यपुस्तक से शास्त्रीय नियमित अभिव्यक्ति की तुलना में अधिक शक्तिशाली है, क्योंकि शास्त्रीय नियमित अभिव्यक्तियाँ पीछे की ओर, लुकहैड, लुकहाइंड और इतने पर अनुमति नहीं देती हैं।

शास्त्रीय नियमित अभिव्यक्ति के लिए, यदि आपके पास मिलानकर्ता के लिए अच्छा कार्यान्वयन है, तो कोई भी नियमित अभिव्यक्ति बहुत बुरी नहीं है। विशेष रूप से, मिलान के लिए एक मानक एल्गोरिदम नियमित अभिव्यक्ति को एनएफए में बदलना है और फिर इनपुट स्ट्रिंग पर एनएफए को निष्पादित करना है। इस एल्गोरिथ्म के लिए, क्रैचर स्ट्रिंग का परीक्षण करने के लिए सबसे खराब स्थिति वाला समय ( एन ) है , जब नियमित अभिव्यक्ति तय हो जाती है। इसका मतलब है कि दौड़ने का समय बहुत तेज़ी से नहीं फैल सकता है। कोई स्ट्रिंग नहीं है जो रनिंग टाइम में एक घातीय वृद्धि का कारण बनेगी। इस प्रकार, यदि आप इस एल्गोरिथम का उपयोग करने वाले एक माचिस का उपयोग कर रहे हैं, तो कोई शास्त्रीय नियमित अभिव्यक्ति बुराई नहीं होगी।nहे(n)

यह नियमित अभिव्यक्ति मिलानकर्ता के कार्यान्वयन पर निर्भर करता है। यदि आपके पास मिलानकर्ता का एक भोला या खराब कार्यान्वयन है, तो मिलान घातीय समय ले सकता है; निश्चित रूप से उस संपत्ति के साथ एल्गोरिदम हैं। लेकिन इसका सबसे अच्छा जवाब शायद नियमित अभिव्यक्ति को बदलना नहीं है; बेहतर मैचर चुनना शायद बेहतर होगा, यदि आप सेवा के हमलों से इनकार करते हैं।

इसकी तुलना में, कुछ आधुनिक regexps अपरिहार्य रूप से बुराई हैं। यदि आपके पास एक आधुनिक रेगेक्सपी है, तो मिलान के लिए घातीय समय की आवश्यकता हो सकती है। विशेष रूप से, बैकरेफरेंस वाले रेगेक्स एनपी-हार्ड भाषाओं को पहचान सकते हैं। नतीजतन, प्रशंसनीय मान्यताओं के तहत, बुराई रेगेक्स का एक वर्ग मौजूद है जहां एक मैच के लिए परीक्षण घातीय समय लेता है। इस प्रकार, कुछ आधुनिक regexps अनपेक्षित रूप से बुराई हैं: एक समान regexp खोजने के लिए कोई संभव तरीका नहीं है जो मिलान समय में घातीय ब्लूपअप का कारण नहीं होगा।

(इस तरह के समतुल्य अस्तित्व में हो सकते हैं और सिद्धांत में भी खोजने योग्य हो सकते हैं, लेकिन प्रशंसनीय मान्यताओं के तहत, समतुल्य regexp खोजने में घातीय समय लगेगा, जो व्यवहार में संभव नहीं है। यदि आपके पास बहुपद समय में समतुल्य bgexp को खोजने के लिए एक व्यवस्थित प्रक्रिया थी। , तो आप बहुपद समय में एनपी-कठिन समस्या को हल कर सकते हैं, यह साबित करते हुए कि पी = एनपी। यह वहाँ के लिए एक अच्छा regexp मौजूद करने के लिए बहुत अच्छा नहीं है अगर कोई रास्ता नहीं है वास्तव में इसे अपने जीवनकाल के भीतर मिल जाए।)


पृष्ठभूमि और स्रोत:


क्या रेगेक्स को कई छोटे रेगेक्स में विभाजित करके और संयोजन में उनका उपयोग करके गैर-बुराई विकल्प ढूंढना आसान नहीं है?
inf3rno

1

यह उत्तर इस असामान्य क्रॉस-कटिंग स्थिति के बारे में अधिक विस्तृत दृष्टिकोण लेगा, जहां जटिलता सिद्धांत साइबर स्पेस पर लागू होता है और उदाहरण में कुछ महत्वपूर्ण अति सूक्ष्मता / सूक्ष्मता शामिल है जो इस क्षेत्र में हो सकती है। यह अनिवार्य रूप से एक "इंजेक्शन हमले" के समान है जहां कुछ अप्रत्याशित आदान-प्रदान पैथोलॉजिकल व्यवहार का कारण बनते हैं या तो एक सिस्टम को क्रैश करते हैं या इसे असामान्य रूप से लंबे समय तक ले जाते हैं।

विकिपीडिया में डेनियल ऑफ़ सर्विस हमलों की 15 श्रेणियां हैं और यह हमला उस सूची में "एप्लिकेशन स्तर बाढ़" में आता है। एक और कुछ इसी तरह का उदाहरण एक हमला है जो एप्लिकेशन लॉग को भरता है।

इंजेक्शन हमलों के लिए एक फिक्स "इनपुट को साफ करना" है। यदि यह संभावित रूप से दुर्भावनापूर्ण उपयोगकर्ता द्वारा आपूर्ति की गई मनमाना regexps को संकलित करने के लिए आवश्यक है, तो एप्लिकेशन डिजाइनर पुनर्मूल्यांकन कर सकता है। बस regexp या कुछ अन्य समान सीमा में नेस्टेड अभिव्यक्ति अलग करना शायद इस हमले से बचने के लिए पर्याप्त होगा। जबकि वे बहुत सारे आधुनिक सॉफ़्टवेयर के लिए आंतरिक हैं, नियमित अभिव्यक्तियों का मूल्यांकन किए बिना बड़ी मात्रा में कार्यक्षमता प्रदान की जा सकती है। संदर्भ मायने रखता है, कुछ अनुप्रयोगों को ऐसी सुरक्षा की आवश्यकता नहीं होगी।

गलती सहिष्णुता / लचीलापन में सुधार करने के लिए एक और दृष्टिकोण जो यहां लागू है , सॉफ्टवेयर स्टैक / पदानुक्रम के विभिन्न स्तरों पर निर्दिष्ट टाइमआउट हैं। यह विचार एक "औसत" नियमित अभिव्यक्ति मूल्यांकन पर एक समय / सीपीयू या अनुदेश सीमा को निर्दिष्ट करने और इसके समाप्त होने पर जल्दी समाप्त करने के लिए होगा। उन्हें कस्टम समाधानों के साथ लागू किया जा सकता है लेकिन बहुत अधिक सॉफ्टवेयर या प्रोग्रामिंग भाषाओं में इस उद्देश्य के लिए अंतर्निहित समय-सीमा या रूपरेखा नहीं है।

यहाँ गलती सहिष्णुता में सुधार के लिए टाइमआउट के उपयोग का एक अच्छा उदाहरण है और ऐसे मुद्दों को कम करने के लिए एक उच्च-स्तरीय डिज़ाइन / वास्तुकला / पीओवी दिखाता है: एक उच्च मात्रा में दोष सहिष्णुता, वितरित प्रणाली / नेटफ्लिक्स। यह विशेष रूप से नियमित अभिव्यक्तियों से जुड़ा हुआ कुछ भी नहीं है, लेकिन यहाँ बिंदु है: लगभग किसी भी / सभी अनुप्रयोग स्तर तर्क इस ढांचे या इसी तरह के कुछ में फिट हो सकते हैं।

यह लेख बताता है कि विशेष रूप से बैकट्रैकिंग धीमी regexp मिलान कैसे कर सकती है। Regexps में कई अलग-अलग विशेषताएं हैं और एक मूल्यांकन करने का प्रयास कर सकता है कि कौन से मामले सबसे खराब व्यवहार करते हैं।

यहाँ स्थिर विश्लेषण समाधान (नों) के साथ इस विशेष विषय का एक अच्छा वैज्ञानिक सर्वेक्षण प्रस्तावित है:

  • नियमित अभिव्यक्ति अभिव्यक्ति के लिए स्थैतिक विश्लेषण सबस्ट्रक्चरल लॉजिक्स / रथनायके, थिएलेके के माध्यम से

    बैकट्रैकिंग का उपयोग करने वाले नियमित अभिव्यक्ति में घातीय रनटाइम हो सकता है, जिससे सिस्टम सुरक्षा साहित्य में REDoS के रूप में जाना जाने वाला एक एल्गोरिथम जटिलता हमला हो सकता है। इस पत्र में, हम एक हाल ही में प्रकाशित स्थिर विश्लेषण पर निर्माण करते हैं जो यह पता लगाता है कि क्या किसी दिए गए नियमित अभिव्यक्ति में कुछ इनपुट के लिए घातीय रनटाइम हो सकता है। हम व्यवस्थित रूप से संक्रमण संबंधों की शक्तियों और उत्पादों का निर्माण करके और अधिक सटीक विश्लेषण का निर्माण करते हैं और इस तरह REDOS समस्या को पुन: सक्रियता तक कम करते हैं। विश्लेषण की शुद्धता को खोज पेड़ों के एक सबस्ट्रक्चरल कैलकुलस का उपयोग करके सिद्ध किया जाता है, जहां घातीय प्रकोप के कारण वृक्ष की शाखा को गैर-रैखिकता के रूप में दर्शाया जाता है।


यह उत्तर ReDos के कुछ पहलुओं के बारे में उलझन में लगता है। 1. ReDoS का इंजेक्शन के हमले से कोई लेना-देना नहीं है। इंजेक्शन के हमले (जैसे, XSS, SQL इंजेक्शन, कमांड इंजेक्शन, आदि) पूरी तरह से अलग हैं। 2. ReDos एक विरोधी द्वारा प्रस्तुत दुर्भावनापूर्ण rexxps के बारे में नहीं है। आमतौर पर regexp प्रोग्राम (डेवलपर द्वारा आपूर्ति) में हार्डकोड किया जाता है, और इनपुट स्ट्रिंग एक उपयोगकर्ता द्वारा आपूर्ति की जाती है। इनपुट सत्यापन द्वारा समस्या का उचित समाधान नहीं किया जा सकता है, क्योंकि आमतौर पर कोई स्पष्ट इनपुट सत्यापन नीति नहीं होती है जो समस्या को खत्म करने के लिए पर्याप्त होगी।
DW

रेदोस रेफ के आधार पर तकनीकी / बाल कटाने के लिए अपने अंकों की राशि सोचें और पेड़ों के लिए जंगल को याद करता है। इसके "क्राफ्टेड इंजेक्शन हमलों" के समान है। उत्तर बताता है कि कोड में regexps का उपयोग करने के लिए विकल्प हैं। स्थैतिक विश्लेषण "बुराई regexps" पा सकते हैं। उत्तर के सभी बिंदु मान्य हैं। एक वाक्य जैसे "आमतौर पर regexp प्रोग्राम में (डेवलपर द्वारा आपूर्ति की गई) में हार्डकोड किया जाता है, और इनपुट स्ट्रिंग को एक उपयोगकर्ता द्वारा प्रदान किया जाता है" बिल्कुल रेडोस राइटअप से मेल नहीं खाता है जो स्थानों में अधिक अस्पष्ट है, और एक दुर्भावनापूर्ण हमलावर आदि को संदर्भित करता है। ।
vzn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.