تحليل ثغرة تجاوز السعة في التحقق من الأمان في لغة Move
مؤخراً، أثناء بحثنا المتعمق في لغة Move، اكتشفنا ثغرة جديدة في تجاوز الأعداد الصحيحة. هذه الثغرة موجودة في عملية التحقق من سلامة المرجع، وطريقة تنشيطها مثيرة للاهتمام. ستقوم هذه المقالة بتحليل هذه الثغرة بعمق، واستكشاف بعض المعلومات الخلفية المتعلقة بلغة Move.
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود ، وتنقسم إلى أربع خطوات. تظهر هذه الثغرة في خطوة reference_safety.
تعرّف وحدة التحقق من الأمان وظيفة التحويل المستخدمة للتحقق من أمان المرجع لهيكل العملية. تشمل محتويات الفحص التحقق من عدم وجود مراجع معلقة، وما إذا كان الوصول إلى المراجع القابلة للتغيير آمناً، وما إذا كان الوصول إلى مراجع التخزين العالمية آمناً، وغيرها.
تستدعي دالة مدخل التحقق من الأمان دالة analyze_function للتحقق من كل كتلة أساسية. الكتلة الأساسية هي تسلسل من التعليمات البرمجية لا تحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات. تحدد لغة Move الكتل الأساسية من خلال استعراض الشيفرة الثنائية والبحث عن جميع تعليمات الفرع وتعليمات الحلقة.
تدعم لغة Move نوعين من المراجع: المراجع غير القابلة للتغيير & والمراجع القابلة للتغيير &mut. تُستخدم المراجع غير القابلة للتغيير لقراءة البيانات، بينما تُستخدم المراجع القابلة للتغيير لتعديل البيانات. يساعد الاستخدام المعقول لنوع المرجع على الحفاظ على الأمان والتعرف على وحدات القراءة.
ستقوم وحدة التحقق من الأمان بفحص التعليمات البرمجية للبايت في الكتل الأساسية داخل الدوال، والتحقق من أن جميع عمليات الإشارة قانونية. تتعلق عملية التحقق بشكل أساسي ببنية AbstractState، والتي تحتوي على رسم الاقتراض والمحليين، لضمان سلامة الإشارات داخل الدالة.
خلال عملية التحقق، سيتم مقارنة حالة التنفيذ قبل وبعد الكتلة الأساسية، من خلال ما إذا كان join_result قد تغير لدمج الحالة السابقة والحالة اللاحقة. إذا حدث تغيير وكان هناك حافة عكسية تشير إلى نفسها في الكتلة الحالية (مما يشير إلى وجود حلقة)، فسيتم العودة إلى بداية الحلقة، والاستمرار في تنفيذ تلك الكتلة الأساسية، حتى تتساوى الحالة اللاحقة مع الحالة السابقة أو يتم الإنهاء بسبب خطأ.
تظهر الثغرة أثناء عملية判断 ما إذا كانت نتيجة الانضمام قد تغيرت. عندما يكون مجموع طول المعلمات وطول المتغيرات المحلية أكبر من 256، فإن استخدام نوع u8 لتكرار المتغيرات المحلية يؤدي إلى تجاوز عدد صحيح. على الرغم من أن Move لديه عملية للتحقق من عدد المتغيرات المحلية، إلا أن وحدة التحقق من الحدود تحقق فقط من المتغيرات المحلية، دون تضمين طول المعلمات.
يمكن أن تتسبب ثغرة تجاوز عدد صحيح هذه في هجمات الحرمان من الخدمة (DoS). يمكن للمهاجمين بناء كتل كود متكررة واستغلال التجاوز لتغيير حالة الكتلة، مما يجعل خريطة locals الجديدة مختلفة عن السابقة. عند تنفيذ دالة execute_block مرة أخرى، ستؤدي تحليل تسلسل تعليمات بايت كود في الكتلة الأساسية إلى الوصول إلى خريطة locals الجديدة. إذا كان المؤشر الذي تحتاج التعليمات للوصول إليه غير موجود في خريطة AbstractState locals الجديدة، فسيؤدي ذلك إلى DoS.
للتحقق من هذه الثغرة، يمكن إعادة إنتاج PoC في git. تحتوي كتلة التعليمات البرمجية في PoC على تعليمات فرعية غير مشروطة، حيث يتم القفز إلى التعليمات الأولى في كل مرة يتم فيها تنفيذ التعليمات الأخيرة، مما يؤدي إلى استدعاء دوال execute_block و join عدة مرات.
تظهر هذه الثغرة أنه حتى اللغات التي تركز على الأمان مثل Move قد تحتوي على مخاطر أمنية. إنها تؤكد على أهمية تدقيق الكود، وفي الوقت نفسه توصي مصممي لغة Move بزيادة المزيد من فحوصات الكود أثناء وقت التشغيل لمنع حدوث حالات غير متوقعة. حاليًا، يتم إجراء فحوصات الأمان بشكل رئيسي في مرحلة التحقق، ولكن بمجرد تجاوز التحقق، فإن نقص التعزيز الأمني الكافي في مرحلة التشغيل قد يؤدي إلى مشاكل أكثر خطورة.
بصفتنا رواد البحث في أمان لغة Move، سنواصل دراسة قضايا الأمان المتعلقة بـ Move بعمق وسنشارك المزيد من الاكتشافات في المستقبل.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 20
أعجبني
20
6
مشاركة
تعليق
0/400
BagHolderTillRetire
· 07-22 09:41
هذه المشكلة حقًا مدهشة، تدفق زاد عن حده مما تسبب في تعطل النظام.
شاهد النسخة الأصليةرد0
MetaverseVagabond
· 07-21 19:40
ثغرة الفائض عادت مرة أخرى، مؤسف
شاهد النسخة الأصليةرد0
HeavenAndEarthAreBle
· 07-20 02:27
تبا لها
شاهد النسخة الأصليةرد0
MemeTokenGenius
· 07-20 00:50
أوه، هذا الخطأ حقا انفجر
شاهد النسخة الأصليةرد0
GamefiHarvester
· 07-20 00:43
لا تصلح في الوقت المناسب؟ احترس يا حمقى، سأخدع الناس لتحقيق الربح.
تم اكتشاف ثغرة جديدة في تجاوز السعة الصحيحة في التحقق من الأمان في لغة Move.
تحليل ثغرة تجاوز السعة في التحقق من الأمان في لغة Move
مؤخراً، أثناء بحثنا المتعمق في لغة Move، اكتشفنا ثغرة جديدة في تجاوز الأعداد الصحيحة. هذه الثغرة موجودة في عملية التحقق من سلامة المرجع، وطريقة تنشيطها مثيرة للاهتمام. ستقوم هذه المقالة بتحليل هذه الثغرة بعمق، واستكشاف بعض المعلومات الخلفية المتعلقة بلغة Move.
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ بايت كود ، وتنقسم إلى أربع خطوات. تظهر هذه الثغرة في خطوة reference_safety.
تعرّف وحدة التحقق من الأمان وظيفة التحويل المستخدمة للتحقق من أمان المرجع لهيكل العملية. تشمل محتويات الفحص التحقق من عدم وجود مراجع معلقة، وما إذا كان الوصول إلى المراجع القابلة للتغيير آمناً، وما إذا كان الوصول إلى مراجع التخزين العالمية آمناً، وغيرها.
تستدعي دالة مدخل التحقق من الأمان دالة analyze_function للتحقق من كل كتلة أساسية. الكتلة الأساسية هي تسلسل من التعليمات البرمجية لا تحتوي على تعليمات فرعية باستثناء المدخلات والمخرجات. تحدد لغة Move الكتل الأساسية من خلال استعراض الشيفرة الثنائية والبحث عن جميع تعليمات الفرع وتعليمات الحلقة.
تدعم لغة Move نوعين من المراجع: المراجع غير القابلة للتغيير & والمراجع القابلة للتغيير &mut. تُستخدم المراجع غير القابلة للتغيير لقراءة البيانات، بينما تُستخدم المراجع القابلة للتغيير لتعديل البيانات. يساعد الاستخدام المعقول لنوع المرجع على الحفاظ على الأمان والتعرف على وحدات القراءة.
ستقوم وحدة التحقق من الأمان بفحص التعليمات البرمجية للبايت في الكتل الأساسية داخل الدوال، والتحقق من أن جميع عمليات الإشارة قانونية. تتعلق عملية التحقق بشكل أساسي ببنية AbstractState، والتي تحتوي على رسم الاقتراض والمحليين، لضمان سلامة الإشارات داخل الدالة.
خلال عملية التحقق، سيتم مقارنة حالة التنفيذ قبل وبعد الكتلة الأساسية، من خلال ما إذا كان join_result قد تغير لدمج الحالة السابقة والحالة اللاحقة. إذا حدث تغيير وكان هناك حافة عكسية تشير إلى نفسها في الكتلة الحالية (مما يشير إلى وجود حلقة)، فسيتم العودة إلى بداية الحلقة، والاستمرار في تنفيذ تلك الكتلة الأساسية، حتى تتساوى الحالة اللاحقة مع الحالة السابقة أو يتم الإنهاء بسبب خطأ.
تظهر الثغرة أثناء عملية判断 ما إذا كانت نتيجة الانضمام قد تغيرت. عندما يكون مجموع طول المعلمات وطول المتغيرات المحلية أكبر من 256، فإن استخدام نوع u8 لتكرار المتغيرات المحلية يؤدي إلى تجاوز عدد صحيح. على الرغم من أن Move لديه عملية للتحقق من عدد المتغيرات المحلية، إلا أن وحدة التحقق من الحدود تحقق فقط من المتغيرات المحلية، دون تضمين طول المعلمات.
يمكن أن تتسبب ثغرة تجاوز عدد صحيح هذه في هجمات الحرمان من الخدمة (DoS). يمكن للمهاجمين بناء كتل كود متكررة واستغلال التجاوز لتغيير حالة الكتلة، مما يجعل خريطة locals الجديدة مختلفة عن السابقة. عند تنفيذ دالة execute_block مرة أخرى، ستؤدي تحليل تسلسل تعليمات بايت كود في الكتلة الأساسية إلى الوصول إلى خريطة locals الجديدة. إذا كان المؤشر الذي تحتاج التعليمات للوصول إليه غير موجود في خريطة AbstractState locals الجديدة، فسيؤدي ذلك إلى DoS.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
للتحقق من هذه الثغرة، يمكن إعادة إنتاج PoC في git. تحتوي كتلة التعليمات البرمجية في PoC على تعليمات فرعية غير مشروطة، حيث يتم القفز إلى التعليمات الأولى في كل مرة يتم فيها تنفيذ التعليمات الأخيرة، مما يؤدي إلى استدعاء دوال execute_block و join عدة مرات.
تظهر هذه الثغرة أنه حتى اللغات التي تركز على الأمان مثل Move قد تحتوي على مخاطر أمنية. إنها تؤكد على أهمية تدقيق الكود، وفي الوقت نفسه توصي مصممي لغة Move بزيادة المزيد من فحوصات الكود أثناء وقت التشغيل لمنع حدوث حالات غير متوقعة. حاليًا، يتم إجراء فحوصات الأمان بشكل رئيسي في مرحلة التحقق، ولكن بمجرد تجاوز التحقق، فإن نقص التعزيز الأمني الكافي في مرحلة التشغيل قد يؤدي إلى مشاكل أكثر خطورة.
بصفتنا رواد البحث في أمان لغة Move، سنواصل دراسة قضايا الأمان المتعلقة بـ Move بعمق وسنشارك المزيد من الاكتشافات في المستقبل.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة