الخلاصة

  • يفرض RFC 9654 على الطالب الحديث إنشاء nonce لا يقل عن 32 ثمانية باستخدام مولد شبه عشوائي قوي تشفيرياً؛ وإرجاع القيمة نفسها بدقة يربط الاستجابة بذلك الطلب ويمنع استبدالها باستجابة قديمة ذات قيمة أخرى.
  • لا يثبت التطابق وحده أن المستجيب استوعب أحدث بيانات الإلغاء، أو أن الموقّع مخول، أو أن CertID يخص الشهادة المقصودة، أو أن نافذة الزمن والسياسة التطبيقية تسمحان بالقبول.
  • يجب أن يفصل السجل القابل للمراجعة بين بايتات الطلب والاستجابة، وتوليد nonce ومقارنته، وسلطة التوقيع، وهوية الشهادة، والأزمنة الموقعة، وعمر مصدر البيانات، وقرار التطبيق النهائي.

الهجوم الذي يدخل من فرع الغياب

يضع العميل nonce جديداً في طلب OCSP. يعترض مهاجم على المسار الطلب ويرسل استجابة سابقة صادرة فعلاً عن الخادم، لكنها بلا nonce. إن اكتفى العميل بالقول إن الاستجابة موقعة، فقد انتقل من حماية الربط إلى مسار آخر من دون أن يسجل الانتقال.

RFC 9654 يستخدم nonce لربط الطلب والاستجابة ومنع إعادة الإرسال. لكن نظام OCSP الأوسع يسمح للمستجيب أحياناً بعدم إعادة الامتداد. لذلك يذكر النص هذا الهجوم صراحة ويقترح تقصير الفترة بين thisUpdate وnextUpdate لتقليل نافذته.

يجب ألا تختلط أربع حالات: nonce حاضر ومطابق؛ nonce غائب مع رجوع زمني مسموح؛ nonce حاضر ومختلف؛ ورسالة مرفوضة أو غير قابلة للفك. لكل حالة ضمان مختلف ومسار تحقق مختلف.

الطول له سياسة وليس رقماً واحداً

يعرّف RFC 9654 النوع من 1 إلى 128 ثمانية. على الطالب الذي ينفذ المواصفة استخدام 32 ثمانية على الأقل. وعلى المستجيب الداعم قبول القيم من 16 إلى 32. ويمكنه حذف nonce في الرد عندما يكون الطول من 1 إلى 15 أو من 33 إلى 128. أما الصفر أو أكثر من 128 فيلزمان malformedRequest.

إذن 128 حد صياغة لا وعد انعكاس عام. كان RFC 8954 يضع سقفاً عند 32، فلا يجوز افتراض أن البرامج الأقدم تفهم القيم الأطول. التوسعة الجديدة تخدم خوارزميات قد تنتج قيماً طويلة، ولا تطلب اختيار الحد الأقصى دائماً.

ينبغي للاختبار أن يغطي 16 و32 و33 و128، إضافة إلى الصفر و129. ويسجل القبول مع الانعكاس، والقبول من دونه، والرفض. كلمة «نجح» وحدها تخفي الفرع الأمني الفعلي.

القيمة داخل غلاف

يوضع nonce في requestExtensions ثم، عند إرجاعه، في responseExtensions تحت OID هو 1.3.6.1.5.5.7.48.1.2. يوضح RFC 9654 أن extnValue الخارجي OCTET STRING يحتوي على Nonce داخلي من النوع نفسه.

يمكن لمحلل أن يجد OID الصحيح ثم يقارن الغلاف بالقيمة الداخلية. ويمكن للسجل أن يقص التمثيل الست عشري. ويمكن لطبقة تحويل نصي أن تفقد البايتات الأصلية. لذلك وجود الامتداد ليس دليلاً كافياً على المقارنة الصحيحة.

يحفظ الإيصال DER الكامل للطلب والاستجابة وبصمتيهما، وموقع الامتداد، وطول الغلاف، وطول القيمة، ونتيجة المقارنة بايتاً ببايت. يسجل IANA معرفي وحدتي ASN.1 رقم 111 و112؛ وهذا ينسق النحو ولا يشهد لسلوك المحلل العامل.

العشوائية تسبق الرسالة

يطلب RFC 9654 مولد أرقام شبه عشوائية قوي تشفيرياً وفق RFC 4086. إذا استطاع المهاجم توقع القيمة التالية، أمكنه طلب استجابة تحملها مسبقاً. وإذا كان المجال صغيراً أمكنه تجهيز كل الاحتمالات.

في الحالتين قد تكون المقارنة اللاحقة صحيحة. الذي فشل هو كون التحدي جديداً وغير متوقع. لذلك يبدأ الرصد عند التوليد: نوع المصدر، صحته، وقت التوليد، الطول، إعادة الاستخدام بين العمليات، والسلوك بعد إعادة التشغيل.

عبارة «32 بايت» تثبت شكلاً. أما «قيمة جديدة غير قابلة للتوقع لهذا الطلب» فتحتاج دليلاً من الشفرة العاملة. وهذا هو معنى أولوية الشفرة المنفذة في هذا السياق.

أحدث استجابة قد تعتمد على حالة متأخرة

يقول RFC 9654 إن تضمين قيمة الطالب يضمن أحدث استجابة من الخادم بدلاً من نسخة قديمة. موضوع الجملة هو استجابة الخادم، لا سلسلة البيانات التي تغذيه.

يفصل RFC 6960 بين producedAt وthisUpdate وnextUpdate وrevocationTime. وقت التوقيع، والوقت الذي عُرفت فيه الحالة صحيحة، وموعد توفر معلومة أحدث، ووقت الإلغاء حقائق مختلفة. ويحدد CertID جهة الإصدار والرقم التسلسلي.

إذا نشرت سلطة التصديق إلغاءً عند 12:00 ولم يصل إلى نسخة المستجيب حتى 12:06، يستطيع المستجيب عند 12:03 إنشاء استجابة جديدة تماماً تحمل nonce الصحيح وتوقيعاً صحيحاً وفق الحالة التي يعرفها. التبادل حديث لكن المصدر متأخر. إثبات حداثة المصدر يحتاج مؤشر دفعة أو علامة مائية أو إيصال استيعاب مستقل.

وتبقى سلطة الموقّع بوابة أخرى. يشترط RFC 6960 أن يكون الموقّع سلطة الإصدار، أو مستجيباً موثوقاً مباشرة، أو مفوضاً يحمل الشهادة المناسبة. لا يمنح nonce هذا التفويض. كما أن good لا يثبت الإصدار أو صلاحية الشهادة أو الهوية أو إذن العمل.

لماذا يسمح ملف الحجم الكبير بالغياب

صُمم RFC 5019 لبيئات كبيرة تستفيد من الاستجابات المنتجة مسبقاً والتخزين المؤقت. الاستجابة الفريدة لكل طلب ترفع الكلفة وتقلل إعادة الاستخدام. ولهذا يمكن للمستجيب حذف nonce حتى لو أرسله العميل.

إذا لم يعرف العميل أن الخادم يدعم nonces، فلا ينبغي أن يرفض بسبب الغياب وحده، بل يعود إلى التحقق الزمني الموقع. هذا قرار تشغيلي بين مقاومة replay والسعة والتوفر، وليس عيباً يمكن إخفاؤه تحت نتيجة واحدة.

يجب تسجيل ما إذا كان الغياب متوقعاً حسب سياسة الخادم، وما إذا كان الرجوع مسموحاً لهذا العميل، وما هي نافذة الزمن والتسامح والساعة المحلية. عندها يستطيع المحقق معرفة أي ضمان كان فعالاً فعلاً.

سلسلة إيصالات كاملة

يبدأ السجل ببصمة الشهادة ورقمها التسلسلي وتجزئتي اسم المفتاح والجهة المصدرة والمستجيب المتوقع. ثم يحفظ الطلب، ومصدر nonce، ووقت توليده وطوله وبصمته والوجهة. وتحفظ الاستجابة كاملة مع حالتها وهوية المستجيب وسلسلة الموقّع والتفويض والتحقق.

تسجل طبقة الربط وجود nonce وتطابقه. وتسجل طبقة الحالة CertID والحالة والأزمنة ومعلومات الإلغاء. وتضاف علامة مصدر البيانات إن أمكن. ثم تسجل الساعة المحلية وعدم اليقين والتسامح وإصدار المدقق والسياسة. ويغلق التطبيق السلسلة بنتيجة المسار والهوية والقبول أو الرفض وأثر الجلسة.

تحافظ طبقات الواقع على استقلال هذه الحقائق المتجاورة. وتضع المواصفة الأولية الدنيا القواعد المشتركة في الترميز والطول والعشوائية والمقارنة، وتترك السعة والاستيعاب وقبول المخاطر لمسؤولين محليين ظاهرين.

المصادر