تحليل ثغرات مترجم Solidity واستراتيجيات التعامل معها
المترجم هو أحد المكونات الأساسية في أنظمة الكمبيوتر الحديثة، وهو مسؤول عن تحويل لغات البرمجة عالية المستوى إلى تعليمات قابلة للتنفيذ على مستوى منخفض. على الرغم من أن المطورين عادة ما يهتمون بأمان كود التطبيق، إلا أن أمان المترجم نفسه أمر مهم بنفس القدر. قد تسبب ثغرات المترجم في بعض الحالات مخاطر أمنية خطيرة، على سبيل المثال، قد تؤدي ثغرات محرك JavaScript في المتصفح إلى تنفيذ تعليمات برمجية عن بُعد.
لا يُستثنى مترجم Solidity من ذلك، حيث توجد عدة إصدارات تحتوي على ثغرات أمنية. على عكس ثغرات EVM، فإن ثغرات مترجم Solidity تؤثر فقط على مطوري العقود، ولا تهدد مباشرة أمان شبكة Ethereum. ولكنها قد تؤدي إلى عدم توافق كود EVM الناتج مع توقعات المطور، مما يؤدي إلى ثغرات في العقود الذكية، مما يهدد أمان أصول المستخدم.
فيما يلي بعض الأمثلة الحقيقية على ثغرات مترجم Solidity:
SOL-2016-9 تخزين البيانات عالية الترتيب النظيفة
إصدار التأثير: >=0.1.6 <0.4.4
قد تؤدي هذه الثغرة إلى تعديل متغير storage بشكل غير مقصود. على سبيل المثال:
صلابة
عقد C {
uint32 أ = 0x1234;
uint32 ب = 0 ؛
دالة run() ترجع (uint) {
a += 1;
عودة ب ؛
}
}
يجب أن تُرجع الدالة run() القيمة 0، ولكنها تعيد في الواقع 1. وذلك لأن المترجم لم يقم بتنظيف الجزء العلوي بشكل صحيح عند معالجة تجاوز السعة الصحيحة، مما أدى إلى كتابة بتات التجاوز في المتغيرات المجاورة.
SOL-2022-4 تأثيرات الذاكرة في التجميع الخطي
الإصدار المؤثر: >=0.8.13 <0.8.15
تنبع هذه الثغرة من عملية تحسين التجميع. على سبيل المثال:
صمود
العقد C {
وظيفة f() العوائد العامة النقية (uint) {
تجميع {
mstore(0 ، 0x42)
}
uint x;
التجميع {
x := mload(0)
}
إرجاع x;
}
}
يجب أن تعيد الدالة f( 0x42، لكن الإصدار الذي يحتوي على الثغرة سيعيد 0. وذلك لأن المترجم أزال عن طريق الخطأ عملية كتابة الذاكرة في الكتلة assembly الأولى.
يتعلق هذا الثغرة بتشفير ABI لمصفوفة calldata. على سبيل المثال:
صلابة
العقد C {
وظيفة f)bytes( calldata a[1] العوائد العامة النقية )bytes memory( {
إرجاع abi.encode019283746574839201a);
}
}
يجب أن تُرجع دالة f() المصفوفة المدخلة، لكن النسخة المعرضة للثغرات سترجع سلسلة فارغة. وهذا بسبب أن المُجمع قام عن طريق الخطأ بتنظيف البيانات المجاورة أثناء عملية التشفير.
لتقليل مخاطر ثغرات مترجم Solidity، يجب على المطورين:
استخدم إصدارًا أحدث من المترجم
تحسين اختبارات الوحدة، وزيادة نسبة تغطية الكود
تجنب استخدام ميزات اللغة المعقدة، مثل التجميع الداخلي، ترميز ABI للمصفوفات متعددة الأبعاد، إلخ.
يجب على موظفي تدقيق الأمان:
النظر في المخاطر المحتملة للمجمعات خلال عملية التدقيق
يُنصح فريق التطوير بترقية إصدار المترجم في الوقت المناسب
إضافة فحص تلقائي لإصدار المترجم في عملية CI/CD
موارد مرجعية مفيدة:
مدونة تحذيرات الأمان الرسمية لـ Solidity
قائمة الأخطاء في مستودع Solidity GitHub
تنبيه ثغرة المترجم على صفحة عقد Etherscan
بشكل عام، على الرغم من أن ثغرات المترجم ليست شائعة، إلا أن تأثيرها يمكن أن يكون خطيرًا. يجب على المطورين وفرق الأمان أن يكونوا يقظين وأن يتخذوا تدابير مناسبة لتقليل المخاطر.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
تسجيلات الإعجاب 8
أعجبني
8
5
مشاركة
تعليق
0/400
blockBoy
· منذ 1 س
مرة أخرى نرى ثغرة في العقد، حقًا مزعج جدًا~
شاهد النسخة الأصليةرد0
GasGuzzler
· منذ 19 س
مرة أخرى يقوم المترجم بفعل شيء ما
شاهد النسخة الأصليةرد0
GweiTooHigh
· منذ 19 س
ما هذه الفوضى؟ لقد ظهرت ثغرة أخرى.
شاهد النسخة الأصليةرد0
RektRecovery
· منذ 19 س
*آه* عيب آخر متوقع... متى سيتعلم المطورون التوقف عن اللعب بالنار
شاهد النسخة الأصليةرد0
GasGuzzler
· منذ 20 س
لقد قمت بالاختبار لفترة طويلة ولم أواجه هذه المشكلة.
تحليل ثغرات مترجم Solidity: المخاطر الأمنية واستراتيجيات المواجهة
تحليل ثغرات مترجم Solidity واستراتيجيات التعامل معها
المترجم هو أحد المكونات الأساسية في أنظمة الكمبيوتر الحديثة، وهو مسؤول عن تحويل لغات البرمجة عالية المستوى إلى تعليمات قابلة للتنفيذ على مستوى منخفض. على الرغم من أن المطورين عادة ما يهتمون بأمان كود التطبيق، إلا أن أمان المترجم نفسه أمر مهم بنفس القدر. قد تسبب ثغرات المترجم في بعض الحالات مخاطر أمنية خطيرة، على سبيل المثال، قد تؤدي ثغرات محرك JavaScript في المتصفح إلى تنفيذ تعليمات برمجية عن بُعد.
لا يُستثنى مترجم Solidity من ذلك، حيث توجد عدة إصدارات تحتوي على ثغرات أمنية. على عكس ثغرات EVM، فإن ثغرات مترجم Solidity تؤثر فقط على مطوري العقود، ولا تهدد مباشرة أمان شبكة Ethereum. ولكنها قد تؤدي إلى عدم توافق كود EVM الناتج مع توقعات المطور، مما يؤدي إلى ثغرات في العقود الذكية، مما يهدد أمان أصول المستخدم.
فيما يلي بعض الأمثلة الحقيقية على ثغرات مترجم Solidity:
إصدار التأثير: >=0.1.6 <0.4.4
قد تؤدي هذه الثغرة إلى تعديل متغير storage بشكل غير مقصود. على سبيل المثال:
صلابة عقد C { uint32 أ = 0x1234; uint32 ب = 0 ؛ دالة run() ترجع (uint) { a += 1; عودة ب ؛ } }
يجب أن تُرجع الدالة run() القيمة 0، ولكنها تعيد في الواقع 1. وذلك لأن المترجم لم يقم بتنظيف الجزء العلوي بشكل صحيح عند معالجة تجاوز السعة الصحيحة، مما أدى إلى كتابة بتات التجاوز في المتغيرات المجاورة.
الإصدار المؤثر: >=0.8.13 <0.8.15
تنبع هذه الثغرة من عملية تحسين التجميع. على سبيل المثال:
صمود العقد C { وظيفة f() العوائد العامة النقية (uint) { تجميع { mstore(0 ، 0x42) } uint x; التجميع { x := mload(0) } إرجاع x; } }
يجب أن تعيد الدالة f( 0x42، لكن الإصدار الذي يحتوي على الثغرة سيعيد 0. وذلك لأن المترجم أزال عن طريق الخطأ عملية كتابة الذاكرة في الكتلة assembly الأولى.
الإصدار المؤثر: >= 0.5.8 < 0.8.16
يتعلق هذا الثغرة بتشفير ABI لمصفوفة calldata. على سبيل المثال:
صلابة العقد C { وظيفة f)bytes( calldata a[1] العوائد العامة النقية )bytes memory( { إرجاع abi.encode019283746574839201a); } }
يجب أن تُرجع دالة f() المصفوفة المدخلة، لكن النسخة المعرضة للثغرات سترجع سلسلة فارغة. وهذا بسبب أن المُجمع قام عن طريق الخطأ بتنظيف البيانات المجاورة أثناء عملية التشفير.
لتقليل مخاطر ثغرات مترجم Solidity، يجب على المطورين:
يجب على موظفي تدقيق الأمان:
موارد مرجعية مفيدة:
بشكل عام، على الرغم من أن ثغرات المترجم ليست شائعة، إلا أن تأثيرها يمكن أن يكون خطيرًا. يجب على المطورين وفرق الأمان أن يكونوا يقظين وأن يتخذوا تدابير مناسبة لتقليل المخاطر.