Hooks

hook jwt: اكتشف التحقق من JWT دون تثبيت الخوارزمية

افحص قاعدة الكود بحثًا عن التحقق من JWT دون تثبيت الخوارزمية، أو قيّم استدعاءً واحدًا، من سطر الأوامر.

ينبّه hook 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 الخاص بالرمز نفسه. وهذا انكشاف مؤكد، لذلك ينتهي hook برمز خروج غير صفري. والتشغيل النظيف يطبع 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"] }
}
}

تشرح صفحة إعداد hooks كل إعداد.

اللغات المدعومة​

يقرأ الفحص هذه المكتبات، بحسب امتداد الملف. ولأن بعضها يثبّت الخوارزمية ضمنيًا (فغياب القائمة الصريحة سليم)، لا تنطبق قاعدة "لا قائمة سماح ⇒ 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، ومحلل unsigned/unsecured
PHPfirebase/php-jwtلا (يحمل Key الخوارزمية)none
Rustjsonwebtokenلا (يتطلب Validation واحدة)none، و insecure_disable_signature_validation
C#Microsoft.IdentityModelلا (معاملات متعددة الأسطر)none، و RequireSignedTokens = false
تلميح

لا يحسم hook إلا تثبيت الخوارزمية: أما فحوص الادعاءات والمفاتيح والمسار، فهي أحكام يظل التخصص federation يغطيها.

الأسئلة الشائعة

المتحقق الذي يقرأ الخوارزمية من ترويسة الرمز يسمح للمهاجم باستبدال RS256 بـ HS256 والتوقيع بالمفتاح العام. ويمنع ذلك تثبيتُ قائمة سماح سليمة للخوارزميات في الكود، وينبّه hook jwt إلى استدعاء التحقق الذي لا يضع قائمة أو يضع قائمة غير آمنة.