الخلاصة

  • اقترح RFC 1701 أن يستعمل المستقبل حقل Key ذي الأربعة أوكتتات لتوثيق مصدر الحزمة، لكنه لم يحدد إنشاء القيمة ولا توزيعها ولا حمايتها ولا التحقق منها.
  • أعاد RFC 2890 ضبط الصلاحية: يعرّف Key تدفقاً منطقياً واحداً داخل النفق، ولا يشارك في أي نوع من الأمن رغم اسمه. أما Sequence Number فيوفر ترتيباً من دون موثوقية التسليم.
  • يمكن لقيمة Sequence عشوائية محقونة أن تدفع ذاكرة المستقبل إلى الأمام وتجعل الحزم الشرعية اللاحقة تبدو قديمة. لا تصبح K وS جديرتين بالثقة إلا حين تغطي حماية مستقلة ترويسة GRE والحمولة معاً.

الاسم الذي سبق الدليل

توحي كلمة «مفتاح» بسر أو أهلية أو وسيلة لفتح قيد. لذلك يسهل أن تتحول مطابقة قيمة في إعداد GRE إلى استنتاج بأن الحزمة جاءت من الطرف الصحيح. غير أن تاريخ الحقل يبيّن أن الاسم وصل قبل القدرة.

نشر RFC 1701 عام 1994 وصفاً عاماً لتغليف بروتوكول من طبقة الشبكة داخل بروتوكول آخر. تحيط ترويسة النقل بترويسة GRE، ثم تأتي الحزمة الداخلية. أمكن أن تحمل الترويسة اختيارياً Checksum ومعلومات توجيه وKey وSequence Number.

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

بقي Sequence Number ناقصاً بالطريقة نفسها. قد يساعد على إثبات ترتيب الإرسال، لكن خوارزمية التوليد ودلالة الاستقبال ظلتا خارج النطاق. فهم موقع الحقل لا يكفي كي تتخذ تطبيقات مستقلة القرار نفسه.

بدأ المعيار بتصغير المشترك

في مارس 2000، اختار RFC 2784 تقاطع سلوك GRE العامل لدى عدة مورّدين. أبقت الترويسة الأساسية بت الحضور الخاص بالـChecksum وVersion وProtocol Type. يحدد الأخير نوع الحمولة، لكنه لا يقرر لماذا سُمح لها بدخول النفق.

صارت مواضع الخيارات القديمة حداً للتوافق. يرسل المنفذ الذي يتبع RFC 2784 وحده البتات المحجوزة صفراً. وعلى المستقبل الذي لا ينفذ RFC 1701 أن يهمل الحزمة إذا كان أحد البتات من 1 إلى 5 غير صفري. وشرحت أقسام مستقلة التفاعل مع المنفذين الأقدم.

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

صار Key مفيداً عندما فقد ادعاءه الكبير

حدّث RFC 2890 المواصفة بعد ستة أشهر، وأعاد استخدام موضعي K وS. تعلن K وجود Key من أربعة أوكتتات، وتعلن S وجود Sequence Number بالحجم نفسه. بقي ترتيب البتات متوافقاً مع RFC 1701، لكن المهمة أصبحت محددة.

يضع المغلِّف قيمة Key، أما طريقة الحصول عليها فتبقى خارج RFC. يستخدمها مفكك التغليف لتمييز تدفق حركة بعينه داخل النفق، خصوصاً عندما لا تحتوي البيانات الداخلية على السياق اللازم للمعالجة المحلية. تحمل حزم التدفق الواحد القيمة نفسها.

هذه تسمية محلية داخل علاقة نهايتين. قد تعني القيمة ذاتها تدفقاً مختلفاً في نفق آخر. لا تعلن مالكاً ولا إذناً ولا سراً. من يستطيع بناء الحزمة يستطيع نسخ أربعة أوكتتات ظاهرة.

لذلك يصرح قسم الأمن بأن حقل Key لا يدخل في أي نوع من الأمن، رغم اسمه. احتفظ المعيار بالكلمة من أجل التوافق، لكنه سحب منها صفة الاعتماد.

Sequence ينظم ذاكرة محدودة

مع S، يستخدم المرسل عداداً حراً من 32 بت يبدأ بالصفر ويدور بترديد 2^32. يحفظ المستقبل رقم آخر حزمة فُك تغليفها بنجاح. إذا حضرت K، تخص هذه الذاكرة التدفق الذي اختارته القيمة.

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

يسمي RFC هذه الخدمة «غير موثوقة لكنها مرتبة». لا يعيد Sequence إرسال الحمولة المفقودة ولا يضمن وصول كل رقم. إنه يضبط فقط مقدار الانتظار قبل الاعتراف بأن شيئاً لم يصل.

ولا ينشئ ترتيباً كلياً للنفق. يمكن أن تتداخل حزم بلا S مع الحزم المرقمة، ولكل Key تاريخ منفصل. تثبت الفجوة ما لم ينجح المستقبل في فكّه ضمن حالة التدفق، ولا تثبت إن كان السبب فقداً أو تأخيراً أو ترشيحاً أو إعادة تشغيل أو عدم إرسال.

مستقبل مزور يستطيع إلغاء الحاضر

لنفترض أن آخر قيمة مقبولة هي 40. يحقن مهاجم حزمة تحمل Key منسوخة وSequence أبعد كثيراً، فتصل أولاً. إذا لم تكن ترويسة GRE داخل حماية تكامل خارجية، قد يكتب المستقبل الرقم المزور في ذاكرته. تظهر الحزم الشرعية التالية قديمة، فتهملها قاعدة الترتيب نفسها.

يصف RFC 2890 حقن رقم عشوائي بأنه مسار لهجوم حجب الخدمة. والحل ليس Key أطول ولا عداداً أكبر، بل حماية IP منفصلة تغطي ترويسة GRE والحمولة داخل النفق. يجب أن تشمل الحماية K وS لأنهما الحقلان اللذان يختاران السياق ويحركان الحالة.

لهذا لا يشكل Sequence وحده حماية من إعادة الإرسال. لا تكتسب نافذة anti-replay معناها إلا بعد توثيق أن الحزمة تنتمي إلى العلاقة المحمية. من دون ذلك يستطيع المهاجم كتابة المرجع الذي ستُحاكم به الحزم التالية.

أما التشفير فخاصية أخرى. لا يخفي Key المحتوى، ولا يخفي Sequence نمط الحركة. تختار الآلية المحيطة ما إذا كانت توفر التكامل وحده أو تضيف السرية.

أضاف ECN واجباً مستقلاً

جاء RFC 9601 عام 2024 بوصفه التحديث الآخر المسجل لـRFC 2784. أدخل GRE المستخدم بين ترويسات IP ضمن قواعد نشر Explicit Congestion Notification، وأضاف متطلبات إعداد آمن عند مدخل نفق يستخدم IPv4 أو IPv6 في الخارج.

لا يوسع ذلك سلطة Key. ينقل ECN دليلاً عن الازدحام، ويختار Key سياق التدفق، وينظم Sequence الاستقبال داخله، بينما تتحقق الحماية المنفصلة من المصدر والتكامل. يمكن أن تجتمع الوظائف في نفق واحد، ولا تحل إحداها محل الأخرى.

يذكر RFC 9601 أيضاً أن GRE نفسه لا يملك آلية ديناميكية لإنشاء النفق وإعداده. قد تنشئه إعدادات ثابتة أو بروتوكولات تحكم أخرى. يظهر التقاط الحزمة K وS، لكنه لا يظهر التفويض الذي وزع القيمة أو سمح بالطرف.

العداد يسجل حكماً لا سبباً

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

يجب أن يربط التحقيق بين نهايتي النقل، ومساحة Key، وخريطة التدفق، والحاجة إلى S، وآخر قيمة مقبولة، ونتيجة فحص التكامل. الاكتفاء بعبارة «تطابق المفتاح» يعيد خلط الوظائف التي فصلها المعيار.

كان إنجاز RFC 2890 في التواضع الدقيق. يضيف Key سياقاً، ويضيف Sequence ترتيباً مشروطاً. يبدأ الأمن فقط عند آلية تستطيع فعلاً اختبار المصدر وعدم التعديل.

المصادر