HeadlinesBriefing HeadlinesBriefing.com

تجاوز عمر Rust عبر الإسناد المتغاير

Hacker News •
×

يصف تقرير على Hacker News خللاً في سلامة (soundness) لغة Rust يمكن من خلاله تجاوز متطلبات عمر البنية عبر إسناد الحقول المتغاير. يشارك المُبلِّغ برنامجاً صغيراً يستخدم نوع غلاف، هو Q<T>، يحتوي على Option<T> مع تنفيذ Drop. ينقل تنفيذ Drop القيمة المحتواة إلى Mutex<Vec<Box<dyn Any + Send>>> ثابت، وهو ما كان يجب أن يكون مستحيلاً بالنسبة لقيمة مستعارة لا تعيش لمدة 'static.

في المثال، يُسنَد String محلي بالمرجع إلى الغلاف داخل نطاق داخلي، لذا كان ينبغي أن ينتهي الاستعارة عند إغلاق ذلك النطاق. ولأن حقل الغلاف متغاير، يقبل المترجم الإسناد، ويمكن بعدها تخزين المرجع خارج عمر المتغير المحلي. يُترجَم البرنامج وينتج بدلاً من الرفض طباعة محتويات ذاكرة غير ذات صلة.

عند تشغيله تحت AddressSanitizer، ينهار البرنامج بخطأ stack-use-after-scope، ما يؤكد أن المرجع المتدلي يُلغى مرجعه فعلاً. وبحسب التقرير، يمكن إعادة إنتاج المشكلة في إصدارات nightly الحالية، وكذلك في الإصدارات المستقرة حتى 1.85.0 على الأقل. ويرفق المنشور روابط لأمثلة في Compiler Explorer مع المدقّقات وبدونها.

يشير هذا الاكتشاف إلى ثغرة في السلامة تتعلق بكيفية تفاعل التغاير مع التخزين القائم على Drop، وهو نوع من المشكلات التي يتعامل معها مطورو Rust بأولوية عالية، لأن الشيفرة الآمنة لا ينبغي أبداً أن تُنتج سلوكاً غير معرّف.

أسئلة شائعة: لماذا يُترجَم برنامج Rust هذا رغم وجود مرجع متدلٍّ؟

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

المصدر: Hacker News · لخّصه HeadlinesBriefing