مع استمرار بروتوكولات DeFi في التسخين داخل النظام البيئي Ethereum ، تشهد CipherTrace المزيد والمزيد من المآثر ونواقل الهجوم تظهر للضوء. في الأسبوع الماضي ، في 28 ديسمبر 2020 ، تم استغلال عقد تعدين درع بروتوكول Cover Protocol ، Blacksmith. استخدم المتسللون خطأً في عقد التعدين لصك كمية لا حصر لها من رموز COVER واستنزاف أكثر من 4.4 مليون دولار من المشروع.
بروتوكول الغلاف صدر بالأمس ذكروا أنه ، غير معروف للمطورين ، كان الخطأ موجودًا منذ النشر الأولي لعقد الحدادة ، مما يسلط الضوء على أهمية إجراء عمليات تدقيق أمنية شاملة وإجراء اختبار pentest العقود الذكيةما هي العقود الذكية؟ العقد الذكي هو محترف كمبيوتر ... المزيد.
جدول زمني لعمليات سك النقود اللانهائية
الجدول الزمني الأولي للمهاجم
- كان تجمع سيولة الموازن الجديد وأضاف لعقد الحدادة.
- مهاجم الودائع 1,326,879.99،XNUMX،XNUMX توكن BPT في عقد Blacksmith.sol.
- نفس المهاجم بعد ذلك ينفذ الاستغلال ، عن طريق سحب الأموال من العقد.
- المهاجم كان قادرا على استمر مكافآت وسحب أموال تصل إلى 4.4 مليون دولار تقريبًا.
في تحول مثير للأحداث ، استغل "المتسللون البيض" المزعومون المرتبطون بـ Grap Finance أيضًا الخطأ لصك رموز COVER بقيمة 4 ملايين دولار تقريبًا. في النهاية ، أعادت شركة Grap Finance الأموال إلى Cover Protocol.
الجدول الزمني لحساب Grap Finance Deployer المملوك خارجيًا (EOA)
- كان تجمع السيولة الجديد من وزارة الصحة لتعدين السيولة.
- Grap Finance Deployer EOA أودعت 15,255.55 BPT (DAI / Basis) في حوض السباحة على الغلاف عبر عقد Blacksmith.sol.
- بعد حوالي أربع دقائق ، كانت الأموال سحب عند غطاء يترك 1 Wei في رصيد EOA الخاص بـ Grap Finance Deployer.
- مستخدم خارجي آخر انسحب معظم رصيدهم من عقد Blacksmith.sol في نفس الوقت تقريبًا والذي أدى إلى Grap Finance مع كل السيولة لمجمع DAI / Basis على عقد Blacksmith.sol.
- موزع تمويل Grap أودعت عودة 15,255.55 BPT (DAI / Basis) في البركة.
- ثم Grap Finance Deployer مطالبات المكافآت ، وبسبب الاستغلال ، سك 40,796,131,214,802,500,000.21 غطاء.
- بعد بعض حرق الرموز المميزة ، Grap Finance Deployer يرسل عودة الأثير للتغطية تفيد "في المرة القادمة ، اعتني بنفسك."
كيفية سك العملات اللانهائية - تحليل فني
خلفيّة
يعيدنا هذا الاستغلال إلى أساسيات لغة برمجة Solidity ، والتي تُستخدم لتنفيذ العقود الذكية داخل Ethereum. بمجرد تجميع هذه العقود ، سيكون بإمكان جهاز Ethereum Virtual Machine (EVM) فهم التعليمات (مثل أكواد التشغيل) المستخدمة لتنفيذ الوظائف المختلفة ومعالجة الذاكرة والتخزين. يحتوي جهاز EVM على ثلاثة مجالات مختلفة حيث يمكنه تخزين البيانات: الذاكرة والتخزين والمكدس. إن فهم هذه المجالات مهم لفهم كيفية استغلال الخطأ.
على غرار ذاكرة الوصول العشوائي (RAM) على جهاز كمبيوتر ، فإن "ذاكرة"الكلمة الأساسية داخل Solidity تخصص ذاكرة لمتغير معين. في هذه الحالة ، يتم تحديد نطاق هذا المتغير لوظيفة معينة. يتم مسح الذاكرة بمجرد تنفيذ الوظيفة ، ولكن يمكن أن تبقى إذا تم دفع محتويات تلك الذاكرة إلى التخزين قبل عودة الوظيفة.
في "تخزين"الكلمة الأساسية داخل Solidity تسمح للمتغيرات بالعمل كمؤشر في تخزين البيانات في التعيينات أو هياكل البيانات. بيانات التخزين ثابتة بين استدعاءات الوظائف والمعاملات. تحت الغطاء ، يعد التخزين في الأساس مخزنًا للقيمة الرئيسية يقوم بتعيين كلمات 256 بت لكلمات 256 بت.
لاحظ أن EVM ليست آلة تسجيل ولكنها آلة مكدس - وبالتالي يتم تنفيذ جميع العمليات الحسابية على منطقة بيانات تسمى المدخنة. تبلغ السعة القصوى للمكدس 1024 عنصرًا ، ولكن يمكن الوصول بسهولة إلى أفضل 16 عنصرًا فقط والتي يمكن استخدامها لمبادلة العنصر الأعلى بواحد من العناصر الـ 16 الموجودة تحته وأكثر.
وعلة
استغل المخترقون بروتوكول Cover Protocol's Blacksmith.sol - وهو عقد تعدين درع يسمح للمخترقين بالمكافأة في الرموز المميزة لمشروع أو مجموعة محددة ، مثل رموز CLAIM و NOCLAIM ضمن بروتوكول Cover.
لفهم الخطأ بشكل أفضل ، دعنا أولاً نلقي نظرة على الجمهور حمامات متغير وهو تعيين (أي تخزين البيانات):
At خط 118، نرى أن العقد يخزن بيانات التجمع مؤقتًا في الذاكرة عبر الكلمة الأساسية "ذاكرة".
ثم على خط 121، يقوم العقد بتحديث التجمع في التخزين باسم updatePool (عنوان _lpToken) وظيفة يستخدم تجمع تخزين بركة المتغير.
ومع ذلك ، إذا نظرت أبعد من ذلك في إيداع (العنوان _lpToken ، uint256 _amount) وظيفة ، فإنه يستخدم نفس الشيء تجمع متغير من السطر 118 الذي تم تخزينه مؤقتًا في الذاكرة داخل وظيفة الحسابات الخاصة به Pool.accRewardsPerToken. عند هذه النقطة ، تجمع متغير تم نسخه من حمامات رسم الخرائط وحفظها في الذاكرة.
ونتيجة لذلك ، فإن أي تغييرات تم إجراؤها على تجمع متغير داخل إيداع (العنوان _lpToken ، uint256 _amount) لن تغير الوظيفة حمامات رسم الخرائط في التخزين على سلسلة العقد نظرًا لحقيقة أن المتغيرات التي تستخدم الكلمة الأساسية "ذاكرة" يتم تحديدها فقط داخل الوظيفة نفسها. من هناك ، يقوم العقد بتحديث ملف Pool.accRewardsPerToken في حدود updatePool (عنوان _lpToken) وظيفة ، والتي تستخدم التخزين. حتى الآن ، داخل updatePool (عنوان _lpToken) وظيفة Pool.accRewardsPerToken الذي تم تحديثه يزيد بشكل كبير لأنه كان من الناحية الفنية تجمعًا جديدًا وغير مرتبط بـ تجمع في الذاكرة.
بعد هذا الضعف وسوء الاستخدام بين الذاكرة والتخزين ، فإن المكافأة في حدود إيداع (العنوان _lpToken ، uint256 _amount) تم حساب الوظيفة بشكل خاطئ وكذلك استخدام غير صحيح pool.accRewardsPerToken ، لأننا ما زلنا ضمن وظيفة الإيداع التي تتعامل مع نسخة ذاكرة مخبأة من تجمع.
بالإضافة إلى وظيفة الإيداع ، يمكن لأي شخص ، مثل Grap Finance ، الحصول على مبلغ مجنون من الرموز المميزة عند تنفيذ ClaimRewards (العنوان _lpToken) وظيفة. هذه الوظيفة ، التي تستخدم للاستيلاء على مكافآتهم ، ينتهي بهم الأمر إلى الاتصال _claimCoverRewards (تجمع ذاكرة التجمع ، عامل منجم الذاكرة) الذي يشير إلى المكافأة التي أبرزناها أعلاه. حيث أن هذا المتغير أصغر بكثير من المتغير الفعلي Pool.accRewardsPerToken، ينتج عن العقد سك وفرة من الرموز المميزة.
الوجبات السريعة الرئيسية
تأمل CipherTrace في أن تسلط هذه الخلفية في الخطأ المستغل الضوء على أهمية إجراء عمليات تدقيق أمنية شاملة والتحقق من العقود الذكية على أيهما سلسلة كتلةسلسلة الكتل - التكنولوجيا التي تقوم عليها عملة البيتكوين وغيرها من ... المزيد يختار المرء النشر إليه. بينما أعادت Grap Finance الأموال التي تلقاها من خلال الاستغلال ، كان المخترق الأصلي لا يزال قادرًا على جمع أكثر من 4 ملايين دولار من بروتوكول DeFi ، وانخفضت قيمة الرمز المميز COVER منذ ذلك الحين بنحو 99٪.
المصدر: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/