تم اكتشاف ثغرة جديدة في تجاوز السعة العددية في آلية أمان الاستشهاد بلغة Move
مؤخراً، أثناء دراسة عميقة للغة Move، اكتشفنا ثغرة جديدة في تجاوز السعة العددية. تظهر هذه الثغرة أثناء عملية التحقق من الأمان المرجعية، وت涉及 بعض الآليات الأساسية للغة Move. من خلال تحليل هذه الثغرة، يمكننا فهم تصميم وتنفيذ لغة Move بشكل أعمق.
عملية التحقق في لغة Move
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود، وتنقسم هذه العملية إلى 4 خطوات. الثغرة التي تم اكتشافها هذه المرة تظهر في خطوة reference_safety.
تحدد وحدة reference_safety الوظائف الأساسية للتحقق من سلامة الاقتباسات. وهي تتحقق بشكل أساسي من وجود مراجع عائمة، وما إذا كانت الوصولات إلى المراجع المتغيرة آمنة، وما إذا كانت الوصولات إلى المراجع المخزنة عالميًا آمنة، وغيرها من القضايا.
ستقوم دالة المدخلات لعملية التحقق باستدعاء analyze_function لتحليل كل دالة. ستقوم analyze_function بالتحقق من كل كتلة أساسية داخل الدالة. الكتلة الأساسية تشير إلى تسلسل التعليمات البرمجية الذي لا يحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات.
تدعم لغة Move نوعين من المراجع: المرجع الثابت (&) والمرجع المتغير (&mut). يُستخدم المرجع الثابت لقراءة البيانات، بينما يُستخدم المرجع المتغير لتعديل البيانات. يساعد هذا التصميم في تحسين أمان الكود وقابليته للقراءة.
تقوم وحدة التحقق من الأمان بفحص تعليمات بايت الكود لكل كتلة أساسية في الوظيفة، وتحدد ما إذا كانت جميع عمليات الإشارة قانونية. تشمل عملية التحقق بشكل رئيسي:
تنفيذ كود الكتلة الأساسية
حالة التنفيذ قبل وبعد الدمج
تحديث حالة الكتلة
نشر الشروط اللاحقة إلى الكتل التالية
تشبه هذه العملية فكرة Sea of Nodes في V8 turbofan.
تحليل الثغرات
تظهر الثغرة في عملية حالة التنفيذ قبل وبعد الدمج. عندما يكون طول معلمات الدالة زائدًا طول المتغيرات المحلية أكبر من 256، فإن استخدام نوع u8 لتمثيل فهرس المتغيرات المحلية يؤدي إلى تجاوز عدد صحيح.
على الرغم من أن لغة Move تحتوي على عملية للتحقق من عدد المتغيرات المحلية، إلا أن هذا التحقق لا يشمل طول المعلمات. يبدو أن المطورين يدركون الحاجة إلى فحص مجموع المعلمات والمتغيرات المحلية، ولكن الكود الفعلي يتحقق فقط من عدد المتغيرات المحلية.
يمكن أن يؤدي هذا تجاوز عدد صحيح إلى هجوم رفض الخدمة (DoS). يمكن للمهاجم إنشاء كتلة رمز حلقي، مستغلاً التجاوز لتغيير حالة الكتلة. عندما يتم تنفيذ الكتلة الأساسية مرة أخرى، إذا كان الفهرس الذي تحتاج التعليمات للوصول إليه غير موجود في الحالة الجديدة، فسيتسبب ذلك في انهيار البرنامج.
استغلال الثغرات
لقد أنشأنا إثبات مفهوم ( PoC ) لإظهار هذه الثغرة:
إنشاء كتلة أساسية تحتوي على تعليمات فرعية غير مشروطة، مما يجعلها تنفذ عدة مرات.
تعيين عدد المعلمات والمتغيرات المحلية إلى 264، مما أدى إلى تجاوز طول خريطة المتغيرات المحلية الجديدة إلى 8.
عند تنفيذ الكتلة الأساسية مرة أخرى، حاول الوصول إلى فهرس متغير محلي غير موجود، مما يسبب panic.
هذه الثغرة تثبت مرة أخرى أنه لا يوجد كود آمن بشكل مطلق. على الرغم من أن لغة Move قد أجرت تحققًا ثابتًا قبل التنفيذ، إلا أنه لا يزال من الممكن تجاوزها من خلال ثغرات تجاوز السعة العددية.
بالنسبة للتطور المستقبلي للغة Move، نقترح:
إضافة المزيد من كود التحقق أثناء التشغيل لمنع حدوث حالات غير متوقعة.
لا تعتمد فقط على فحص الأمان في مرحلة التحقق، بل يجب أيضًا تعزيز الأمان خلال مرحلة التشغيل.
بصفتنا روادًا في بحث أمان لغة Move، سنواصل دراسة مشكلات الأمان في Move بعمق، وسنساهم في تطويرها.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
تسجيلات الإعجاب 16
أعجبني
16
3
مشاركة
تعليق
0/400
SnapshotLaborer
· منذ 10 س
هل ذهبت للإبلاغ عن الأخطاء بعد خمس دقائق من التعلم؟
تم اكتشاف ثغرة جديدة في تجاوز السعة العددية في التحقق من الأمان في لغة Move
تم اكتشاف ثغرة جديدة في تجاوز السعة العددية في آلية أمان الاستشهاد بلغة Move
مؤخراً، أثناء دراسة عميقة للغة Move، اكتشفنا ثغرة جديدة في تجاوز السعة العددية. تظهر هذه الثغرة أثناء عملية التحقق من الأمان المرجعية، وت涉及 بعض الآليات الأساسية للغة Move. من خلال تحليل هذه الثغرة، يمكننا فهم تصميم وتنفيذ لغة Move بشكل أعمق.
عملية التحقق في لغة Move
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود، وتنقسم هذه العملية إلى 4 خطوات. الثغرة التي تم اكتشافها هذه المرة تظهر في خطوة reference_safety.
تحدد وحدة reference_safety الوظائف الأساسية للتحقق من سلامة الاقتباسات. وهي تتحقق بشكل أساسي من وجود مراجع عائمة، وما إذا كانت الوصولات إلى المراجع المتغيرة آمنة، وما إذا كانت الوصولات إلى المراجع المخزنة عالميًا آمنة، وغيرها من القضايا.
ستقوم دالة المدخلات لعملية التحقق باستدعاء analyze_function لتحليل كل دالة. ستقوم analyze_function بالتحقق من كل كتلة أساسية داخل الدالة. الكتلة الأساسية تشير إلى تسلسل التعليمات البرمجية الذي لا يحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
أمان الإشارة في لغة Move
تدعم لغة Move نوعين من المراجع: المرجع الثابت (&) والمرجع المتغير (&mut). يُستخدم المرجع الثابت لقراءة البيانات، بينما يُستخدم المرجع المتغير لتعديل البيانات. يساعد هذا التصميم في تحسين أمان الكود وقابليته للقراءة.
تقوم وحدة التحقق من الأمان بفحص تعليمات بايت الكود لكل كتلة أساسية في الوظيفة، وتحدد ما إذا كانت جميع عمليات الإشارة قانونية. تشمل عملية التحقق بشكل رئيسي:
تشبه هذه العملية فكرة Sea of Nodes في V8 turbofan.
تحليل الثغرات
تظهر الثغرة في عملية حالة التنفيذ قبل وبعد الدمج. عندما يكون طول معلمات الدالة زائدًا طول المتغيرات المحلية أكبر من 256، فإن استخدام نوع u8 لتمثيل فهرس المتغيرات المحلية يؤدي إلى تجاوز عدد صحيح.
على الرغم من أن لغة Move تحتوي على عملية للتحقق من عدد المتغيرات المحلية، إلا أن هذا التحقق لا يشمل طول المعلمات. يبدو أن المطورين يدركون الحاجة إلى فحص مجموع المعلمات والمتغيرات المحلية، ولكن الكود الفعلي يتحقق فقط من عدد المتغيرات المحلية.
يمكن أن يؤدي هذا تجاوز عدد صحيح إلى هجوم رفض الخدمة (DoS). يمكن للمهاجم إنشاء كتلة رمز حلقي، مستغلاً التجاوز لتغيير حالة الكتلة. عندما يتم تنفيذ الكتلة الأساسية مرة أخرى، إذا كان الفهرس الذي تحتاج التعليمات للوصول إليه غير موجود في الحالة الجديدة، فسيتسبب ذلك في انهيار البرنامج.
استغلال الثغرات
لقد أنشأنا إثبات مفهوم ( PoC ) لإظهار هذه الثغرة:
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
الاستنتاج
هذه الثغرة تثبت مرة أخرى أنه لا يوجد كود آمن بشكل مطلق. على الرغم من أن لغة Move قد أجرت تحققًا ثابتًا قبل التنفيذ، إلا أنه لا يزال من الممكن تجاوزها من خلال ثغرات تجاوز السعة العددية.
بالنسبة للتطور المستقبلي للغة Move، نقترح:
بصفتنا روادًا في بحث أمان لغة Move، سنواصل دراسة مشكلات الأمان في Move بعمق، وسنساهم في تطويرها.