يرى David Chisnall أن التحدي الأصعب في عزل البرمجيات لا يكمن في فصل حملين عن بعضهما بالكامل، بل في عزل مكونات تحتاج إلى التواصل ومشاركة البيانات. وفي عرض منشور عبر InfoQ، يشرح Chisnall كيف تجمع بنية CHERI بين مفاهيم القدرات الأمنية والمؤشرات الموسعة لتوفير حماية عتادية للمؤشرات، مع دعم أمان الذاكرة والعزل الدقيق داخل مساحة العناوين نفسها.
Chisnall هو الشريك المؤسس ومدير هندسة الأنظمة في SCI Semiconductor، كما يشغل صفة باحث زائر في جامعة كامبريدج. ويستند العرض إلى أعمال CHERI البحثية وتطبيقاتها البرمجية والعتادية، من CheriBSD وامتدادات ARM Morello إلى CHERIoT الموجهة إلى المتحكمات الدقيقة، إضافة إلى قاعدة RISC-V المسماة RVY التي قال إن العمل على توحيدها كان في مراحله النهائية.
المؤشر يصبح كياناً محمياً عتادياً
لا يقدم CHERI مجموعة تعليمات مستقلة بالمعنى التقليدي، بل مجموعة أفكار يمكن مواءمتها مع معماريات مختلفة، على غرار كيفية تطبيق مفاهيم SIMD ضمن امتدادات متعددة. ووفق هذا التصور، لا يعود المؤشر مجرد رقم يمثل عنواناً في الذاكرة، بل يصبح قدرة تحمل العنوان، وحدود الكائن، ومجموعة من الصلاحيات، إضافة إلى وسم عتادي يحدد ما إذا كانت القيمة مؤشراً صالحاً.
تفرض هذه القدرات خصائص أحادية الاتجاه: يمكن تضييق الحدود أو إزالة الصلاحيات، لكن لا يمكن توسيعها أو استعادتها من المؤشر نفسه. كما يتحقق العتاد من أن المؤشر صالح وموسوم قبل استخدامه في عمليات التحميل أو التخزين أو القفز. فإذا حاول برنامج استخدام قيمة جرى التعامل معها كبيانات أو جرى العبث بها لإنتاج عنوان، تفشل العملية بدلاً من تحويلها تلقائياً إلى مؤشر قابل للاستخدام.
ويمنح هذا التصميم، بحسب العرض، حماية مباشرة من عدد من المراحل الشائعة في هجمات استغلال الذاكرة، مثل الكتابة فوق مؤشر بقيمة يتحكم بها المهاجم. كما يسمح بعمليات نسخ عامة مثل memcpy من دون حاجة إلى معرفة مسبقة بمواقع المؤشرات، لأن وسم المؤشر ينتقل مع القيمة أو يُمسح عند الكتابة فوق جزء من مساحة القدرة.
حدود وصلاحيات قابلة للتقليص
تتضمن قدرات CHERI صلاحيات للقراءة والكتابة، وصلاحيات منفصلة للتعامل مع المؤشرات الموجودة داخل البيانات. ويشرح Chisnall أن هذه الدقة تسمح، مثلاً، بمنح برنامج صلاحية قراءة البيانات داخل بنية معقدة من دون منحه القدرة على تخزين مؤشرات جديدة فيها. وبهذه الطريقة يمكن توفير عرض للقراءة فقط يمتد عبر شجرة بيانات كاملة، بدلاً من حماية كائن واحد بصورة سطحية.
كما تتيح آلية sealing إنشاء مؤشرات opaque آمنة شبيهة بالمقابض أو واصفات الملفات، لكن من دون الحاجة بالضرورة إلى جدول تحويل تديره النواة. تُغلق القدرة باستخدام رمز نوع، فلا يمكن تعديلها أو فك مرجعها أو استخدامها للقفز والتحميل والتخزين أثناء إغلاقها. وعند إعادتها إلى الجهة المالكة، لا تنجح عملية فك الإغلاق إلا إذا كان رمز النوع مطابقاً.
أمان مكاني وزمني للذاكرة
في حالة أخطاء تجاوز الحدود، يمكن لـ CHERI تحويل سلوك غير محدد في لغة C إلى إيقاف عتادي حتمي. ويعرض Chisnall مثالاً لمصفوفة من 14 عنصراً يجري الوصول إلى العنصر 14 فيها، حيث يؤدي الوصول في نظام تقليدي إلى احتمال الكتابة فوق عنوان العودة، بينما يؤدي في نظام CHERI إلى اعتراض العملية لأن المؤشر مقيد بحدود المصفوفة.
ولا يقتصر الطرح على الأمان المكاني. ففي CHERIoT، تُستخدم وسمات المؤشرات وذاكرة ظل تحتوي على بت لكل وحدة تخصيص، بحيث يمكن إبطال المؤشرات المرتبطة بذاكرة جرى تحريرها. وعند تحميل قدرة إلى سجل، يستطيع مرشح التحميل التحقق من حالة الكتلة ومسح الوسم إذا كانت الذاكرة محررة. كما تعمل آلية عتادية دورية على فحص الذاكرة وإزالة الوسوم من المؤشرات التي تشير إلى كائنات لم تعد حية، ما يسمح بإعادة استخدام الذاكرة بعد اكتمال دورة الإبطال.
من أمان الذاكرة إلى العزل الدقيق
يعود الهدف الأصلي لمشروع CHERI، كما يورده Chisnall، إلى بناء عزل دقيق يتجاوز حدود عزل العمليات التقليدي. فعزل كل مكون في عملية مستقلة يفرض تكاليف مرتبطة بجداول الصفحات وآليات RPC وتسلسل البيانات ونسخها. وقد يكون هذا مقبولاً لعشرات من المجالات المعزولة، لكنه يصبح أقل ملاءمة عندما تحتاج المتصفحات، مثلاً، إلى تشغيل آلاف أو عشرات الآلاف من صناديق الحماية لمكونات مثل فك الصور والصوت أو تشغيل JavaScript JIT.
يتيح نموذج CHERI اعتبار مجموعة الذاكرة التي يمكن الوصول إليها انطلاقاً من القدرات الموجودة في سجلات التنفيذ نطاق حماية. ويمكن لنطاقين داخل مساحة العناوين نفسها أن يتشاركا بعض البيانات مع بقاء أجزاء أخرى معزولة، لأن المشاركة تبدأ من قدرات محددة ويمكن أن تمتد إلى هياكل بيانات معقدة وكل ما يمكن الوصول إليه منها.
على الأنظمة الأكبر، يشرح العرض مساراً تدريجياً عبر استدعاء coexecve، الذي ينشئ عملية جديدة من دون إنشاء مساحة عناوين جديدة، ثم يثبت مجموعة من القدرات الجذرية تحدد ما يمكن للعملية الجديدة الوصول إليه. أما CHERIoT فيتبنى فصلاً صارماً للصلاحيات ضمن نظام تشغيل آني، مع مكوّن تبديل مسؤول عن تبديل السياق والنداءات بين المقصورات، ويبلغ حجمه نحو 350 تعليمة وفق العرض.
الخلاصة التي يطرحها Chisnall هي أن حماية الذاكرة والعزل لا ينبغي أن يعتمدا على إعادة كتابة قواعد الشيفرة بالكامل أو على فصل كل مكوّن في عملية مستقلة. فإبقاء نموذج C قريباً من المعتاد، مع جعل المؤشرات وقدرات الوصول مفهومة ومحكومة عتادياً، قد يوفر مساراً تدريجياً لتقليل أخطاء الذاكرة وبناء مشاركة أكثر قابلية للتدقيق. وتظل تفاصيل التطبيق مختلفة بين الأنظمة الكبيرة والمتحكمات الدقيقة، كما أن العرض يعكس وجهة نظر مقدمه وخبرته المباشرة في CHERI، لا معياراً عاماً يضمن تلقائياً إزالة جميع مشكلات الأمان.