क्या दुर्भावनापूर्ण कोड को नियमित अभिव्यक्ति में डालने का कोई तरीका है?


138

मैं अपने सार्वजनिक वेब पेज पर नियमित अभिव्यक्ति खोज क्षमता जोड़ना चाहता हूं। HTML के अलावा आउटपुट को एन्कोडिंग करने के लिए, क्या मुझे दुर्भावनापूर्ण उपयोगकर्ता इनपुट से बचाव के लिए कुछ भी करने की आवश्यकता है?

गूगल खोजों बातचीत problem-- सुलझाने दुर्भावनापूर्ण इनपुट पता लगाने के लिए नियमित अभिव्यक्ति का उपयोग कर लोगों द्वारा लादा जाता है -। जो मैं में दिलचस्पी नहीं कर रहा हूँ मेरी परिदृश्य में, उपयोगकर्ता इनपुट है एक रेगुलर एक्सप्रेशन।

मैं .NET (C #) में रेगेक्स लाइब्रेरी का उपयोग करूंगा ।


4
यह इस बात पर निर्भर कर सकता है कि आप किस भाषा और / या रेक्सक्स लाइब्रेरी का उपयोग करते हैं।
aschepler

कुछ और पठन सामग्री: OWASP पर ReDoS
ReDoS

जवाबों:


216

सेवा की चिंता के इनकार ‐

Regexes के साथ सबसे आम चिंता पैथोलॉजिकल पैटर्न के माध्यम से path सेवा हमले का एक खंडन है जो घातीय है - या सुपर ential घातीय! - और इसलिए हमेशा के लिए हल निकालने के लिए दिखाई देते हैं। ये केवल विशेष इनपुट डेटा पर दिखाई दे सकते हैं, लेकिन आम तौर पर कोई एक बना सकता है जिसमें यह कोई फर्क नहीं पड़ता।

इनमें से कौन सा कुछ इस बात पर निर्भर करेगा कि आपके द्वारा उपयोग किए जा रहे रेगेक्स कंपाइलर कितने स्मार्ट होते हैं, क्योंकि इनमें से कुछ कंपाइलर समय के दौरान पता लगाए जा सकते हैं। रेगेक्स कंपाइलर्स जो पुनरावृत्ति को लागू करते हैं, आमतौर पर पुनरावृत्ति में एक अंतर्निहित comp होता है ‐ नॉन। प्रगति की जाँच के लिए गहराई काउंटर।

नियमित अभिव्यक्ति मिलान पर रस कॉक्स का उत्कृष्ट 2007 का पेपर सरल और तेज़ हो सकता है (लेकिन जावा, पर्ल, पीएचपी, पायथन, रूबी, ... में धीमा है) उन तरीकों के बारे में बात करता है जो अधिकांश आधुनिक एनएफए, जो सभी हेनरी स्पेंसर के कोड को प्राप्त करते हैं। , गंभीर प्रदर्शन में गिरावट, लेकिन जहां एक थॉम्पसन FA शैली एनएफए ऐसी कोई समस्या नहीं है।

यदि आप केवल उन पैटर्नों को स्वीकार करते हैं जिन्हें डीएफए द्वारा हल किया जा सकता है, तो आप उन्हें इस तरह से संकलित कर सकते हैं, और वे तेजी से चलेंगे, संभवतः बहुत तेजी से। हालाँकि, ऐसा करने में समय लगता है । कॉक्स पेपर में इस दृष्टिकोण और इसके परिचर मुद्दों का उल्लेख है। यह सब एक क्लासिक समय अंतरिक्ष व्यापार के लिए नीचे आता है a बंद।

डीएफए के साथ, आप इसे बनाने में अधिक समय बिताते हैं (और अधिक राज्यों को आवंटित करते हैं), जबकि एनएफए के साथ आप इसे निष्पादित करने में अधिक समय व्यतीत करते हैं, क्योंकि यह एक ही समय में कई राज्य हो सकते हैं, और पीछे चलकर आपका दोपहर का भोजन खा सकते हैं - और आपका सीपीयू।

सेवा समाधान के इनकार

संभवतः इन पैटर्नों को संबोधित करने का सबसे उचित तरीका है कि गर्मी की दौड़ के अंत में ब्रह्मांड की मृत्यु के साथ way मौत उन्हें एक टाइमर के साथ लपेटना है जो प्रभावी रूप से उनके निष्पादन के लिए अधिकतम समय की अनुमति देता है। आमतौर पर यह बहुत अधिक होगा, जो कि अधिकांश HTTP सर्वर प्रदान करने वाले डिफ़ॉल्ट टाइमआउट से बहुत कम है।

इन्हें लागू करने के विभिन्न तरीके हैं, जिनमें alarm(N)सी स्तर पर एक सरल , कुछ प्रकार के try {}कैच अलार्म all प्रकार के अपवादों को शामिल किया गया है, एक नए थ्रेड को अलग करने के लिए सभी तरीके जो विशेष रूप से सही समय में निर्मित एक समय बाधा के साथ बनाए गए हैं।

कोड कॉलआउट

Regex भाषाओं में, जो कोड कॉलआउट को स्वीकार करते हैं, आपके द्वारा संकलित किए जा रहे स्ट्रिंग से इन्हें अनुमति देने या अस्वीकार करने के लिए कुछ तंत्र प्रदान किया जाना चाहिए। यहां तक ​​कि अगर कोड कॉलआउट केवल उस भाषा में कोड करने के लिए हैं जिसे आप उपयोग कर रहे हैं, तो आपको उन्हें प्रतिबंधित करना चाहिए; उन्हें बाहरी कोड को कॉल करने में सक्षम होने की आवश्यकता नहीं है, हालांकि यदि वे कर सकते हैं, तो आपको बहुत बड़ी समस्याएं मिल सकती हैं।

उदाहरण के लिए, Perl में स्ट्रिंग इंटरपोलेशन से बनाई गई रेगेक्स में कोड कॉलआउट नहीं हो सकते हैं (जैसा कि ये होंगे, क्योंकि वे रन) समय के दौरान संकलित किए जाते हैं) जब तक कि विशेष लेक्सिकली use re "eval";current चालू दायरे में सक्रिय रूप से प्रॉप्मा नहीं किया जाता है।

rm -rf *उदाहरण के लिए, सिस्टम प्रोग्राम चलाने के लिए कोई भी एक कोड कॉलआउट में चुपके नहीं कर सकता है । क्योंकि कोड कॉलआउट इतनी सुरक्षा so संवेदनशील हैं, पर्ल उन्हें सभी प्रक्षेपित स्ट्रिंग्स पर डिफ़ॉल्ट रूप से अक्षम करता है, और आपको उन्हें सक्षम करने के लिए अपने रास्ते से बाहर जाना होगा।

उपयोगकर्ता ‐ परिभाषित \ P {roperties}

जैसे - एक और सुरक्षा के प्रति संवेदनशील यूनिकोड शैली गुण से संबंधित समस्या बनी हुई है \pM, \p{Pd}, \p{Pattern_Syntax}, या \p{Script=Greek}- कि हो सकता है कुछ regex compilers कि समर्थन कि अंकन में मौजूद हैं।

मुद्दा यह है कि इनमें से कुछ में, संभावित गुणों का सेट उपयोगकर्ता ens एक्स्टेंसिबल है। इसका मतलब है कि आपके पास कस्टम गुण हो सकते हैं जो कि किसी विशेष नामस्थान, जैसे \p{GoodChars}या में नामित कार्यों के लिए वास्तविक कोड कॉलआउट हैं \p{Class::Good_Characters}। आपकी भाषा कैसे संभालती है, जो देखने लायक हो सकती है।

सैंडबॉक्सिंग

पर्ल में, Safeमॉड्यूल के माध्यम से सैंडबॉक्स वाला कम्पार्टमेंट नाम स्थान दृश्यता पर नियंत्रण देगा। अन्य भाषाएं समान सैंडबॉक्सिंग प्रौद्योगिकियों की पेशकश करती हैं। यदि इस तरह के उपकरण उपलब्ध हैं, तो आप उन पर गौर करना चाहते हैं, क्योंकि वे विशेष रूप से अविशिष्ट कोड के सीमित निष्पादन के लिए डिज़ाइन किए गए हैं।


4
एनएफए-> डीएफए रूपांतरण घातीय राज्य विस्फोट का उत्पादन कर सकता है, एक समय DoS को अंतरिक्ष DoS में बदल सकता है, साथ ही राज्यों की घातीय संख्या उत्पन्न करने का समय लागत भी।
बैरी केली

लेकिन शायद उसे संपूर्ण नियमित अभिव्यक्ति क्षमताओं की आवश्यकता नहीं होगी, आप क्या सोचते हैं कि Google ने नियमित अभिव्यक्ति की शक्ति को सीमित करने के बारे में क्या किया है: google.com/intl/en/help/faq_codesearch.html#regexp
systemsfault

1
@ बैरी काफी सही। मैं रस कॉक्स की रणनीति के बारे में सोच रहा था जो एनएफए के आकस्मिक रूप से संकलित भागों के अपने एक पेपर में एक समान DFA में वर्णित है, लेकिन अगर यह बहुत बड़ा हो गया तो इसे फेंक देना चाहिए। लेकिन डीएफए में कोई चांदी की गोली नहीं है, भले ही थॉम्पसन ने इसे एनएफए के बराबर साबित किया हो, क्योंकि आपको कुछ बिंदु या किसी अन्य पर पिपर का भुगतान करना होगा। समय ने अधिक स्थान के लिए ऑपरेटिंग सिस्टम को भीख देने में खर्च किया, और परिचर पृष्ठ-तालिका सेट-अप लागत, कभी-कभी संतुलन के पैमाने को दूसरे तरीके से आगे बढ़ा सकते हैं और समय-समय पर अंतरिक्ष में रूपांतरण को कम आकर्षक बना सकते हैं।
tchrist

20

Tchrist के उत्कृष्ट उत्तर में जोड़ना: वही Russ कॉक्स जिसने "रेगुलर एक्सप्रेशन" पेज लिखा था, ने भी कोड जारी किया है! re2 एक C ++ लाइब्रेरी है जो O (length_of_regex) रनटाइम और कॉन्फ़िगर करने योग्य मेमोरी-यूज़ लिमिट की गारंटी देता है। यह Google के भीतर उपयोग किया जाता है ताकि आप एक regex को Google कोड खोज में टाइप कर सकें - जिसका अर्थ है कि यह परीक्षण किया गया है।


2
वास्तव में ऐसा है। आप एक मॉड्यूल के साथ पर्ल के रेगेक्स इंजन में re2 स्वैप कर सकते हैं, और यदि संभव हो तो यह re2 का उपयोग करेगा और यदि नहीं तो पर्ल। काफी अच्छा काम करता है।
tchrist


6

आप इस पत्र को पढ़ना चाहेंगे:

असुरक्षित संदर्भ स्विचिंग: बचे रहने के लिए नियमित अभिव्यक्तियों का टीकाकरण करना यह है कि नियमित अभिव्यक्ति इंजन (जैसे पीसीआरई) के साथ क्या गलत हो सकता है, लेकिन यह आपको समझने में मदद कर सकता है कि आप क्या कर रहे हैं।


1
यहाँ GNU libc regcomp (3) कोड पर एक सुरक्षा सलाहकार है: securityreason.com/achievement_securityalert/93 समय पर कैसे! कम से कम लाइनक्स के तहत, भेद्यता प्रदर्शित करना आसान है: grep -E "। * {10,} {10,} {10,} {10,} {10,}"
ब्रूस एडिगर

5

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


1

अपने RegEx के सुरक्षा मुद्दों (कम से कम विंडोज के लिए) का परीक्षण करने का एक अच्छा तरीका हाल ही में Microsoft द्वारा जारी किया गया SDL RegEx फ़ज़िंग टूल है । यह पथिक रूप से खराब RegEx निर्माण से बचने में मदद कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.