تخط إلى المحتوى
English

JWT (JSON Web Tokens)

كيف تحمل الرموز الموقعة هويتك وثلاث طرق كلاسيكية يتحقق بها الخادم منها خطأ: قبول alg none وسر ضعيف وخلط RS256 بـ HS256

المسار
أمن الويب
الوقت المتوقع
30 د
المستوى
متوسط
تقدمك في المسار0%

رمز JWT ملاحظة صغيرة موقعة يعطيك إياها الخادم بعد الدخول في كل طلب لاحق تعيدها فيتحقق الخادم من التوقيع فإذا صح وثق بما تقوله الملاحظة من أنت ودورك البيانات داخله مجرد Base64 يقرأها أي أحد والتوقيع هو ما يجعله موثوقا فكل هجوم على JWT هو في الحقيقة هجوم على كيف يتحقق الخادم من ذلك التوقيع

كيف يبدو الرمز

ثلاثة أجزاء Base64url تفصلها نقاط header.payload.signature

بعد فك الترميز
// header                     // payload
{ "alg": "HS256",             { "user": "guest",
  "typ": "JWT" }                "role": "member" }

الترويسة تحدد الخوارزمية والحمولة هي الادعاءات والتوقيع يحسب على header.payload بمفتاح غير أي بايت في الحمولة فلا يطابق التوقيع إلا إذا تحقق الخادم منه خطأ

ثلاث طرق للخطأ

  • alg none المعيار فيه خوارزمية none تعني بلا توقيع فإذا قرأ الخادم الخوارزمية من الرمز واحترم none قبل رمزا بلا أي توقيع فأي أحد يكتب أي حمولة
  • سر ضعيف HS256 يوقع بسر مشترك لو كان السر قصيرا أو شائعا مثل ravens كسره المهاجم دون اتصال بقائمة كلمات ثم وقع أي رمز قوة HMAC كلها في سرية سره
  • خلط الخوارزميات الخادم يستخدم RS256 مفتاح خاص يوقع وعام يتحقق لكنه يقبل أيضا HS256 ويتحقق منه بنفس المفتاح العام كسر HMAC والمفتاح العام معلن فالمهاجم يوقع به رمز HS256 فيقبله الخادم

كيف تنحمى منها

safe.js
// Pin the algorithm on the server. Never read it from the token. Never accept none.
jwt.verify(token, KEY, { algorithms: ['HS256'] });   // or ['RS256']

ثبت الخوارزمية المقبولة في كودك ومررها للمتحقق استخدم سرا عشوائيا طويلا لـ HS256 (32 بايت فأكثر من مخزن أسرار ويدور) أو توقيعا غير متماثل RS256 أو EdDSA حيث لا يحمل المتحقق أي سر توقيع وامنع مفتاح التحقق من أن يستخدم يوما كسر متماثل واضبط صلاحية قصيرة وتذكر أن الحمولة مقروءة فلا تضع فيها أسرارا واعتمد على مكتبة JWT مصانة فالتحقق المكتوب باليد هو مكان هذي الأخطاء

سؤال مراجعةخادم يتحقق من JWT بقراءة header.alg واستخدام الخوارزمية المطابقة ليش هذا خطير؟

اللابات

  • توقيع اختياري

    سهللاب في المتصفح

    زور رمزا يجعل الخادم يعاملك كـ admin

  • سر يمكن كسره

    متوسطلاب في المتصفح

    اكسر سر التوقيع ثم وقع رمزا جديدا يجعلك admin

  • خلط بين الخوارزميات

    صعبلاب في المتصفح

    استغل الخلط بين RS256 و HS256 لتزوير رمز admin باستخدام المفتاح العام