تخيل المكتبات التشفيرية كأنها الخزائن عالية التقنية للإنترنت. إنها الأدوات البرمجية التي تحمي كلمات مرورك، وتُشفر رسائلك، وتتحقق من هويتك. وبدونها، سيكون عالمنا الرقمي مفتوحاً على مصراعيه. ومع ذلك، تجادل هذه الورقة البحثية بأنه حتى أفضل الخزائن بها نقاط ضعف، وأن الأشخاص الذين يبنونها (المطورين) والأدوات التي يستخدمونها لبنائها (المترجمات/Compilers) لا يبذلون دائماً ما يكفي من الجهد لحمايتها.
إليك تفصيل للنقاط الرئيسية للورقة باستخدام تشبيهات بسيطة.
1. نوعا اللصوص
تحدد الورقة طريقتين رئيسيتين يحاول من خلالهما المهاجمون اختراق هذه الخزائن الرقمية:
"لص ساعة الإيقاف" (هجمات القنوات الجانبية): تخيل لصاً لا يحاول كسر القفل، بل يقف خارج الخزانة ويستمع. يلاحظ أنه عندما يحاول الحارس تجربة مفتاح معين، يستغرق باب الخزانة وقتاً أطول قليلاً ليُغلق تماماً مقارنة بما يستغرقه عند تجربة مفتاح خاطئ. ومن خلال توقيت هذه الفروقات الضئيلة، يمكن للص اللص معرفة الرمز السري دون أن يلمس القفل أبداً.
نقطة الورقة: غالباً ما تحتوي الأكواد التشفيرية على خطوات "تعتمد على السر". إذا كان الكود يستغرق أوقاتاً مختلفة للعمل بناءً على كلمة سر سرية، فيمكن للمخترق استخدام ساعة إيقاف لسرقة تلك الكلمة.
"مختطف النسخ واللصق" (هجمات إعادة استخدام الكود): تخيل مكتبة كُتبت كتبها بلغة فوضوية وغير آمنة. يجد اللص ثغرة في الأرضية (خطأ في الذاكرة) ويلقي قنبلة تكسر ألواح الأرضية. بمجرد انكسار الأرضية، لا يحتاج اللص لبناء سلاح جديد؛ بل يقوم فقط بالتقاط مطرقة، ومنشار، وسلم كانت موجودة بالفعل في غرفة التخزين بالمكتبة. يقوم بـ "حياكة" هذه الأدوات الموجودة مسبقاً لتسلق الخارج والسيطرة على المبنى.
نقطة الورقة: تُكتب العديد من المكتبات بلغات مثل C أو C++ التي تسمح بأخطاء الذاكرة. يستخدم المخترقون هذه الأخطاء للسيطرة على تدفق البرنامج، مستخدمين قطعاً صغيرة وغير ضارة من الكود الموجود بالفعل داخل المكتبة لشن هجوم ضخم.
2. الحالة الراهنة للخزانة
نظر المؤلفون في 11 مكتبة تشفيرية شهيرة (مثل OpenSSL، المستخدمة في ملايين المواقع الإلكترونية) لمعرفة مدى جودة حمايتها.
مشكلة "ساعة الإيقاف": يعرف معظم المطورين هجمات التوقيت ويحاولون إصلاحها عبر كتابة كود يستغرق نفس القدر من الوقت للعمل بغض النظر عن المدخلات. ومع ذلك، وجدت الورقة أن مكتبتين فقط من أصل 11 مكتبة تقومان فعلياً باختبار منتجهما النهائي للتأكد من أن خدعة "ساعة الإيقاف" لا تعمل. الأمر يشبه طباخاً يتذوق الحساء قبل تقديمه، لكنه ينسى التحقق مما إذا كان الملح قد ذاب حقاً.
مشكلة "النسخ واللصق": يستخدم المطورون أدوات سلامة قياسية (مثل "كاناري الذاكرة/stack canaries"، وهي تشبه أسلاك الأفخاخ) لمنع أخطاء الذاكرة. ورغم أنها تساعد، إلا أنها ليست مثالية. وجدت الورقة أن معظم المكتبات لا تستخدم أقوى إعدادات السلامة المتاحة، مما يتركها عرضة لعمليات الاختطاف المتطورة.
3. المخطط المعيب (مشكلة المترجم/Compiler)
هذا هو جوهر حجة الورقة. يكتب المطورون الكود (المخطط)، ولكن المترجم (Compiler) هو الآلة التي تترجم ذلك المخطط إلى لغة الآلة الفعلية التي تعمل.
الصراع: صُممت المترجمات لجعل الكود سريعاً وفعالاً. إنها تشبه محرراً متحمسًا جداً يريد قص أي "حشو" لجعل القصة أقصر.
الخطأ: في بعض الأحيان، يكون "الحشو" الذي يقصه المترجم هو في الواقع إجراء أمني. على سبيل المثال، قد يكتب المطور كوداً إضافياً لضمان أن العملية تستغرق نفس القدر من الوقت (لإيقاف "لص ساعة الإيقاف"). المترجم، ظناً منه أن هذا الكود الإضافي هو هدر عديم الفائدة، يقوم بحذفه. النتيجة؟ يعود الكود سريعاً مرة أخرى، لكن الثغرة الأمنية تعود أيضاً.
4. أدوات جديدة للمهمة (الترجمة الآمنة)
تقترح الورقة أننا بحاجة إلى نوع جديد من "المحررين" أو المترجمات التي تفهم الأمن بقدر فهمها للسرعة. لقد اختبروا أربع أدوات تجريبية مختلفة:
"الحارس" (SecComp): تتيح هذه الأداة للمطورين تحديد أجزاء معينة من الكود كـ "لا تلمس". فهي تجبر المترجم على الإبقاء على إجراءات السلامة في مكانها. العيب: ليست مجانية الاستخدام بعد.
"المُخلخل" (Multicompiler/MCR): تأخذ هذه الأداة الكود وتعيد ترتيب الأثاث في كل مرة تبني فيها البرنامج. الأمر يشبه نقل المطرقة والمنشار إلى غرف مختلفة كل يوم. إذا اقتحم لص ما، فلن يجد الأدوات التي يحتاجها لأن التصميم تغير. العيب: تبطئ البرنامج بشكل كبير إذا استُخدمت لإيقاف "لص ساعة الإيقاف".
"المهندس المعماري" (SecDivCon): تبني هذه الأداة الكود مع دمج قواعد السلامة منذ البداية، مما يضمن أن المنتج النهائي سريع وآمن في آن واحد. العيب: تستغرق وقتاً طويلاً جداً للبناء وتعمل جيداً فقط للمهام الصغيرة والمحددة.
"المُسلسل" (PCFL): تقوم هذه الأداة تلقائياً بإعادة كتابة الكود الفوضوي إلى خط مستقيم ومتوقع يستحيل توقيته. العيب: لا توقف هجمات "مختطف النسخ واللصق".
5. الحكم النهائي
تخلص الورقة إلى أننا عالقون حالياً في فجوة بين السرعة والأمان.
المطورون يحاولون كتابة كود آمن يدوياً، لكنهم غالباً ما يخطئون.
المترجمات تركز بشدة على السرعة وتحذف ميزات الأمان عن غير قصد.
الأدوات الحالية إما بطيئة جداً، أو معقدة للغاية، أو لا تغطي جميع أنواع الهجمات.
الحل: تدعو الورقة إلى جهد ثلاثي الأبعاد:
يجب على صُناع المترجمات منح المطورين مزيداً من السيطرة بحيث يمكنهم القول: "لا تحذف ميزة الأمان هذه، حتى لو بدت بطيئة".
يجب على صُناع المترجمات الآمنة بناء أدوات تتعامل مع هجمات التوقيت والاختطاف في وقت واحد، وليس أحدهما فقط.
يجب على مطوري المكتبات التوقف عن الاعتماد على الأمل والبدال في استخدام أدوات الترجمة الجديدة والأكثر أماناً لضمان أن خزائنهم مغلقة حقاً.
باختصار: لدينا المخططات لخزائن آمنة، لكن الآلات التي تبنيها تتسرع في اختصار الخطوات. نحن بحاجة لتعليم الآلات أن تعطي الأولوية للسلامة بقدر اهتمامها بالسرعة.
ملخص تقني: حماية المكتبات التشفيرية ضد هجمات القنوات الجانبية وإعادة استخدام الكود
بيان المشكلة
تعد المكتبات التشفيرية أساسية للأمن السيبراني، لكنها تظل عرضة لفئتين رئيسيتين من الهجمات: هجمات القنوات الجانبية (وتحديداً هجمات التوقيت) وهجمات إعادة استخدام الكود (مثل برمجة العودة الموجهة - ROP).
هجمات التوقيت (القنوات الجانبية): تستغل هذه الهجمات الاختلافات في وقت التنفيذ الناتجة عن الفروع المعتمدة على الأسرار، أو عن العنونة في الذاكرة، أو التعليمات ذات زمن التأخير المتغير. وخلافاً للقنوات الجانبية الفيزيائية، لا تتطلب هجمات التوقيت وصولاً مادياً إلى الجهاز. يسلط البحث الضوء على أنه بينما يقوم المطورون غالباً بتنفيذ البرمجة "ثابتة الوقت" يدوياً، فإن المترجمات عامة الغرض (مثل GCC وLLVM) قد تلغي هذه الحمايات عبر عمليات التحسين (Optimization) أو تُدخل تسريبات توقيت أثناء توليد الكود، مما يجعل التخفيفات على مستوى المصدر غير فعالة.
هجمات إعادة استخدام الكود: تستغل هذه الهجمات ثغرات فساد الذاكرة (مثل تجاوز سعة المخزن المؤقت) للسيطرة على تدفق التحكم. يقوم المهاجمون بتجميع قطع برمجية موجودة بالفعل ("gadgets") من المكتبة أو المكتبات المرتبطة بها لتنفيذ حمولات خبيثة. العديد من المكتبات التشفيرية الشهيرة مكتوبة بلغات غير آمنة (C/C++) وتعتمد على مترجمات عامة الغرض تعطي الأولوية للكفاءة على حساب الأمن، مما يتركها غالباً عرضة للاختطاف عبر التحكم في تدفق البرنامج.
استراتيجيات التخفيف الحالية مجزأة؛ حيث يعتمد المطورون على إصلاحات يدوية في الكود المصدري لهجمات التوقيت، وعلى أعلام المترجم القياسية (مثل stack canaries أو ASLR) لهجمات إعادة استخدام الكود. ومع ذلك، فإن هذه التدابير غالباً ما تكون غير كافية: فالإصلاحات اليدوية عرضة للخطأ ويسهل كسرها بواسطة عمليات التحسين، كما أن أعلام المترجم القياسية (مثل -fstack-protector) لا تضمن الحماية ضد الهجمات المتقدمة مثل برمجة القفز الموجه (JOP) أو هجمات إعادة استخدام الكود دقيقة التفاصيل. علاوة على ذلك، هناك نقص في التحقق على مستوى الثنائي (binary-level verification) لضمان بقاء تخفيفات مستوى المصدر فعالة بعد عملية التجميع.
المنهجية
أجرى المؤلفون تحليلاً شاملاً لإحدى عشرة مكتبة تشفيرية مفتوحة المصدر شهيرة (BearSSL, Botan, cryptlib, Crypto++, GnuTLS, LibreSSL, Libgcrypt, libsodium, Mbed TLS, OpenSSL, wolfTLS).
التحليل التجريبي للتخفيفات:
قام المؤلفون بتجميع هذه المكتبات باستخدام GCC 7.5.0 وClang 10.0.1 على نظام Intel Core i7 يعمل بنظام Ubuntu 18.04.
حللوا أعلام التجميع الافتراضية لتحديد وجود التدابير الأمنية مثل فحص تجاوز سعة المخزن المؤقت (-DFORTIFY_SOURCE)، وحواجز المكدس (-fstack-protector-strong)، والتنفيذ المستقل عن الموقع (-fPIE).
قاموا بمطابقة هذه النتائج مع الأدبيات الحالية (تحديداً Jancar et al. [4]) فيما يتعلق باختبار التوقيت ما بعد التجميع.
تقييم نهج التجميع الآمن: يبحث البحث في أربعة أدوات محددة للتجميع الآمن متكاملة مع أو متوافقة مع بنية LLVM لمعالجة الفجوات المحددة:
SecComp (Vu et al. [12]): يستخدم "الملاحظات الغامضة" (تعليقات الكود المصدري) لإجبار المترجم على الحفاظ على خصائص الوقت الثابت.
Multicompiler (MCR) [13]: أداة عشوائية للبرامج تولد متغيرات كود متنوعة (تخطيط المكدس، ترتيب الدوال، استخدام السجلات) لعرقلة هجمات إعادة استخدام الكود.
SecDivCon [5]: خلفية مترجم قائمة على القيود تولد كوداً متنوعاً وثابت الموارد عبر تعريف سياسات أمنية (متغيرات سرية مقابل عامة).
Partial Control-Flow Linearization (PCFL) [14]: يحول تلقائياً البرامج غير ثابتة الوقت إلى مكافئات ثابتة الوقت باستخدام LLVM 13.
المساهمات الرئيسية
تقييم الثغرات: يكشف البحث أن معظم المكتبات التشفية تنفذ حواجز المكدس، ولكن القليل جداً منها يفعل تخفيفات شاملة قائمة على المترجم ضد هجمات إعادة استخدام الكود (على سبيل المثال، libsodium فقط هو من يستخدم -fPIE بشكل افتراضي في الإعدادات المختبرة). والأهم من ذلك، أن اثنتين فقط من إحدى عشرة مكتبة تقومان باختبار الوقت الثابت كجزء من عملية التطوير، مما يشير إلى نقص واسع النطاق في الضمانات بأن الملفات الثنائية المجمعة خالية من تسريبات التوقيت.
تحديد فجوة التجميع: يوضح المؤلفون أن المترجمات عامة الغرض غالباً ما تتعارض مع الأهداف الأمنية؛ إذ يمكن لأعلام التحسين أن تزيل دون قصد تخفيفات الوقت الثابت اليدوية، كما أن الأعلام الأمنية القياسية لا تغطي جميع نواقل الهجوم (على سبيل المثال، حواجز المكدس غير فعالة ضد JOP).
مسح التجميع الآمن: يقدم البحث تحليلاً مقارناً لأدوات التجميع الآمن الموجودة، مصنفاً إياها حسب قدرتها على التخفيف من هجمات جانب التوقيت (TSC) وهجمات إعادة استخدام الكود (CRA)، ومدى توافرها، وتكلفة الأداء (وقت التنفيذ ووقت التجميع).
التوجهات المقترحة: يرسم المؤلفون خارطة طريق لتحسين أمن المكتبات التشفيرية من خلال نقل العبء من الإصلاحات اليدوية في الكود المصدري إلى عمليات التجميع الآمن.
النتائج
الوضع الحالي للمكتبات: تعتمد معظم المكتبات على تنفيذات يدوية للوقت الثابت غير متحقق منها على مستوى الثنائي. وبينما تُستخدم حواجز المكدس على نطاق واسع، إلا أنها غير كافية ضد هجمات إعادة استخدام الكود المتطورة. libsodium فقط هو من يفعّل التنفيذ المستقل عن الموقع (PIE) للملف التنفيذي، وcryptlib فقط هو من يستخدم علم -DFORTIFY_SOURCE.
أداء الأدوات:
SecComp: يوفر عبئاً منخفضاً ويحافظ على خصائص الوقت الثابت، ولكنه يتطلب تعليقات يدوية وغير متاح للعامة، ولا يعالج هجمات إعادة استخدام الكود.
MCR: فعال ضد هجمات إعادة استخدام الكود عبر العشوائية مع عبء منخفض في التجميع. ومع ذلك، فإنه يتسبب في عبء عالٍ في وقت التنفيذ (يصل إلى 8 أضعاف) عند استخدامه للتخفيف من هجمات التوقيت.
SecDivCon: يوفر ضمانات قوية لهجمات التوقيت وتنويعاً دقيق التفاصيل، ولكنه يعاني من وقت تجميع مرتفع ومحدود بوظائف صغيرة ومعماريات محددة (MIPS/ARM).
PCFL: يولد تلقائياً كوداً ثابتاً في الوقت مع عبء تجميع منخفض، ولكنه يتسبب في عبء عالٍ في وقت التنفيذ ولا يعالج هجمات إعادة استخدام الكود.
الأهمية والادعاءات
يجادل البحث بأن الاعتماد الحالي على التخفيفات اليدوية في الكود المصدري والمترجمات عامة الغرض غير كافٍ لتأمين المكتبات التشفيرية ضد التهديدات الحديثة. ويدعي المؤلفون ما يلي:
لا يمكن اعتبار الأمن مجرد فكرة لاحقة: عملية التجميع هي مرحلة حرجة حيث غالباً ما تُفقد الخصائص الأمنية. التجميع الآمن ضروري لسد الفجوة بين المتطلبات الأمنية وكفاءة الكود.
الحاجة إلى حلول متكاملة: لا توجد أداة واحدة حالياً تحل مشكلتي التوقیم وإعادة استخدام الكود بكفاءة. يقترح المؤلفون أن التطوير المستقبلي يجب أن يركز على:
مطوري المترجمات: توفير مزيد من التحكم في التحسين للحفاظ على الخصائص الأمنية ودمج الحفاظ على الوقت الثابت في المترجمات عامة الغرض.
مطوري المترجمات الآمنة: إنشاء أدوات تجمع بين عدة تخفيفات (التوقيت والتحكم في التدفق) بدلاً من التركيز على ناقل واحد.
مطوري المكتبات: تكييف نهج التجميع الآمن وتفعيل خيارات حماية إضافية في مخططات البناء الخاصة بهم.
يخلص البحث إلى أن تحسين أمن المكتبات التشفيرية يتطلب تحولاً منهجياً: الانتقال من الإصلاحات اليدوية المرتجلة إلى عملية تطوير تتضمن التجميع الآمن، والتحقق على مستوى الثنائي، وأدوات قادرة على التعامل مع نماذج مهاجمين متعددة في آن واحد.