بعد دراسة متعمقة للغة Move، اكتشفنا ثغرة جديدة في تجاوز عدد صحيح. تحدث هذه الثغرة خلال مرحلة التحقق من أمان المراجع في عملية التحقق من بايت كود لغة Move. ستقوم هذه المقالة بتحليل مفصل لعملية تنشيط هذه الثغرة، وتستكشف بعض المفاهيم الأساسية في لغة Move.
عملية التحقق من بايت كود لغة Move
تقوم لغة Move بالتحقق من الشيفرة قبل تنفيذ التعليمات البرمجية، وتنقسم إلى 4 خطوات. حدثت الثغرة في خطوة reference_safety. هذه الخطوة مسؤولة بشكل رئيسي عن التحقق من أمان الإشارات، بما في ذلك التحقق من عدم وجود إشارات معلقة، وما إذا كانت الوصولات المتغيرة آمنة.
تبدأ عملية التحقق بالتعرف على الكتل الأساسية في الكود. الكتل الأساسية هي تسلسل من التعليمات البرمجية التي لا تحتوي على تعليمات تفرع باستثناء المدخلات والمخرجات. يقوم Move بتحديد الكتل الأساسية من خلال استعراض بايت الكود، والبحث عن جميع تعليمات التفرع وتعليمات الحلقة.
أمان الإشارة في Move
تدعم Move نوعين من المراجع: المراجع الثابتة (&) والمراجع المتغيرة (&mut). ستقوم وحدة أمان المراجع بفحص تعليمات بايت كود لكل كتلة أساسية في الدالة، للتحقق من أن جميع عمليات الإشارة قانونية.
تستخدم عملية التحقق هيكل AbstractState لتمثيل الحالة، والذي يتضمن مخطط الاقتراض والمحلّيات. أثناء التحقق، تتم مقارنة الحالة قبل وبعد التنفيذ، ويتم دمج تحديث حالة الكتلة.
تحليل الثغرات
تظهر الثغرة في دالة join_. تُستخدم هذه الدالة لدمج الحالة قبل وبعد التنفيذ، وتحديث خريطة locals ورسم الاقتراض. المشكلة تكمن في أن مُكرّر locals يُرجع نوع u8، وعندما يتجاوز مجموع طول المعاملات وطول المتغيرات المحلية 256، سيحدث تجاوز.
على الرغم من أن Move لديها عملية للتحقق من عدد المتغيرات المحلية، إلا أنها تتحقق فقط من عدد المتغيرات المحلية ولا تشمل طول المعلمات.
استغلال الثغرات
يمكن استخدام هذا التجاوز لتغيير حالة الكتلة الأساسية. في كود الحلقة، ستتغير الحالة بعد كل تنفيذ للكتلة الأساسية. عند التنفيذ مرة أخرى، إذا كان الفهرس الذي تصل إليه التعليمات غير موجود في خريطة المتغيرات المحلية الجديدة، فسوف يؤدي ذلك إلى حدوث حالة من الذعر، مما يحقق هجوم DoS.
هذه الثغرة تثبت مرة أخرى أهمية تدقيق الشيفرة. بالنسبة للغة Move، يُنصح بإضافة المزيد من الفحوصات الأمنية أثناء وقت التشغيل، بدلاً من الاعتماد فقط على الفحوصات في مرحلة التحقق. سنواصل البحث العميق في مشكلات أمان لغة Move، وسنساهم في تطويرها.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تسجيلات الإعجاب 25
أعجبني
25
7
مشاركة
تعليق
0/400
RektButStillHere
· 07-11 04:35
لقد حدث تدفق مرة أخرى، تاه تاه
شاهد النسخة الأصليةرد0
consensus_failure
· 07-11 01:01
هناك بالفعل هذه المشكلة
شاهد النسخة الأصليةرد0
SchrodingersPaper
· 07-09 07:32
هل تم إرسال move مرة أخرى؟ لقد فقدنا الأمر، فقدنا الأمر.
شاهد النسخة الأصليةرد0
DevChive
· 07-08 16:28
菜鸟被 خداع الناس لتحقيق الربح
شاهد النسخة الأصليةرد0
ProposalManiac
· 07-08 06:09
قلت من قبل أن التحقق من المعلمات لا يمكن أن يكتب فقط في الوثائق
كشف ثغرة تجاوز سعة الأعداد في لغة Move: المخاطر في التحقق من bytecode
تحليل ثغرة تجاوز السعة في لغة Move
بعد دراسة متعمقة للغة Move، اكتشفنا ثغرة جديدة في تجاوز عدد صحيح. تحدث هذه الثغرة خلال مرحلة التحقق من أمان المراجع في عملية التحقق من بايت كود لغة Move. ستقوم هذه المقالة بتحليل مفصل لعملية تنشيط هذه الثغرة، وتستكشف بعض المفاهيم الأساسية في لغة Move.
عملية التحقق من بايت كود لغة Move
تقوم لغة Move بالتحقق من الشيفرة قبل تنفيذ التعليمات البرمجية، وتنقسم إلى 4 خطوات. حدثت الثغرة في خطوة reference_safety. هذه الخطوة مسؤولة بشكل رئيسي عن التحقق من أمان الإشارات، بما في ذلك التحقق من عدم وجود إشارات معلقة، وما إذا كانت الوصولات المتغيرة آمنة.
تبدأ عملية التحقق بالتعرف على الكتل الأساسية في الكود. الكتل الأساسية هي تسلسل من التعليمات البرمجية التي لا تحتوي على تعليمات تفرع باستثناء المدخلات والمخرجات. يقوم Move بتحديد الكتل الأساسية من خلال استعراض بايت الكود، والبحث عن جميع تعليمات التفرع وتعليمات الحلقة.
أمان الإشارة في Move
تدعم Move نوعين من المراجع: المراجع الثابتة (&) والمراجع المتغيرة (&mut). ستقوم وحدة أمان المراجع بفحص تعليمات بايت كود لكل كتلة أساسية في الدالة، للتحقق من أن جميع عمليات الإشارة قانونية.
تستخدم عملية التحقق هيكل AbstractState لتمثيل الحالة، والذي يتضمن مخطط الاقتراض والمحلّيات. أثناء التحقق، تتم مقارنة الحالة قبل وبعد التنفيذ، ويتم دمج تحديث حالة الكتلة.
تحليل الثغرات
تظهر الثغرة في دالة join_. تُستخدم هذه الدالة لدمج الحالة قبل وبعد التنفيذ، وتحديث خريطة locals ورسم الاقتراض. المشكلة تكمن في أن مُكرّر locals يُرجع نوع u8، وعندما يتجاوز مجموع طول المعاملات وطول المتغيرات المحلية 256، سيحدث تجاوز.
على الرغم من أن Move لديها عملية للتحقق من عدد المتغيرات المحلية، إلا أنها تتحقق فقط من عدد المتغيرات المحلية ولا تشمل طول المعلمات.
استغلال الثغرات
يمكن استخدام هذا التجاوز لتغيير حالة الكتلة الأساسية. في كود الحلقة، ستتغير الحالة بعد كل تنفيذ للكتلة الأساسية. عند التنفيذ مرة أخرى، إذا كان الفهرس الذي تصل إليه التعليمات غير موجود في خريطة المتغيرات المحلية الجديدة، فسوف يؤدي ذلك إلى حدوث حالة من الذعر، مما يحقق هجوم DoS.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
عرض PoC
قدمت رمز PoC قابل للتكرار، من خلال ضبط معلمات محددة وعدد المتغيرات المحلية، مما أدى إلى حدوث تجاوز عددي، مما تسبب في تعطل البرنامج.
! اكتشفت Numen Cyber حصريا ثغرة أمنية أخرى عالية الخطورة في لغة الحركة
ملخص
هذه الثغرة تثبت مرة أخرى أهمية تدقيق الشيفرة. بالنسبة للغة Move، يُنصح بإضافة المزيد من الفحوصات الأمنية أثناء وقت التشغيل، بدلاً من الاعتماد فقط على الفحوصات في مرحلة التحقق. سنواصل البحث العميق في مشكلات أمان لغة Move، وسنساهم في تطويرها.