تحليل ثغرات مترجم Solidity واستراتيجيات التعامل معها

robot
إنشاء الملخص قيد التقدم

تحليل ثغرات مترجم Solidity واستراتيجيات التعامل معها

المترجم هو أحد المكونات الأساسية للأنظمة الحاسوبية الحديثة، وظيفته الرئيسية هي تحويل شفرة المصدر بلغة برمجة عالية المستوى إلى تعليمات قابلة للتنفيذ بواسطة وحدة المعالجة المركزية أو الآلة الافتراضية.

على الرغم من أن معظم المطورين والموظفين الأمنيين يركزون عادةً على أمان كود التطبيق، إلا أن أمان المترجم نفسه مهم بنفس القدر. كم برنامج حاسوبي، قد يحتوي المترجم أيضًا على ثغرات أمنية، مما قد يؤدي في بعض الحالات إلى مخاطر أمنية خطيرة.

كمثال على المتصفح، أثناء عملية تجميع وتنفيذ كود JavaScript في الواجهة الأمامية، قد تؤدي الثغرات في محرك تحليل JavaScript إلى استغلال المهاجمين للثغرات عند زيارة المستخدمين لمواقع الويب الضارة، مما يؤدي في النهاية إلى تنفيذ أكواد عن بُعد والتحكم في متصفح الضحية أو حتى نظام التشغيل الخاص به. بالإضافة إلى ذلك، يمكن أن تؤدي الأخطاء في مترجم C++ أيضًا إلى تنفيذ أكواد عن بُعد وعواقب خطيرة أخرى.

يوجد أيضًا ثغرات أمنية في مجمع Solidity. وفقًا لتحذيرات أمان فريق تطوير Solidity، توجد ثغرات أمنية في عدة إصدارات من مجمع Solidity.

تحليل ثغرات مترجم Solidity وإجراءات المواجهة

ثغرة في مترجم Solidity

تتمثل وظيفة مترجم Solidity في تحويل شفرة العقد الذكي إلى تعليمات برمجية (EVM) الخاصة بالآلة الافتراضية للإيثيريوم، حيث يتم تحميل هذه التعليمات البرمجية من خلال حزم المعاملات إلى الإيثيريوم، وأخيرًا يتم解析ها وتنفيذها بواسطة EVM.

من المهم ملاحظة أن ثغرات مترجم Solidity تختلف عن ثغرات EVM نفسها. تشير ثغرات EVM إلى مشاكل الأمان التي تحدث أثناء تنفيذ الافتراضيات، وقد تؤثر على شبكة Ethereum بأكملها. بينما تشير ثغرات مترجم Solidity إلى المشكلات الموجودة عند تحويل Solidity إلى كود EVM، ولن تؤثر مباشرة على شبكة Ethereum نفسها.

تتمثل إحدى مخاطر ثغرات مترجم Solidity في أنها قد تؤدي إلى عدم تطابق كود EVM الناتج مع توقعات مطور العقود الذكية. نظرًا لأن العقود الذكية على إيثريوم مرتبطة عادةً بأصول العملات المشفرة للمستخدمين، فإن أي خطأ ناتج عن المترجم قد يتسبب في خسارة أصول المستخدمين، مما يؤدي إلى عواقب وخيمة.

قد يركز المطورون ومراجعي العقود على مشكلات تنفيذ منطق الكود في العقود، بالإضافة إلى مشكلات الأمان على مستوى Solidity مثل إعادة الدخول، وتجاوز السعة. أما بالنسبة لعيوب مترجم Solidity، فمن الصعب اكتشافها فقط من خلال مراجعة منطق مصدر العقد. يحتاج الأمر إلى تحليل مشترك بين إصدار المترجم المحدد ونمط الكود المحدد لتحديد ما إذا كانت العقود الذكية تتأثر بعيوب المترجم.

مثال على ثغرات مترجم Solidity

فيما يلي بعض الأمثلة الحقيقية على ثغرات مترجم Solidity، توضح الأشكال المحددة، والأسباب، والأضرار.

SOL-2016-9 تخزين بايت عالي الترتيب نظيف

توجد هذه الثغرة في إصدارات سابقة من مترجم Solidity (>=0.1.6 <0.4.4).

اعتبر الشيفرة التالية:

صلابة عقد C { uint32 أ = 0x12345678; uint32 ب = 0 ؛ ترجع الدالة run() (uint256) { a += 1; إرجاع b; } }

لم يتم تعديل المتغير b من نوع storage ، وبالتالي يجب أن ترجع الدالة run() القيمة الافتراضية 0. لكن في الكود الذي تم إنشاؤه بواسطة مترجم النسخة المعرضة للثغرات الأمنية ، ستعيد الدالة run() القيمة 1.

هذه الحالة غير المتوافقة مع التوقعات، إذا تم استخدام المتغير b للتحقق من الأذونات أو محاسبة الأصول، فقد تؤدي إلى عواقب وخيمة.

سبب ظهور هذه الحالة هو أن EVM يستخدم عناصر مكدس بحجم 32 بايت، بينما تدعم Solidity أنواع البيانات الأصغر مثل uint32. يحتاج المترجم عند معالجة هذه الأنواع إلى إجراء عمليات مسح على الجزء العالي، ولكنه لم يتعامل بشكل صحيح مع تجاوز الأعداد الصحيحة، مما أدى إلى كتابة بت واحد من الجزء العالي في المتغير b المجاور.

SOL-2022-4 تأثيرات الذاكرة في التجميع المضمن

توجد هذه الثغرة في المترجم من الإصدار 0.8.13 إلى 0.8.15.

ضع في اعتبارك الكود التالي:

صلابة العقد C { وظيفة f() العوائد العامة النقية (uint) { تجميع { mstore(0 ، 0x42) } uint x; التجميع { x := mload(0) } عودة x; } }

تعود هذه الثغرة إلى عمليات تحسين الترجمة. يقوم المترجم بتحليل وتحسين كتلة التجميع الفردية، وإذا لم يتم قراءة عملية الكتابة إلى الذاكرة لاحقًا، سيتم إزالتها لتوفير الغاز. لكن عمليات الكتابة والقراءة في التعليمات البرمجية المذكورة موجودة في كتلتين مختلفتين من التجميع، وقد قام المترجم بشكل خاطئ بتحديد أن الكتابة الأولى زائدة وأزالها، مما أدى إلى أن تعيد الدالة f() القيمة 0 بدلاً من 0x42 الصحيحة.

SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup

تؤثر هذه الثغرة على الإصدارات من 0.5.8 إلى 0.8.16 من المترجم.

اعتبر الكود التالي:

صلابة العقد C { الدالة f(bytes4[] بيانات الاتصال a) إرجاع نقية خارجية (bytes4[] memory) { إرجاع abi.decode(abi.encode(a), (bytes4[])); } }

في الظروف العادية، يجب أن تعيد هذه الشفرة المتغير a المدخل. ولكن في إصدار الثغرة، إذا كان المدخل هو "aaaa"، ستعيد مصفوفة فارغة.

هذا بسبب أن Solidity عند إجراء عملية abi.encode على مصفوفة من نوع calldata، قامت بشكل خاطئ بتنظيف بعض البيانات، مما أدى إلى تعديل البيانات المجاورة، مما تسبب في عدم تناسق البيانات بعد الترميز والفك.

من الجدير بالذكر أن Solidity يقوم بشكل ضمني بترميز المعاملات باستخدام abi.encode عند إجراء مكالمات خارجية وإصدار أحداث، وبالتالي فإن احتمال ظهور مثل هذه الثغرات قد يكون أعلى مما يتصور.

تحليل ثغرات مترجم Solidity وإجراءات المواجهة

نصائح الأمان

فيما يتعلق بثغرات مترجم Solidity، نقدم الاقتراحات التالية للمطورين وموظفي الأمن:

للمطورين:

  • استخدم إصدارًا أحدث من مترجم Solidity. عادةً ما تقوم الإصدارات الجديدة بإصلاح المشكلات الأمنية المعروفة.
  • تحسين حالات اختبار الوحدة. معظم الأخطاء على مستوى المترجم تؤدي إلى عدم توافق نتائج تنفيذ الشيفرة مع التوقعات، من خلال زيادة تغطية الاختبار يمكن تجنب هذه المشاكل إلى أقصى حد.
  • حاول تجنب استخدام التجميع الداخلي، وعمليات الترميز وفك الترميز المعقدة، ولا تستخدم الميزات الجديدة والوظائف التجريبية بشكل أعمى. معظم ثغرات المترجم تتعلق بهذه العمليات المعقدة.

إلى موظفي الأمن:

  • عند تدقيق كود Solidity، لا تتجاهل المخاطر الأمنية التي قد يقدمها المترجم.
  • في عملية تطوير داخلية، يُحث فريق التطوير على ترقية إصدار مترجم Solidity، ويمكن النظر في إدخال فحص تلقائي لإصدار المترجم في عملية CI/CD.
  • لا داعي للقلق المفرط بشأن ثغرات المترجم، حيث يتم تفعيل معظم الثغرات فقط في أنماط شفرات معينة، ويتعين تقييم التأثير الفعلي بناءً على الحالة المحددة للمشروع.

بعض الموارد المفيدة:

  • تنبيهات الأمان التي تصدرها فريق Solidity بانتظام
  • قائمة الأخطاء التي يتم تحديثها بانتظام في مستودع سوليديتي الرسمي
  • قائمة أخطاء المترجمين في الإصدارات المختلفة
  • في الزاوية اليمنى العليا من صفحة كود العقد على Etherscan، يمكن أن يشير مثلث علامة التعجب الحالية إلى وجود ثغرات أمان في المترجم.

تحليل ثغرات مُجمع Solidity وتدابير المواجهة

بناءً على ما سبق، فإن ثغرات مترجم Solidity هي مخاطر أمان لا يمكن تجاهلها في تطوير العقود الذكية. يجب على المطورين والموظفين الأمنيين أن يكونوا يقظين وأن يتخذوا التدابير المناسبة لتقليل التهديدات المحتملة الناجمة عن هذه الثغرات.

شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
  • أعجبني
  • 8
  • مشاركة
تعليق
0/400
BlockDetectivevip
· 07-07 07:59
واجهت حفرة أخرى gkd تحديث
شاهد النسخة الأصليةرد0
liquidation_surfervip
· 07-06 14:45
ظهرت مجموعة أخرى من الأخطاء.
شاهد النسخة الأصليةرد0
GasFeeCriervip
· 07-04 08:26
الإصدار الرسمي يتم تحديثه يومياً من قبل من من
شاهد النسخة الأصليةرد0
DoomCanistervip
· 07-04 08:24
اذهب لإصلاح الكود الآن
شاهد النسخة الأصليةرد0
Token_Sherpavip
· 07-04 08:23
ستكون في وضع سيء إذا لم تكن تقوم بتدقيق إصدارات المترجم الخاصة بك بصراحة... لقد رأيت الكثير من القصص المحزنة.
شاهد النسخة الأصليةرد0
PonziDetectorvip
· 07-04 08:21
لقد حان الوقت لصيد الثغرات، وهو الوقت المفضل لدي
شاهد النسخة الأصليةرد0
VirtualRichDreamvip
· 07-04 08:18
تحويل الأموال هو مسألة بسيطة!
شاهد النسخة الأصليةرد0
LiquidationWizardvip
· 07-04 08:13
تم لف العقد!
شاهد النسخة الأصليةرد0
  • تثبيت