تحليل ثغرات تجاوز السعة في التحقق من الأمان في لغة Move
مؤخراً، اكتشف الباحثون ثغرة جديدة في تجاوز السعة العددية أثناء تحليل عميق لـ Aptos Moveevm. هذه الثغرة موجودة في عملية التحقق من أمان الإشارة في لغة Move، وهي تتعلق بخطوة reference_safety. ستتناول هذه المقالة هذه الثغرة بالتفصيل، وتشرح كيفية تفعيلها وآثارها المحتملة.
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ الشيفرة البايتية، وتنقسم هذه العملية إلى 4 خطوات. تم اكتشاف الثغرة في خطوة reference_safety. الهدف من هذه الخطوة هو التحقق من أمان الإشارات، بما في ذلك التحقق من وجود إشارات معلقة، وما إذا كان الوصول إلى الإشارات المتغيرة آمنا، وما إذا كان الوصول إلى إشارات التخزين العالمية آمنا، وغيرها.
تبدأ عملية التحقق بالتعرف على الكتل الأساسية. في لغة Move، يتم تحديد الكتل الأساسية من خلال استكشاف التعليمات البرمجية، والبحث عن جميع تسلسلات التعليمات الفرعية وتعليمات الحلقات. كل كتلة أساسية هي جزء من سلسلة التعليمات البرمجية التي لا تحتوي على تعليمات فرعية باستثناء مدخلاتها ومخرجاتها.
آلية التحقق من الأمان للإقتباس
يدعم لغة Move نوعين من الإشارات: الإشارة الثابتة (&) والإشارة المتغيرة (&mut). ستقوم وحدة التحقق من سلامة الإشارات بفحص تعليمات بايت الكتل الأساسية في كل دالة، وتحديد ما إذا كانت جميع عمليات الإشارة قانونية.
تستخدم عملية التحقق هيكل AbstractState لتمثيل الحالة، والذي يتضمن مكونين رئيسيين: رسم الاقتراض والمحليين. أثناء التحقق، يتم مقارنة التغيرات في الحالة قبل وبعد تنفيذ الكتل الأساسية، ويتم نشر النتائج إلى الكتل التالية.
تفاصيل الثغرة
يوجد ثغرة في دالة join_. تُستخدم هذه الدالة لدمج حالة الكتل الأساسية قبل وبعد التنفيذ. تكمن المشكلة في طريقة iter_locals()، التي تعيد مُكررًا من نوع u8. عندما يتجاوز مجموع طول معلمات الدالة وطول المتغيرات المحلية 256، فإنه يؤدي إلى تجاوز سعة العدد.
على الرغم من أن لغة Move تحتوي على عملية التحقق من عدد المتغيرات المحلية، إلا أنها تتحقق فقط من عدد المتغيرات المحلية، دون تضمين طول المعاملات. قد يكون هذا إغفالا من المطورين.
باستخدام ثغرة تجاوز السعة الصحيحة هذه، يمكن للمهاجمين بناء كتل كود حلقات خاصة، وتغيير حالة الكتلة. عند تنفيذ الكتلة الأساسية مرة أخرى، إذا كان الفهرس الذي تصل إليه التعليمات غير موجود في خريطة المتغيرات المحلية الجديدة، فسوف يؤدي ذلك إلى رفض الخدمة (DoS).
بشكل أكثر تحديدًا، قد تؤدي التعليمات البرمجية مثل MoveLoc/CopyLoc/FreeRef في وحدة مرجعية الأمان إلى حدوث panic بسبب الوصول إلى LocalIndex غير موجود، مما يتسبب في تعطل العقدة بأكملها.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 21
أعجبني
21
9
مشاركة
تعليق
0/400
LiquidationWatcher
· 07-07 17:46
يا إلهي، استغلال آخر في التمويل اللامركزي... يجعلني أسترجع ذكريات 2022 بشكل كبير الآن
شاهد النسخة الأصليةرد0
BearMarketSunriser
· 07-07 02:16
MOVE بارد ، من الأفضل قلي A بدلا من قلي B
شاهد النسخة الأصليةرد0
SundayDegen
· 07-06 08:36
تسلم، هذه المشكلة فعلاً بسيطة نوعًا ما.
شاهد النسخة الأصليةرد0
MoonRocketman
· 07-05 04:47
ارتفاع الاعتراض لـ Move 256 قد فقد السيطرة، احذر من مخاطر سقوط الصواريخ
شاهد النسخة الأصليةرد0
Web3ProductManager
· 07-05 04:47
عند النظر إلى بيانات تحويل القمع، فإن خطأ الفائض هذا = احتكاك كبير في تجربة المستخدم بصراحة
تحليل ثغرة تجاوز السعة الصحيحة في لغة Move
تحليل ثغرات تجاوز السعة في التحقق من الأمان في لغة Move
مؤخراً، اكتشف الباحثون ثغرة جديدة في تجاوز السعة العددية أثناء تحليل عميق لـ Aptos Moveevm. هذه الثغرة موجودة في عملية التحقق من أمان الإشارة في لغة Move، وهي تتعلق بخطوة reference_safety. ستتناول هذه المقالة هذه الثغرة بالتفصيل، وتشرح كيفية تفعيلها وآثارها المحتملة.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
عملية التحقق بلغة Move
تقوم لغة Move بالتحقق من وحدات الكود قبل تنفيذ الشيفرة البايتية، وتنقسم هذه العملية إلى 4 خطوات. تم اكتشاف الثغرة في خطوة reference_safety. الهدف من هذه الخطوة هو التحقق من أمان الإشارات، بما في ذلك التحقق من وجود إشارات معلقة، وما إذا كان الوصول إلى الإشارات المتغيرة آمنا، وما إذا كان الوصول إلى إشارات التخزين العالمية آمنا، وغيرها.
تبدأ عملية التحقق بالتعرف على الكتل الأساسية. في لغة Move، يتم تحديد الكتل الأساسية من خلال استكشاف التعليمات البرمجية، والبحث عن جميع تسلسلات التعليمات الفرعية وتعليمات الحلقات. كل كتلة أساسية هي جزء من سلسلة التعليمات البرمجية التي لا تحتوي على تعليمات فرعية باستثناء مدخلاتها ومخرجاتها.
آلية التحقق من الأمان للإقتباس
يدعم لغة Move نوعين من الإشارات: الإشارة الثابتة (&) والإشارة المتغيرة (&mut). ستقوم وحدة التحقق من سلامة الإشارات بفحص تعليمات بايت الكتل الأساسية في كل دالة، وتحديد ما إذا كانت جميع عمليات الإشارة قانونية.
تستخدم عملية التحقق هيكل AbstractState لتمثيل الحالة، والذي يتضمن مكونين رئيسيين: رسم الاقتراض والمحليين. أثناء التحقق، يتم مقارنة التغيرات في الحالة قبل وبعد تنفيذ الكتل الأساسية، ويتم نشر النتائج إلى الكتل التالية.
تفاصيل الثغرة
يوجد ثغرة في دالة join_. تُستخدم هذه الدالة لدمج حالة الكتل الأساسية قبل وبعد التنفيذ. تكمن المشكلة في طريقة iter_locals()، التي تعيد مُكررًا من نوع u8. عندما يتجاوز مجموع طول معلمات الدالة وطول المتغيرات المحلية 256، فإنه يؤدي إلى تجاوز سعة العدد.
على الرغم من أن لغة Move تحتوي على عملية التحقق من عدد المتغيرات المحلية، إلا أنها تتحقق فقط من عدد المتغيرات المحلية، دون تضمين طول المعاملات. قد يكون هذا إغفالا من المطورين.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
استغلال الثغرات وتأثيرها
باستخدام ثغرة تجاوز السعة الصحيحة هذه، يمكن للمهاجمين بناء كتل كود حلقات خاصة، وتغيير حالة الكتلة. عند تنفيذ الكتلة الأساسية مرة أخرى، إذا كان الفهرس الذي تصل إليه التعليمات غير موجود في خريطة المتغيرات المحلية الجديدة، فسوف يؤدي ذلك إلى رفض الخدمة (DoS).
بشكل أكثر تحديدًا، قد تؤدي التعليمات البرمجية مثل MoveLoc/CopyLoc/FreeRef في وحدة مرجعية الأمان إلى حدوث panic بسبب الوصول إلى LocalIndex غير موجود، مما يتسبب في تعطل العقدة بأكملها.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
ملخص وتوصيات
تثبت هذه الثغرة مرة أخرى أنه حتى اللغات المصممة بعناية قد تحتوي على مخاطر أمنية. بالنسبة للغة Move، نوصي بـ:
باعتبارنا رواد البحث في أمان لغة Move، سنستمر في استكشاف القضايا الأمنية ذات الصلة بعمق، ونساهم في التنمية الصحية لنظام Move البيئي.