تحليل ثغرة تجاوز عدد صحيح في وحدة الأمان الخاصة بلغة Move
في الآونة الأخيرة، اكتشفنا ثغرة جديدة في تجاوز السعة في Aptos Moveevm من خلال بحثنا المتعمق. كانت عملية تفعيل هذه الثغرة مثيرة للاهتمام، وسنقوم أدناه بتحليل هذه الثغرة بشكل متعمق، ونستغل هذه الفرصة لاستكشاف بعض المفاهيم الأساسية في لغة Move.
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود، وتتم هذه العملية على أربع خطوات. تظهر الثغرة التي تم مناقشتها في هذه المقالة في خطوة reference_safety.
وحدة reference_safety مسؤولة بشكل رئيسي عن التحقق من سلامة الإشارات في الشيفرة، بما في ذلك التحقق مما إذا كانت هناك إشارات معلقة، وما إذا كان الوصول إلى الإشارات المتغيرة آمنًا، وما إذا كان الوصول إلى الإشارات في التخزين العالمي متوافقًا.
خلال عملية التحقق من الأمان، يقوم النظام بتحليل كل كتلة أساسية. الكتلة الأساسية تشير إلى تسلسل التعليمات البرمجية الذي لا يحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات. لغة Move تحدد الكتل الأساسية من خلال استعراض التعليمات البرمجية، والبحث عن جميع تعليمات الفروع وتسلسل تعليمات الحلقة.
يدعم لغة Move نوعين من الإشارات: الإشارة غير القابلة للتغيير (&) والإشارة القابلة للتغيير (&mut). تُستخدم الإشارة غير القابلة للتغيير لقراءة البيانات، بينما تُستخدم الإشارة القابلة للتغيير لتعديل البيانات. تساعد هذه التصميمات في تحسين أمان الشيفرة وقراءتها.
تشمل العملية الرئيسية للتحقق من أمان الإشارات: مسح الكتل الأساسية في الدالة، تحليل تعليمات بايت كود، وتحديد ما إذا كانت جميع عمليات الإشارة قانونية. تستخدم هذه العملية بنية AbstractState، التي تحتوي على رسم الاقتراض والمحليين، لضمان أمان الإشارات في الدالة.
خلال عملية التحقق، سيتم مقارنة حالة الكتلة الأساسية قبل وبعد التنفيذ (pre state و post state )، وسيتم دمج النتائج لتحديث حالة الكتلة. إذا تغيّرت الحالة وكان هناك حافة عكسية تشير إلى نفسها في الكتلة الحالية (مما يدل على وجود حلقة)، فسيتم إعادة تنفيذ الكتلة الأساسية حتى لا تتغيّر الحالة مرة أخرى أو يحدث خطأ.
تظهر الثغرة في عملية تحديد ما إذا كانت نتيجة الانضمام قد تغيرت. عندما يتجاوز مجموع طول معلمات الدالة وطول المتغيرات المحلية 256، قد يؤدي استخدام نوع u8 لتمثيل الفهرس المحلي إلى تجاوز سعة العدد. على الرغم من أن لغة Move تحتوي على عملية للتحقق من عدد المتغيرات المحلية، إلا أنها تحقق فقط في عدد المتغيرات المحلية، دون تضمين طول المعلمات.
يمكن أن تؤدي ثغرة تجاوز العدد الصحيح هذه إلى هجمات رفض الخدمة ( DoS ). يمكن للمهاجمين إنشاء كتلة كود دورية، مستغلين التجاوز لتغيير حالة الكتلة، مما يجعل خريطة locals الجديدة مختلفة عن السابقة. عند تنفيذ دالة execute_block مرة أخرى، إذا كان الفهرس الذي تحتاج التعليمات للوصول إليه غير موجود في خريطة AbstractState locals الجديدة، فسوف يؤدي ذلك إلى panic، مما يتسبب في انهيار العقدة بأكملها.
لتوضيح هذه الثغرة، نقدم إثبات مفهوم يمكن إعادة إنتاجه في git. يتضمن هذا الإثبات كتلة أساسية تحتوي على تعليمات فرعية غير مشروطة، مما يمكن من استدعاء دالة execute_block وjoin عدة مرات. من خلال إعداد المعلمات وعدد المتغيرات المحلية بعناية، يمكن تقليل طول خريطة locals الجديدة إلى 8، ثم يتم استدعاء panic عند التنفيذ الثاني.
تثبت هذه الثغرة مرة أخرى أنه لا يوجد كود آمن بشكل مطلق. على الرغم من أن لغة Move تخضع لفحص صارم ثابت قبل التنفيذ، إلا أنه لا يزال من الممكن تجاوزها بواسطة ثغرات تجاوز السعة. وهذا يبرز أهمية تدقيق الكود، بالإضافة إلى ضرورة إضافة فحوصات أمان في وقت التشغيل في تصميم اللغات.
كقادة في أبحاث أمان لغة 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.
تسجيلات الإعجاب 11
أعجبني
11
4
مشاركة
تعليق
0/400
LadderToolGuy
· 07-06 19:13
هناك العديد من أخطاء overflow حقًا
شاهد النسخة الأصليةرد0
MetaverseMigrant
· 07-06 17:57
مرة أخرى أشعر أنني عدت إلى عام 2021 عندما كنت أختبر Solana.
وجود ثغرة تجاوز عدد صحيح في وحدة الأمان لغة Move قد تؤدي إلى هجوم DoS
تحليل ثغرة تجاوز عدد صحيح في وحدة الأمان الخاصة بلغة Move
في الآونة الأخيرة، اكتشفنا ثغرة جديدة في تجاوز السعة في Aptos Moveevm من خلال بحثنا المتعمق. كانت عملية تفعيل هذه الثغرة مثيرة للاهتمام، وسنقوم أدناه بتحليل هذه الثغرة بشكل متعمق، ونستغل هذه الفرصة لاستكشاف بعض المفاهيم الأساسية في لغة Move.
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود، وتتم هذه العملية على أربع خطوات. تظهر الثغرة التي تم مناقشتها في هذه المقالة في خطوة reference_safety.
وحدة reference_safety مسؤولة بشكل رئيسي عن التحقق من سلامة الإشارات في الشيفرة، بما في ذلك التحقق مما إذا كانت هناك إشارات معلقة، وما إذا كان الوصول إلى الإشارات المتغيرة آمنًا، وما إذا كان الوصول إلى الإشارات في التخزين العالمي متوافقًا.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
خلال عملية التحقق من الأمان، يقوم النظام بتحليل كل كتلة أساسية. الكتلة الأساسية تشير إلى تسلسل التعليمات البرمجية الذي لا يحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات. لغة Move تحدد الكتل الأساسية من خلال استعراض التعليمات البرمجية، والبحث عن جميع تعليمات الفروع وتسلسل تعليمات الحلقة.
يدعم لغة Move نوعين من الإشارات: الإشارة غير القابلة للتغيير (&) والإشارة القابلة للتغيير (&mut). تُستخدم الإشارة غير القابلة للتغيير لقراءة البيانات، بينما تُستخدم الإشارة القابلة للتغيير لتعديل البيانات. تساعد هذه التصميمات في تحسين أمان الشيفرة وقراءتها.
تشمل العملية الرئيسية للتحقق من أمان الإشارات: مسح الكتل الأساسية في الدالة، تحليل تعليمات بايت كود، وتحديد ما إذا كانت جميع عمليات الإشارة قانونية. تستخدم هذه العملية بنية AbstractState، التي تحتوي على رسم الاقتراض والمحليين، لضمان أمان الإشارات في الدالة.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
خلال عملية التحقق، سيتم مقارنة حالة الكتلة الأساسية قبل وبعد التنفيذ (pre state و post state )، وسيتم دمج النتائج لتحديث حالة الكتلة. إذا تغيّرت الحالة وكان هناك حافة عكسية تشير إلى نفسها في الكتلة الحالية (مما يدل على وجود حلقة)، فسيتم إعادة تنفيذ الكتلة الأساسية حتى لا تتغيّر الحالة مرة أخرى أو يحدث خطأ.
تظهر الثغرة في عملية تحديد ما إذا كانت نتيجة الانضمام قد تغيرت. عندما يتجاوز مجموع طول معلمات الدالة وطول المتغيرات المحلية 256، قد يؤدي استخدام نوع u8 لتمثيل الفهرس المحلي إلى تجاوز سعة العدد. على الرغم من أن لغة Move تحتوي على عملية للتحقق من عدد المتغيرات المحلية، إلا أنها تحقق فقط في عدد المتغيرات المحلية، دون تضمين طول المعلمات.
يمكن أن تؤدي ثغرة تجاوز العدد الصحيح هذه إلى هجمات رفض الخدمة ( DoS ). يمكن للمهاجمين إنشاء كتلة كود دورية، مستغلين التجاوز لتغيير حالة الكتلة، مما يجعل خريطة locals الجديدة مختلفة عن السابقة. عند تنفيذ دالة execute_block مرة أخرى، إذا كان الفهرس الذي تحتاج التعليمات للوصول إليه غير موجود في خريطة AbstractState locals الجديدة، فسوف يؤدي ذلك إلى panic، مما يتسبب في انهيار العقدة بأكملها.
لتوضيح هذه الثغرة، نقدم إثبات مفهوم يمكن إعادة إنتاجه في git. يتضمن هذا الإثبات كتلة أساسية تحتوي على تعليمات فرعية غير مشروطة، مما يمكن من استدعاء دالة execute_block وjoin عدة مرات. من خلال إعداد المعلمات وعدد المتغيرات المحلية بعناية، يمكن تقليل طول خريطة locals الجديدة إلى 8، ثم يتم استدعاء panic عند التنفيذ الثاني.
تثبت هذه الثغرة مرة أخرى أنه لا يوجد كود آمن بشكل مطلق. على الرغم من أن لغة Move تخضع لفحص صارم ثابت قبل التنفيذ، إلا أنه لا يزال من الممكن تجاوزها بواسطة ثغرات تجاوز السعة. وهذا يبرز أهمية تدقيق الكود، بالإضافة إلى ضرورة إضافة فحوصات أمان في وقت التشغيل في تصميم اللغات.
كقادة في أبحاث أمان لغة Move، سنواصل دراسة قضايا الأمان المتعلقة بـ Move بعمق، ونقترح على مصممي اللغة إضافة المزيد من كود الفحص في وقت تشغيل Move لمنع حدوث حالات غير متوقعة. حاليًا، تجرى فحوصات الأمان بلغة Move بشكل رئيسي في مرحلة التحقق، ولكننا نعتقد أن ذلك غير كافٍ. بمجرد تجاوز التحقق، فإن نقص تعزيز الأمان الكافي في مرحلة التشغيل قد يؤدي إلى مشكلات أكثر خطورة.
! اكتشف Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة