
ثغرة سلامة الأنواع في Rust: التعيينات الحقلية المتغايرة تتجاوز حدود عمر 'static
تُظهر مشكلة Rust التي تم توثيقها مؤخراً أن تعيين حقل متغاير ينتهك قيد عمر 'static الخاص بالبنية، ويتيح لكود Drop اعتبار المراجع قصيرة الأمد ثابتة، ثم قراءة ذاكرة محذوفة.
الثغرة
تتيح ثغرة سلامة الأنواع في نظام أنواع Rust للكود تجاوز متطلب عمر 'static الخاص بالبنية من خلال تعيين حقل متغاير. وتؤثر المشكلة الموثقة باسم rust-lang/rust#164250 على البنية العامة Q<T: 'static + Send>، حيث يمكن تعيين مرجع لقيمة محلية قصيرة الأمد إلى حقلها. وبما أن الحقل متغاير، فإن عملية التعيين تُقبل حتى عندما لا تفي القيمة بقيد 'static. بعد ذلك، يتعامل تنفيذ Drop للبنية مع المرجع المخزن باعتباره 'static، مما قد يؤدي إلى قراءة ذاكرة المكدس المحررة بعد انتهاء النطاق.
التأثير والخطورة
يُجمَّع المُعيد الإنتاج على إصدارات nightly الحالية وإصدارات stable، وذلك على الأقل حتى الإصدار 1.85.0. وقال أحد المساهمين إن هذا النمط يُجمَّع منذ عام 2017 ومع Rust 1.18.0. بدون استخدام sanitizers، تطبع البرنامج محتوى سلسلة نصية محررة؛ ومع AddressSanitizer يتعطل بسبب خطأ stack-use-after-scope. وصنَّف المشرف lcnr المشكلة بدرجة P-high وليس P-critical، لأنها لم تُكتشف منذ 11 عاماً، ولأن استغلالها يتطلب تنفيذ Drop ضاراً بشكل متعمد، وليس استخداماً غير صحيح عرضياً.
الاستجابة
حصلت المشكلة على علامات تتعلق بـ borrow checker والمدمرات وأعمار المراجع والتغاير، وتتابعها Types Team. وأشار الفريق إلى أن تصحيح سلامة نظام الأنواع يُعد أولوية عالية، تماماً مثل العمل على الجيل التالي من trait solver وإعادة عمل معالجة قيود المناطق وProject Zero. وبعد ذكر المشكلة، تم دفع commit قريباً بعنوان «fix: رفض المقبضات في التخزين التجميعي على كلا الواجهتين الأماميتين». وقد تم حظر GitHub thread مؤقتاً وتقييده بالتعاونين فقط بعد أن أثار نقاشاً حاداً.
المصادر: Hacker News
SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي
نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.