हुक

jwt हुक: बिना तय एल्गोरिदम वाला JWT वेरिफ़िकेशन पकड़ें

कमांड लाइन से कोडबेस को स्कैन करके बिना तय एल्गोरिदम वाला JWT वेरिफ़िकेशन खोजें, या किसी एक कॉल को स्कोर दें।

jwt हुक बिना तय एल्गोरिदम वाला JWT वेरिफ़िकेशन पकड़ता है, यानी एल्गोरिदम कन्फ़्यूज़न की वह कमज़ोरी जिसमें वेरिफ़ाई करने वाला कोड टोकन के अपने alg हेडर पर भरोसा कर लेता है, और साथ ही पूरी तरह बंद किया गया वेरिफ़िकेशन भी पकड़ता है। यह भाषा को समझता है और हर फ़ाइल को उसकी अपनी JWT लाइब्रेरी के हिसाब से पढ़ता है। यही federation विशेषज्ञता के पीछे का नियतात्मक इंजन है, जिसे आप खुद scan या check मोड में चला सकते हैं।

चलाएँ​

npx lagune read jwt # scans the whole project
npx lagune read jwt --dir src # scans a directory
npx lagune read jwt --file auth.ts # scans a single file

Unpinned JWT verification found के नीचे की हर लाइन एक ऐसी वेरिफ़ाई कॉल है जो या तो कोई algorithms अनुमति सूची तय नहीं करती (जहाँ लाइब्रेरी को इसकी ज़रूरत है), या असुरक्षित सूची स्वीकार करती है (none, या HMAC के साथ मिला कोई एसिमेट्रिक एल्गोरिदम), या सिग्नेचर की जाँच ही पूरी तरह बंद कर देती है, और इस तरह टोकन के अपने alg पर भरोसा कर लेती है। यह पुष्ट जोखिम है, इसलिए हुक नॉन-ज़ीरो कोड के साथ बाहर निकलता है। कुछ न मिलने पर यह no unpinned JWT verification found प्रिंट करता है।

फ़ैसला कैसे पढ़ें​

फ़ैसलामतलब
unpinnedऐसी वेरिफ़ाई कॉल जिसमें एल्गोरिदम की अनुमति सूची नहीं है (जहाँ ज़रूरी है), सूची असुरक्षित है, या वेरिफ़िकेशन बंद है।
safeऐसी वेरिफ़ाई कॉल जो एल्गोरिदम की सुरक्षित अनुमति सूची तय करती है, या जिसकी लाइब्रेरी इसे अपने आप तय कर देती है।
invalidकोड के इस टुकड़े में जाँचने लायक कोई पहचानी जा सकने वाली वेरिफ़ाई कॉल नहीं है।

CLI विकल्प​

विकल्पमानविवरण
--patternकोड का एक टुकड़ाएक कॉल जाँचें। कई कॉल जाँचने के लिए इसे दोहराएँ, हर लाइन पर एक फ़ैसला मिलेगा।
--langएक भाषा--pattern के साथ ज़रूरी: javascript, python, go, java, kotlin, php, ruby, rust, csharp में से एक।
--dirएक डायरेक्टरीस्कैन को एक डायरेक्टरी तक सीमित करें। इसे दोहराया जा सकता है और --file के साथ जोड़ा जा सकता है।
--fileएक फ़ाइलस्कैन को एक फ़ाइल तक सीमित करें। इसे दोहराया जा सकता है और --dir के साथ जोड़ा जा सकता है।

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

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

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

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

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

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

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

भाषालाइब्रेरीअनुमति सूची न होने पर unpinned मानता है?हमेशा पकड़ता है
JavaScript / TypeScriptjsonwebtoken, joseहाँnone, एसिमेट्रिक और HMAC का मेल
PythonPyJWT, python-joseहाँ (PyJWT में यह ज़रूरी है, python-jose का डिफ़ॉल्ट algorithms=None है)none, verify_signature: False
Gogolang-jwtहाँ (WithValidMethods न होने पर)none, ParseUnverified
Rubyruby-jwtहाँnone, verify = false
Java / Kotlinjjwt, nimbusनहीं (एल्गोरिदम कुंजी से तय होता है)none, बिना सिग्नेचर वाला या unsecured पार्सर
PHPfirebase/php-jwtनहीं (Key में एल्गोरिदम शामिल रहता है)none
Rustjsonwebtokenनहीं (Validation में एल्गोरिदम बताना ज़रूरी है)none, insecure_disable_signature_validation
C#Microsoft.IdentityModelनहीं (पैरामीटर कई लाइनों में फैले होते हैं)none, RequireSignedTokens = false
tip

हुक सिर्फ़ एल्गोरिदम तय होने का फ़ैसला करता है: क्लेम, कुंजी और फ़्लो की जाँच ऐसे आकलन हैं जो अब भी federation विशेषज्ञता के दायरे में आते हैं।

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

अगर वेरिफ़ाई करने वाला कोड टोकन के हेडर से एल्गोरिदम पढ़ता है, तो हमलावर RS256 की जगह HS256 रखकर पब्लिक कुंजी से साइन कर सकता है। कोड में एल्गोरिदम की सुरक्षित अनुमति सूची तय करने से यह रुकता है, और jwt हुक ऐसी वेरिफ़ाई कॉल पकड़ता है जो कोई सूची तय नहीं करती या असुरक्षित सूची तय करती है।