تدمج سلسلة Pixel 10 للمرة الأولى في أجهزة Pixel مكوّناً مكتوباً بلغة Rust الآمنة للذاكرة داخل برمجيات المودم الخلوي، بحسب منشور على مدونة Google Security Blog. وتتمثل الخطوة في إدخال محلل لنظام أسماء النطاقات (DNS) مبني على Rust إلى البرنامج الثابت للمودم، بهدف تقليل مخاطر الثغرات المرتبطة بسلامة الذاكرة في جزء يتعامل مع بيانات غير موثوقة.
تأتي هذه الخطوة ضمن جهود Google لتقوية مودم الاتصالات الخلوية ضد الاستغلال. وكانت الشركة قد زودت Pixel 9 بتخفيفات ضد مجموعة من ثغرات سلامة الذاكرة، لكنها ترى أن تعقيد البرنامج الثابت للمودم واتساع سطح هجومه يستدعيان إجراءات استباقية إضافية. وذكرت Google أن Project Zero تمكن في وقت سابق من الوصول إلى تنفيذ تعليمات برمجية عن بُعد على مودمات Pixel عبر الإنترنت، فيما يحتوي مودم Pixel على عشرات الميغابايتات من التعليمات البرمجية القابلة للتنفيذ.
لماذا اختارت Google محلل DNS؟
لا يقتصر استخدام DNS على مساعدة المتصفحات في العثور على مواقع الويب. فمع انتقال الاتصالات الخلوية الحديثة إلى شبكات البيانات الرقمية، تعتمد عمليات أساسية مثل تحويل المكالمات أيضاً على خدمات DNS. ويحتاج هذا البروتوكول المعقد إلى تحليل بيانات قد تكون غير موثوقة، ما يجعله نقطة حساسة عندما يُنفذ باستخدام لغة تفتقر إلى حماية الذاكرة، وهو نوع من المخاطر ارتبط، وفق المنشور، بالثغرة CVE-2024-27227.
قيّمت Google عدة حزم مفتوحة المصدر لتطبيق DNS في Rust، واختارت مكتبة hickory-proto استناداً إلى مستوى صيانتها، وتغطية اختبارات تتجاوز 75%، وانتشارها في مجتمع Rust. وكانت المكتبة تفتقر في البداية إلى دعم no_std المطلوب للبيئات محدودة الموارد أو العاملة دون نظام تشغيل، لذلك أضافت Google هذا الدعم إلى المكتبة وبعض تبعياتها. وأسفر العمل أيضاً عن دعم no_std لمحلل عناوين URL في مشروع rust-url.
كلفة الحجم والتكامل مع البرنامج القائم
أظهرت دراسة الحجم أن المكوّن الوسيط المكتوب بـRust يستهلك 4 كيلوبايت، بينما تحتاج مكونات core وalloc وcompiler_builtins إلى 17 كيلوبايت، وتستهلك مكتبة hickory-proto وتبعياتها 350 كيلوبايت، بإجمالي يبلغ 371 كيلوبايت. وترى Google أن حجم ذاكرة مودم Pixel لا يفرض قيوداً صارمة، لذلك فضّلت دعم المجتمع وجودة الشيفرة على تحسين الحجم في هذه المرحلة. لكنها أشارت إلى أن الزيادة قد تمثل عائقاً أمام أنظمة مدمجة أخرى، ويمكن تقليصها مستقبلاً عبر خيارات ترجمة تستبعد الوظائف غير المطلوبة.
ولدمج Rust في قاعدة الشيفرة الحالية المكتوبة بـC وC++، استخدم الفريق اختبارات وحدات للتحقق من العمليات الحسابية الأساسية، والتخصيص الديناميكي للذاكرة، وواجهات الربط بين اللغات. كما اختار دمج خطوات ترجمة Rust مباشرة في نظام البناء الحالي بدلاً من إنشاء مكتبات ثابتة منفصلة عبر Cargo، لأن هذا النهج أسهل في التوسع مع إضافة مكونات Rust أخرى ويقلل احتمال تعارض الرموز.
يعتمد نظام البناء الأساسي على Pigweed، بينما استُخدمت واجهات FFI لربط نظام تخصيص الذاكرة الموجود في البرنامج الثابت بمكوّن alloc في Rust، وكذلك لتوحيد معالجة حالات الانهيار بين Rust وC/C++. وعند الربط ظهرت مشكلة أداء واستهلاك طاقة بسبب استبدال تطبيقات modem المحسّنة للدالتين memset وmemcpy بتطبيقات واردة من compiler_builtins. وعالج الفريق المشكلة بإزالة ملفات compiler_builtins من المكتبة الثابتة قبل مرحلة الربط.
واجهة DNS وخطوة لاحقة
عرّفت Google واجهة برمجية بلغة C لمعالجة استجابات DNS، ثم نفذتها في Rust. وبعد تحليل الاستجابة، يستدعي المكوّن دوال C القائمة لتحديث هياكل البيانات المستخدمة في البرنامج الأصلي. واستُخدمت أداة bindgen لتوليد شيفرة الربط اللازمة لعمليات التحويل المعقدة بين أنواع البيانات.
وبحسب Google، تمثل سلسلة Pixel 10 نقطة مهمة لأنها أول أجهزة Pixel تدمج لغة آمنة للذاكرة داخل المودم. ولا يقتصر الهدف على استبدال محلل واحد؛ إذ ترى الشركة أن المشروع يضع أساساً لإدخال محللات ومكونات أخرى مكتوبة بلغات آمنة للذاكرة إلى قاعدة الاتصالات الخلوية مستقبلاً.