हुक

regex हुक: ReDoS पैटर्न पकड़ें

कमांड लाइन से कोडबेस को स्कैन करके ReDoS के खतरे वाले रेगेक्स खोजें, या किसी एक पैटर्न को स्कोर दें।

regex हुक वह नियतात्मक रेगेक्स-सुरक्षा इंजन है जिसे regex विशेषज्ञता चलाती है, और आप इसे खुद भी चला सकते हैं। एक ही कमांड से यह दो मोड में काम करता है: scan, जो कोडबेस में ReDoS के खतरे वाले और रनटाइम पर बनने वाले पैटर्न खोजता है, और check, जो आपके दिए गए किसी एक पैटर्न को स्कोर देता है।

कोडबेस स्कैन करें​

कोई फ़्लैग न देने पर यह पूरे प्रोजेक्ट को स्कैन करता है। --dir स्कैन को एक डायरेक्टरी तक और --file एक फ़ाइल तक सीमित करता है। दोनों को दोहराया जा सकता है और वे मिलकर एक ही रिपोर्ट बनाते हैं, जिसमें हर फ़ाइल एक ही बार आती है, चाहे वह एक से ज़्यादा टारगेट के दायरे में हो।

npx lagune read regex

आउटपुट सादा टेक्स्ट है, और हर सेक्शन का हेडर बताता है कि उसे कैसे पढ़ें। कोई सेक्शन तभी दिखता है जब उसमें कोई निष्कर्ष हो।

Vulnerable regular expressions found:

cmd/server/main.go
([a-z]+)+$ (exponential, search)

Dynamically built regular expressions (review manually by simulating a constructed regex):

app/payments.php
crates/parser/lexer.rs
lib/validate.py

Static regex wrapped in a constructor (use a literal instead):

config/token.rb

कुछ न मिलने पर यह एक ही लाइन प्रिंट करता है।

npx lagune read regex --dir src/clean
# => no unsafe patterns found

सेक्शन कैसे पढ़ें​

सेक्शनमतलब
Vulnerable regular expressions foundReDoS के खतरे वाले पैटर्न, फ़ाइल के हिसाब से समूह में, हर पैटर्न उसके नीचे इंडेंट करके। उसके बाद कोष्ठक में बताया जाता है कि वह असुरक्षित क्यों है, और अगर हों तो उसका स्कोप और उसके फ़्लैग भी। हर लाइन असुरक्षित है, इसलिए फ़ैसला दोहराया नहीं जाता।
Regular expressions the analysis could not settle (review manually)वे पैटर्न जिन पर विश्लेषण अपनी काम की सीमा के अंदर किसी नतीजे पर नहीं पहुँच सका, उसी तरह सूचीबद्ध।
Dynamically built regular expressions (review manually by simulating a constructed regex)वे फ़ाइलें जो किसी वेरिएबल से, स्ट्रिंगें जोड़कर या इंटरपोलेशन से रेगेक्स बनाती हैं।
Static regex wrapped in a constructor (use a literal instead)वे फ़ाइलें जो रेगेक्स कंस्ट्रक्टर को सादा स्ट्रिंग लिटरल देती हैं, जबकि रेगेक्स लिटरल ज़्यादा आसान है और रनटाइम कंपाइल से भी बचाता है।

पहला सेक्शन सुरक्षा से जुड़ा निष्कर्ष है। दूसरा और तीसरा अपने आप में निष्कर्ष नहीं हैं: वे ऐसे कोड की ओर इशारा करते हैं जिस पर कोई स्टैटिक जाँच फ़ैसला नहीं कर सकती, इसलिए उन्हें किसी इंसान को पढ़ना होगा। चौथा कोड को साफ़ बनाने का सुझाव है, सुरक्षा से जुड़ा निष्कर्ष नहीं।

CLI विकल्प​

विकल्पमानविवरण
--patternरेगेक्स का सोर्सएक पैटर्न जाँचें। कई पैटर्न जाँचने के लिए इसे दोहराएँ, हर पैटर्न के लिए एक फ़ैसला, उसी क्रम में।
--flagsरेगेक्स फ़्लैगहर --pattern को इन फ़्लैग के साथ जाँचें, जैसे im। यह सिर्फ़ check मोड पर लागू होता है।
--dirएक डायरेक्टरीस्कैन को एक डायरेक्टरी तक सीमित करें। इसे दोहराया जा सकता है और --file के साथ जोड़ा जा सकता है।
--fileएक फ़ाइलस्कैन को एक फ़ाइल तक सीमित करें। इसे दोहराया जा सकता है और --dir के साथ जोड़ा जा सकता है।
--limitशून्य या धनात्मक पूर्णांकReDoS में दोहराव की सीमा तय करें (डिफ़ॉल्ट 25)। यह दोनों मोड पर लागू होता है। सीमा जितनी कम, जाँच उतनी सख़्त।

कोई विकल्प न देने पर यह पूरे प्रोजेक्ट को स्कैन करता है। --pattern check मोड है, और इसे --dir या --file के साथ नहीं जोड़ा जा सकता।

क्या स्कैन हो, यह चुनें​

Git जिन चीज़ों को अनदेखा करता है, यह उन्हें छोड़ देता है। और चीज़ें छोड़ने के लिए, या Git की अनदेखी की गई चीज़ों को भी स्कैन करने के लिए, regex को उसकी अपनी सेटिंग दें:

npx lagune write add --ignore test/fixtures --checker regex
{
"checkers": {
"regex": { "gitignore": false, "ignore": ["test/fixtures"] }
}
}

हुक कॉन्फ़िगर करें पेज पर हर सेटिंग की जानकारी है।

समर्थित भाषाएँ​

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

#भाषाएक्सटेंशन
1JavaScript / TypeScript.js, .jsx, .mjs, .cjs, .ts, .tsx, .mts, .cts, .astro, .vue, .svelte, .marko, .riot
2Python.py, .pyi
3Ruby.rb
4Go.go
5PHP.php
6Rust.rs
7Java.java
8C#.cs
9C.c, .h
10C++.cc, .cpp, .cxx, .hpp, .hh, .hxx
11Kotlin.kt, .kts
12Swift.swift
13Scala.scala, .sc
14Dart.dart
15PowerShell.ps1, .psm1, .psd1
16Elixir.ex, .exs
17Objective-C.m, .mm
18R.r
19Julia.jl
20Clojure.clj, .cljs, .cljc, .edn
21Crystal.cr
22Nim.nim, .nims
23V.v
24D.d
25Perl.pl, .pm
पूरी कोशिश, पर हर मामला नहीं

यह सोर्स कोड को टेक्स्ट की तरह पढ़ता है, इसलिए रनटाइम पर जोड़े गए पैटर्न को नहीं परख सकता, और कई लाइनों में फैला, किसी एलियास के पीछे छिपा, या ऐसे रूप में लिखा गया पैटर्न जिसे यह नहीं पहचानता, इसकी पकड़ से छूट सकता है। इन सेक्शन को पूरी सूची नहीं, बल्कि एक मज़बूत शुरुआती आधार मानें, और जहाँ ये नहीं पहुँच सकते, वहाँ कोड पढ़ते रहें।

एक पैटर्न जाँचें​

किसी पैटर्न को स्कोर देने के लिए उसका सोर्स --pattern के साथ दें। हुक एक शब्द प्रिंट करता है: safe, unsafe, undetermined (जब विश्लेषण पैटर्न पर नतीजे तक पहुँचने से पहले अपनी काम की सीमा तक पहुँच जाए), या invalid regex। कई पैटर्न एक साथ स्कोर करने के लिए --pattern दोहराएँ, हर पैटर्न के लिए एक फ़ैसला, उसी क्रम में।

npx lagune read regex --pattern '(a+)+$'
# => unsafe

npx lagune read regex --pattern '^[a-z0-9_]{3,20}$'
# => safe
आर्ग्युमेंट कोट में क्यों

हर पैटर्न फ़्लैग के मान के रूप में दिया जाता है, उसे कमांड के अंदर कभी जोड़ा नहीं जाता। कोट या बैकटिक वाला मान भी बेअसर रहता है और शेल में इंजेक्ट नहीं हो सकता। पैटर्न को हमेशा सिंगल कोट में रखें, ताकि आपका शेल पहले ही उसे एक्सपैंड न कर दे।

tip

यह वही इंजन है जिसे regex विशेषज्ञता चलाती है: scan से ReDoS की जाँच शुरू होती है, और check उस जाँच में सामने आए पैटर्न की पुष्टि करता है।

अक्सर पूछे जाने वाले सवाल

npx lagune read regex --pattern '<pattern>' चलाएँ। यह safe, unsafe, undetermined या invalid regex लौटाता है।

कोडबेस पर regex हुक को scan मोड में चलाएँ। यह 25 समर्थित भाषाओं में ReDoS के खतरे वाले पैटर्न की रिपोर्ट देता है।