با ادامه گرم شدن پروتکلهای DeFi در اکوسیستم اتریوم، CipherTrace شاهد افزایش روزافزون اکسپلویتها و بردارهای حمله است. در هفته گذشته، در 28 دسامبر 2020، قرارداد استخراج سپر پروتکل پوششی، Blacksmith، مورد بهره برداری قرار گرفت. هکرها از یک اشکال در قرارداد ماینینگ استفاده کردند تا مقدار بی نهایت توکن COVER را بریده و بیش از 4.4 میلیون دلار از پروژه تخلیه کنند.
پروتکل جلد منتشر شد دیروز پس از مرگ آنها بیان کرد که، برای Devs ناشناخته است، این اشکال از زمان استقرار اولیه قرارداد Blacksmith وجود داشته است، که بر اهمیت ممیزی های امنیتی کامل و بررسی دقیق آن تاکید می کند. قراردادهای هوشمندانهقراردادهای هوشمند چیست؟ قرارداد هوشمند یک کامپیوتر حرفه ای است… بیشتر.
جدول زمانی از ضرب بی نهایت
جدول زمانی مهاجم اولیه
- استخر نقدینگی New Balancer بود اضافه به قرارداد Blacksmith.sol.
- حمله کننده سپرده 1,326,879.99 توکن 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 وی را در موجودی EOA در Grap Finance Deployer باقی میگذارد.
- یک کاربر خارجی دیگر عقب نشینی کرد بیشتر موجودی آنها از قرارداد Blacksmith.sol در همان زمان بود که Grap Finance را با تمام نقدینگی برای استخر DAI/Basis در قرارداد Blacksmith.sol هدایت کرد.
- Grap Finance Deployer سپرده 15,255.55 BPT (DAI/Basis) به استخر برگردید.
- سپس Grap Finance Deployer ادعای پاداش و به دلیل سوء استفاده، ضرابخانه 40,796,131,214,802,500,000.21 COVER.
- پس از سوزاندن توکن های ضرب شده، Grap Finance Deployer می فرستد بازگشت اتر به جلد بیان می کند "دفعه بعد مواظب مزخرفات خودت باش."
چگونه توکن های بی نهایت را برش دهیم - یک تحلیل فنی
زمینه
این اکسپلویت ما را به اصول زبان برنامه نویسی Solidity برمی گرداند که برای اجرای قراردادهای هوشمند در اتریوم استفاده می شود. هنگامی که این قراردادها کامپایل شدند، ماشین مجازی اتریوم (EVM) قادر خواهد بود دستورالعمل ها (یعنی کدهای عملیاتی) را که برای اجرای عملکردهای مختلف و دستکاری حافظه و ذخیره سازی استفاده می شود، درک کند. EVM دارای سه ناحیه مختلف است که می تواند داده ها را ذخیره کند: حافظه، ذخیره سازی و پشته. درک این مناطق برای درک چگونگی سوء استفاده از باگ مهم است.
مشابه حافظه با دسترسی تصادفی (RAM) در یک دستگاه محاسباتی، "حافظهکلمه کلیدی در Solidity حافظه را برای یک متغیر خاص اختصاص می دهد. در این مثال، آن متغیر به یک تابع خاص محدود می شود. پس از اجرای تابع، حافظه پاک میشود، اما اگر محتویات آن حافظه قبل از بازگشت تابع به حافظه فشار داده شود، میتواند باقی بماند.
"ذخیره سازیکلمه کلیدی در Solidity به متغیرها اجازه می دهد تا به عنوان یک اشاره گر در ذخیره سازی داده ها در نقشه ها یا ساختارهای داده عمل کنند. داده های ذخیره سازی بین فراخوانی عملکرد و تراکنش ها پایدار است. در زیر کاپوت، ذخیرهسازی اساساً یک ذخیرهسازی با ارزش کلیدی است که کلمات 256 بیتی را به کلمات 256 بیتی نگاشت میکند.
توجه داشته باشید که EVM یک ماشین ثبت نیست، بلکه یک ماشین پشته است - بنابراین تمام محاسبات در یک ناحیه داده به نام انجام می شود. پشته. پشته حداکثر ظرفیت 1024 مورد را دارد، اما فقط 16 مورد بالا به راحتی قابل دسترسی هستند که می توان از آنها برای تعویض بالاترین عنصر با یکی از 16 عنصر زیر آن و موارد دیگر استفاده کرد.
حشره
هکرها از Cover Protocol's Blacksmith.sol سوء استفاده کردند.
برای درک بهتر اشکال، ابتدا به عموم نگاه می کنیم استخر متغیری که یک نقشه برداری است (یعنی ذخیره سازی داده ها):
At خط 118، می بینیم که قرارداد داده های استخر را از طریق کلمه کلیدی "حافظه" در حافظه پنهان می کند.
سپس در خط 121، قرارداد به روز رسانی استخر در ذخیره سازی به عنوان updatePool(آدرس _lpToken) تابع با استفاده از استخر ذخیره سازی استخر متغیر.
با این حال، اگر دورتر را به پایین نگاه کنید سپرده (آدرس _lpToken, uint256 _amount) تابع، از همان استفاده می کند استخر متغیری از خط 118 که در حافظه پنهان در تابع برای محاسبات ذخیره شده است pool.accRewardsPerToken. در این مرحله ، استخر متغیر از روی کپی شد استخر نقشه برداری و در حافظه ذخیره شد.
در نتیجه هر تغییری در استخر متغیر در داخل سپرده (آدرس _lpToken, uint256 _amount) تابع را تغییر نخواهد داد استخر به دلیل این واقعیت که متغیرهایی که از کلمه کلیدی "حافظه" استفاده می کنند، فقط در داخل خود تابع، نگاشت در ذخیره سازی زنجیره ای قرارداد است. از آنجا، قرارداد به روز رسانی می شود pool.accRewardsPerToken در داخل updatePool(آدرس _lpToken) تابعی که از ذخیره سازی استفاده می کند. بنابراین در حال حاضر، در داخل updatePool(آدرس _lpToken) تابع pool.accRewardsPerToken که به روز می شود به شدت افزایش می یابد زیرا از نظر فنی یک استخر جدید بود و به آن مرتبط نبود استخر در حافظه.
به دنبال این آسیب پذیری و سوء استفاده بین حافظه و ذخیره سازی، miner.rewardWriteoff در داخل سپرده (آدرس _lpToken, uint256 _amount) تابع اشتباه محاسبه شده و همچنین از نادرست استفاده می کند pool.accRewardsPerToken، همانطور که ما هنوز در تابع سپرده هستیم که نمونه ای از حافظه پنهان را مدیریت می کند استخر.
علاوه بر عملکرد سپرده، هر کسی، مانند Grap Finance، میتواند هنگام اجرای این توکن، مقدار غیرمجاز توکنهای ضرب شده به دست آورد. ادعای پاداش (آدرس _lpToken) عملکرد. این تابع، که برای گرفتن جوایز آنها استفاده می شود، در نهایت به تماس می پردازد _claimCoverRewards (پول حافظه استخر، استخراج کننده حافظه ماینر) که به miner.rewardWriteoff که در بالا برجسته کردیم. زیرا آن متغیر بسیار کوچکتر از واقعی است pool.accRewardsPerToken، قرارداد منجر به ضرب فراوانی توکن می شود.
گیرنده های کلیدی
CipherTrace امیدوار است که این پیشینه در باگ مورد سوء استفاده قرار گرفته، اهمیت ممیزی های امنیتی کامل و انعقاد قراردادهای هوشمند را برای هر کدام آشکار کند. بلاکچینیک بلاک چین – فناوری زیربنایی بیت کوین و سایر موارد… بیشتر یکی برای استقرار انتخاب می کند. در حالی که Grap Finance وجوهی را که از طریق اکسپلویت دریافت کرده بود برگرداند، هکر اصلی همچنان توانست بیش از 4 میلیون دلار از پروتکل DeFi به دست آورد و ارزش توکن COVER از آن زمان تا کنون نزدیک به 99 درصد کاهش یافته است.
منبع: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/