المجمع هو جزء مهم من أنظمة الحاسوب الحديثة، حيث يعمل على تحويل كود المصدر للغات البرمجة العليا إلى تعليمات قابلة للتنفيذ بواسطة الكمبيوتر. مقارنة بكود تطبيقات البرامج، غالبًا ما يتم تجاهل أمان المجمع نفسه. ومع ذلك، يمكن أن تؤدي ثغرات المجمع في بعض الحالات إلى مخاطر أمنية خطيرة.
تتمثل الوظيفة الرئيسية لمترجم Solidity في تحويل كود العقود الذكية إلى تعليمات آلة الإيثريوم (EVM). على عكس الثغرات الموجودة في EVM نفسها، تؤثر ثغرات مترجم Solidity بشكل رئيسي على مطوري العقود الذكية، ولن تهدد بشكل مباشر أمان شبكة الإيثريوم.
قد تؤدي ثغرات المترجم إلى عدم تطابق الكود الناتج عن EVM مع توقعات المطورين. نظرًا لأن العقود الذكية تتعلق عادةً بأصول العملات المشفرة، فإن أي خطأ ناتج عن المترجم قد يتسبب في خسارة أصول المستخدمين. من الصعب اكتشاف هذه الأنواع من المشكلات فقط من خلال تدقيق شفرة العقد، ويجب تحليلها بالاقتران مع إصدارات المترجم المحددة وأنماط الشفرة.
أمثلة على ثغرات مترجم Solidity
SOL-2016-9 تخزين بايت مرتفع منظم
توجد هذه الثغرة في إصدارات مبكر من مترجم Solidity (>=0.1.6 <0.4.4). في بعض الحالات، قد يتم تعديل متغيرات التخزين عن غير قصد، مما يؤدي إلى عدم تطابق قيم إرجاع الدوال مع ما هو متوقع. قد تترتب على هذه الاختلافات عواقب وخيمة في الحالات التي تتضمن التحقق من الأذونات أو محاسبة الأصول.
سبب وجود الثغرة هو أن المترجم لم يقم بإزالة البيانات العليا بشكل صحيح عند معالجة أنواع البيانات التي تقل عن 32 بايت، مما يؤدي إلى كتابة البيانات العليا بشكل خاطئ في المتغيرات المجاورة عند حدوث تجاوز عددي.
SOL-2022-4 آثار الذاكرة في التجميع المضمن
تؤثر هذه الثغرة على المترجمات من الإصدار >=0.8.13 <0.8.15. تنبع المشكلة من معالجة غير صحيحة لعمليات الذاكرة أثناء عملية تحسين المترجم. في بعض الحالات، يقوم المترجم بشكل غير صحيح بإزالة تعليمات كتابة الذاكرة التي تبدو زائدة، مما يؤدي إلى قيم غير طبيعية في عائدات الدوال.
توجد هذه الثغرة في المترجم في الإصدارات >= 0.5.8 < 0.8.16. أثناء إجراء عملية abi.encode على مصفوفة من نوع calldata، قام المترجم بشكل غير صحيح بتنظيف بعض البيانات، مما أدى إلى تعديل البيانات المجاورة، مما تسبب في عدم تطابق البيانات بعد الترميز وفك الترميز.
من المهم ملاحظة أنه عند إجراء external call و emit event، يتم تنفيذ abi.encode بشكل ضمني، لذا قد يكون نطاق تأثير هذه الثغرة أوسع مما كان متوقعًا.
نصائح الأمان
تقدم فريق أمان blockchain Cobo الاقتراحات التالية لمعالجة ثغرات مترجم Solidity:
إلى المطورين:
استخدم إصدارًا أحدث من مترجم Solidity
تحسين حالات اختبار الوحدة وزيادة نسبة تغطية الكود
تجنب استخدام التجميع الداخلي، والترميز المعقد للـ abi وغيرها من العمليات، واستخدام الميزات الجديدة والوظائف التجريبية بحذر
إلى موظفي الأمن:
التركيز على المخاطر الأمنية التي قد يقدمها المترجم أثناء التدقيق
دفع ترقية إصدار المترجم في عملية التطوير، مع الأخذ في الاعتبار إدخال فحص الإصدار التلقائي في CI/CD
تقييم الأثر الأمني الفعلي لثغرات المترجم بناءً على المشروع المحدد
موارد عملية:
مدونة تنبيهات الأمان الرسمية لـ Solidity
قائمة الأخطاء في مستودع Solidity على GitHub
قائمة أخطاء المترجمين لكل إصدار
تنبيه ثغرة في مترجم صفحة كود العقد على Etherscan
بشكل عام، يجب على المطورين والموظفين الأمنيين أن يولوا اهتمامًا لمخاطر الثغرات في مترجم Solidity وأن يتخذوا التدابير المناسبة لتقليل المخاطر الأمنية. كما يجب تقييم الأثر المحدد بشكل موضوعي لتجنب الذعر المفرط.
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
تحليل ثغرات مترجم Solidity: المخاطر المحتملة التي لا ينبغي على المطورين تجاهلها
تحليل ثغرات مترجم Solidity واستراتيجيات المواجهة
المجمع هو جزء مهم من أنظمة الحاسوب الحديثة، حيث يعمل على تحويل كود المصدر للغات البرمجة العليا إلى تعليمات قابلة للتنفيذ بواسطة الكمبيوتر. مقارنة بكود تطبيقات البرامج، غالبًا ما يتم تجاهل أمان المجمع نفسه. ومع ذلك، يمكن أن تؤدي ثغرات المجمع في بعض الحالات إلى مخاطر أمنية خطيرة.
تتمثل الوظيفة الرئيسية لمترجم Solidity في تحويل كود العقود الذكية إلى تعليمات آلة الإيثريوم (EVM). على عكس الثغرات الموجودة في EVM نفسها، تؤثر ثغرات مترجم Solidity بشكل رئيسي على مطوري العقود الذكية، ولن تهدد بشكل مباشر أمان شبكة الإيثريوم.
قد تؤدي ثغرات المترجم إلى عدم تطابق الكود الناتج عن EVM مع توقعات المطورين. نظرًا لأن العقود الذكية تتعلق عادةً بأصول العملات المشفرة، فإن أي خطأ ناتج عن المترجم قد يتسبب في خسارة أصول المستخدمين. من الصعب اكتشاف هذه الأنواع من المشكلات فقط من خلال تدقيق شفرة العقد، ويجب تحليلها بالاقتران مع إصدارات المترجم المحددة وأنماط الشفرة.
أمثلة على ثغرات مترجم Solidity
SOL-2016-9 تخزين بايت مرتفع منظم
توجد هذه الثغرة في إصدارات مبكر من مترجم Solidity (>=0.1.6 <0.4.4). في بعض الحالات، قد يتم تعديل متغيرات التخزين عن غير قصد، مما يؤدي إلى عدم تطابق قيم إرجاع الدوال مع ما هو متوقع. قد تترتب على هذه الاختلافات عواقب وخيمة في الحالات التي تتضمن التحقق من الأذونات أو محاسبة الأصول.
سبب وجود الثغرة هو أن المترجم لم يقم بإزالة البيانات العليا بشكل صحيح عند معالجة أنواع البيانات التي تقل عن 32 بايت، مما يؤدي إلى كتابة البيانات العليا بشكل خاطئ في المتغيرات المجاورة عند حدوث تجاوز عددي.
SOL-2022-4 آثار الذاكرة في التجميع المضمن
تؤثر هذه الثغرة على المترجمات من الإصدار >=0.8.13 <0.8.15. تنبع المشكلة من معالجة غير صحيحة لعمليات الذاكرة أثناء عملية تحسين المترجم. في بعض الحالات، يقوم المترجم بشكل غير صحيح بإزالة تعليمات كتابة الذاكرة التي تبدو زائدة، مما يؤدي إلى قيم غير طبيعية في عائدات الدوال.
SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup
توجد هذه الثغرة في المترجم في الإصدارات >= 0.5.8 < 0.8.16. أثناء إجراء عملية abi.encode على مصفوفة من نوع calldata، قام المترجم بشكل غير صحيح بتنظيف بعض البيانات، مما أدى إلى تعديل البيانات المجاورة، مما تسبب في عدم تطابق البيانات بعد الترميز وفك الترميز.
من المهم ملاحظة أنه عند إجراء external call و emit event، يتم تنفيذ abi.encode بشكل ضمني، لذا قد يكون نطاق تأثير هذه الثغرة أوسع مما كان متوقعًا.
نصائح الأمان
تقدم فريق أمان blockchain Cobo الاقتراحات التالية لمعالجة ثغرات مترجم Solidity:
إلى المطورين:
إلى موظفي الأمن:
موارد عملية:
بشكل عام، يجب على المطورين والموظفين الأمنيين أن يولوا اهتمامًا لمخاطر الثغرات في مترجم Solidity وأن يتخذوا التدابير المناسبة لتقليل المخاطر الأمنية. كما يجب تقييم الأثر المحدد بشكل موضوعي لتجنب الذعر المفرط.