
ऐसे रेगुलर एक्सप्रेशन खोजें जो ReDoS (Regular Expression Denial of Service) के प्रति संवेदनशील हैं

उन regexes को खोजें जो Regular Expression Denial of Service (ReDoS) के प्रति संवेदनशील हैं।
अधिक जानकारी Doyensec ब्लॉग पर
अधिकांश डिफ़ॉल्ट रेगुलर एक्सप्रेशन पार्सर्स की सबसे खराब स्थिति की जटिलता असीमित होती है। जब कोई मिलान करने वाला इनपुट स्ट्रिंग दिया जाता है तो regex मिलान तेज़ हो सकता है। हालांकि, कुछ गैर-मिलान करने वाले इनपुट स्ट्रिंग regex मैचर को पागल बैकट्रैकिंग लूप में डाल सकते हैं और प्रोसेस करने में बहुत समय ले सकते हैं। इससे सेवा से इनकार हो सकता है, क्योंकि CPU regex को मिलाने की कोशिश में फंस जाएगा।
यह उपकरण निम्नलिखित के लिए डिज़ाइन किया गया है:
यह regex मैचर की बैकट्रैकिंग प्रक्रिया की जटिलता को दर्शाता है, जो इनपुट स्ट्रिंग की लंबाई के सापेक्ष है।
यहाँ घन जटिलता का अर्थ है कि यदि स्ट्रिंग के संवेदनशील भाग की लंबाई दोगुनी कर दी जाए, तो निष्पादन समय लगभग 8 गुना अधिक (2^3) होना चाहिए।
तारांकित तारों के साथ घातीय ReDoS के लिए जैसे (a*)*$ एक फजी कारक का उपयोग किया जाता है और जटिलता 10 से अधिक होगी।
शोषण के लिए, आमतौर पर घन या उच्च जटिलता की आवश्यकता होती है, जब तक कि वास्तव में विशाल स्ट्रिंग्स को इनपुट के रूप में अनुमति न दी जाए।
regexploit चलाएँ और कमांड लाइन पर रेगुलर एक्सप्रेशन v\w*_\w*_\w*$ दर्ज करें।
$ regexploit
v\w*_\w*_\w*$
Pattern: v\w*_\w*_\w*$
---
Worst-case complexity: 3 ⭐⭐⭐ (cubic)
Repeated character: [5f:_]
Final character to cause backtracking: [^WORD]
Example: 'v' + '_' * 3456 + '!'
भाग \w*_\w*_\w* में तीन ओवरलैपिंग दोहराए जाने वाले समूह हैं (\w अक्षरों, अंकों और अंडरस्कोर से मेल खाता है)। जैसा कि लाइन Repeated character: [5f:_] में दिखाया गया है, _ (0x5f) का एक लंबा स्ट्रिंग इस खंड से कई अलग-अलग तरीकों से मेल खाएगा। सबसे खराब स्थिति की जटिलता 3 है क्योंकि यहाँ 3 अनंत रूप से दोहराए जाने वाले समूह हैं। ReDoS का कारण बनने के लिए एक उदाहरण दिया गया है: इसमें आवश्यक उपसर्ग v, _ का एक लंबा स्ट्रिंग और फिर बैकट्रैकिंग के लिए एक ! (गैर-शब्द वर्ण) शामिल है। सभी ReDoS के लिए अंत में किसी विशेष वर्ण की आवश्यकता नहीं होती, लेकिन इस मामले में, _ का एक लंबा स्ट्रिंग regex से सफलतापूर्वक मेल खाएगा और बैकट्रैक नहीं करेगा। लाइन Final character to cause backtracking: [^WORD] दर्शाती है कि अंत में एक गैर-मिलान वर्ण (शब्द वर्ण नहीं) की आवश्यकता है ताकि मिलान को रोका जा सके और ReDoS का कारण बना जा सके।
एक अन्य उदाहरण के रूप में, ReDoS के प्रति संवेदनशील मॉड्यूल संस्करण स्थापित करें जैसे pip install ua-parser==0.9.0।
स्थापित पायथन मॉड्यूल को स्कैन करने के लिए regexploit-python-env चलाएँ।
Importing ua_parser.user_agent_parser
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: \bSmartWatch *\( *([^;]+) *; *([^;]+) *;
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(' + ' ' * 3456
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(0;' + ' ' * 3456
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: ; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [[0-9]]
Example: ';0 Build/HuaweiA' + '0' * 3456
...
प्रत्येक संवेदनशील रेगुलर एक्सप्रेशन के लिए यह ReDoS ट्रिगर करने के लिए एक या अधिक दुर्भावनापूर्ण स्ट्रिंग प्रिंट करता है। अपने user agent को ;0 Build/HuaweiA000000000000000... पर सेट करना और ua-parser के पुराने संस्करण का उपयोग करने वाली वेबसाइट पर ब्राउज़ करना सर्वर को आपके अनुरोध को संसाधित करने में लंबा समय ले सकता है, संभवतः स्थिति 502 पर समाप्त हो सकता है।
Python 3.8+ आवश्यक है। JavaScript / TypeScript कोड से regex निकालने के लिए, NodeJS 12+ भी आवश्यक है।
वैकल्पिक रूप से एक वर्चुअल वातावरण बनाएँ
python3 -m venv .env
source .env/bin/activate
अब pip के साथ वास्तव में स्थापित करें
pip install regexploit
regexploit में stdin के माध्यम से (प्रति पंक्ति एक) रेगुलर एक्सप्रेशन दर्ज करें।
regexploit
या फ़ाइल के माध्यम से
cat myregexes.txt | regexploit
Python, JavaScript, TypeScript, C#, YAML और JSON से regex पार्स करने के लिए अंतर्निहित समर्थन है।
Python कोड को AST के माध्यम से (निष्पादित किए बिना) पार्स करता है ताकि regex मिल सकें। फिर regex का ReDoS के लिए विश्लेषण किया जाता है।
regexploit-py my-project/
regexploit-py "my-project/**/*.py" --glob
यह regexploit/bin/javascript में बंडल NodeJS पैकेज का उपयोग करेगा जो आपके JavaScript को AST के रूप में eslint के साथ पार्स करता है और सभी regex प्रिंट करता है।
वे regex python ReDoS खोजकर्ता में फीड किए जाते हैं।
regexploit-js my-module/my-file.js another/file.js some/folder/
regexploit-js "my-project/node_modules/**/*.js" --glob
नोट: जावास्क्रिप्ट और पायथन regex पार्सिंग में अंतर हैं, इसलिए कुछ त्रुटियाँ हो सकती हैं। मुझे यकीन नहीं है कि मैं चाहता हूँ JS regex AST लिखना!
आपके पथ / env में वर्तमान में स्थापित सभी python मॉड्यूल में regex खोजें। इसका मतलब है कि आप जिस भी मॉड्यूल में रुचि रखते हैं उसे pip install कर सकते हैं और उनका विश्लेषण किया जाएगा। Cpython कोड शामिल है।
regexploit-python-env
नोट: यह python कोड को AST में पार्स नहीं करता है और केवल उन regex को ढूँढेगा जो मॉड्यूल आयात पर स्वचालित रूप से संकलित होते हैं। मॉड्यूल वास्तव में आयात किए जाते हैं, इसलिए मॉड्यूल में कोड निष्पादित किया जाएगा। यह उन regex को खोजने में सहायक है जो लोड होने पर छोटे स्ट्रिंग्स से निर्मित होते हैं, उदाहरण के लिए Pillow में CVE-2021-25292
Yaml समर्थन के लिए pyyaml की आवश्यकता है, जिसे pip install regexploit[yaml] से स्थापित किया जा सकता है।
regexploit-json *.json
regexploit-yaml *.yaml
regexploit-csharp something.cs
यह उपकरण Doyensec LLC के बेन कॉलर द्वारा शोध समय के दौरान बनाया गया है।