قام مختبر الأبحاث Ink & Switch بنشر bijou64، وهو عبارة عن ترميز عدد صحيح متغير الطول حيث يتم تعيين كل رقم لتمثيل بايت واحد بالضبط. تم تصميمه للتخلص من أخطاء قابلية تطويع التوقيع في بروتوكول مزامنة Subduction الخاص بهم، ويتجنب التنسيق منطق التحقق من صحة القانون من خلال البناء أثناء فك التشفير بشكل أسرع بما يصل إلى عشر مرات من LEB128.

أصدر مختبر الأبحاث Ink & Switch bijou64، وهو ترميز عدد صحيح متغير الطول (varint) مصمم بحيث يتم تعيين كل عدد صحيح إلى تسلسل بايت واحد صالح. تم تطوير التصميم بواسطة Brooklyn Zelenka، وهو يزيل فئة الأخطاء القانونية التي تؤثر بشكل متكرر على البروتوكولات الثنائية بينما يتفوق على أجهزة فك التشفير القياسية LEB128 في المعايير.

تقوم المتغيرات التقليدية مثل LEB128 بتقسيم الأعداد الصحيحة إلى أجزاء مكونة من 7 بتات مع بتة مستمرة في كل بايت. وهذا يسمح بتسلسلات بايت صالحة متعددة لنفس الرقم (على سبيل المثال، يمكن تشفير الصفر كـ 0x00 أو 0x80 0x00). في الأنظمة التي تستخدم توقيعات التشفير، أو معالجة المحتوى، أو الإجماع الموزع، تقوم هذه الترميزات المتكررة بإنشاء سطح هجوم. في حين أن المواصفات تنص على أن أجهزة فك التشفير ترفض المدخلات غير الأساسية، تشير Zelenka إلى أن المطورين كثيرًا ما يحذفون عمليات التحقق المنفصلة أو يقومون بتحسينها، مما يؤدي إلى عيوب أمنية مشابهة لنقاط الضعف التاريخية في PKCS#1 v1.5 وGnuTLS وقابلية تطويع معاملات Bitcoin.

يعالج Bijou64 هذا الأمر من خلال جعل الترميزات البديلة مستحيلة على المستوى الهيكلي. كما قامت Zelenka بتأطيرها في المنشور:

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

يعتمد التصميم على آليتين إنشائيتين رئيسيتين:

  • القيم المباشرة (0–247): البايت الأولي في هذا النطاق يمثل القيمة الصحيحة مباشرة بدون بيانات تعريف إضافية.
  • وحدات البايت والإزاحات (248–255): تشير البايتات الموجودة في هذا النطاق إلى عدد بايتات الحمولة النافعة التي تتبعها. تضيف كل طبقة طول إزاحة ثابتة ثابتة بحيث لا يمكن إدراج القيم الأقل في طبقات بايت أكبر.

نظرًا لأن الحمولة عبارة عن عدد صحيح كبير النهاية، يمكن للمترجمين تحويل فك التشفير إلى عملية تحميل واحدة ومبادلة بايت. على أجهزة x86 وARM، يقوم bijou64 بفك ترميز الأرقام الصغيرة بسرعة مضاعفة تقريبًا مثل LEB128 والأرقام الأكبر أسرع بـ 8 إلى 10 مرات من خلال تجنب عمليات مسح البتات المستمرة لإخفاء البتات الخاصة بـ LEB128 وسحق الفروع.

أثار رد فعل المجتمع على Hacker News العديد من المقايضات فيما يتعلق بالتنسيق. قال أحد المعلقين، استنادًا إلى قياس الأداء من تنسيق BONJSON، إن المقارنة مع أجهزة فك التشفير العددية تخطئ في المكان الذي انتقل إليه التحليل عالي الأداء:

أثبت الاختبار أنه عند الانتقال إلى تعليمات SIMD، فإن قيم ULEB128 أو القيم الخافرة تفوز في كل مرة بسبب فرص الموازاة. المفارقة الحقيقية هي أنه حتى تحليل نص SIMD سوف يتفوق على هذا! SIMD بهذه القوة.

شكك معلق آخر، dzaima، في المطالبة الأمنية الأساسية، مشيرًا إلى أن bijou64 يضيق سطح الحدود المحدد بدلاً من القضاء على التحقق من صحة وقت التشغيل بالكامل:

يعد نسيان التحقق من النطاق في الحالة first_byte==255 والسماح لها بإجراء التفاف 64 بت بمثابة خطأ معقول تمامًا مثل عدم وجود عمليات فحص النطاق على LEB128. بمعنى ما، ربما يكون bijou64 أكثر إشكالية: فهو يدعو إلى عدم إجراء أي فحص للنطاق للمدخلات الأصغر لأنه من الواضح أنها لا تحتاج إليها، ولذا يمكنك فقط أن تنسى وضع حالة خاصة على حالة الحد الأقصى للطول.

أبرزت التعليقات الإضافية أن التنسيقات غير المتعارف عليها مثل LEB128 يتم استخدامها عن عمد بواسطة الروابط في WebAssembly وDWARF لتضمين المراجع غير المرتبطة للتصحيح في المكان، مما يوضح أن الحشو المتغير يظل متطلبًا متعمدًا لسلاسل أدوات محددة.

يتوفر تطبيق bijou64 المرجعي في Rust oncrates.io بموجب تراخيص MIT/Apache 2.0 المزدوجة، إلى جانب أغلفة JavaScript على npm ومنافذ المجتمع في Elixir وGo وPerl وJava. تمت تغطية متغيرات العرض bijou32 وbijou128 أيضًا في المواصفات.



شاركها.
اترك تعليقاً