آیا تا به حال به باگ بانتی (باگ بونتی) شغل پیداکردن باگ در کدهای برنامه نویسی فکر کرده اید؟ این شغل بهطرز شگفتآوری یک درآمد عالی دارد؛ زیرا بخش جداییناپذیر محافظت اکوسیستم در برابر هک است. ادامه یک توسعهدهنده میشود به ارزش ۷ میلیارد دلار در قرارداد هوشمند پالیگان (Polygon) پیدا و بابت گزارش این باگ ۲.۲ میلیون دلار دریافت میشود. در این مطلب از میهن بلوکچین میخواهم ببینیم، این باگ هانتر خوششانس چگونه موفق به پیدا کردن باگ شده است. ضمنا ابزارهای مفید و استراتژی یافتن باگ را نیز معرفی می کنیم. توصیه میکنیم اگر نیاز به اطلاعات بیشتر در این زمینه دارید، میهن پادکست مربوط به کریپتوبانتی را از این لینک گوش دهید.
نمونه های از باگ در قرارداد هوشمند پالیگان
بلوکچین متیک (Matic) در ۳۱ ماه مه ۲۰۲۰ (۱۱ خرداد ۱۳۹۹) فعال شد و بعدا به پالیگان (Polygon) تغییر نام داد. پالیگان یک بلوکچین سازگار با ماشین مجازی اتریوم (EVM) است که به دلیل کارمزد گس پایین و زمان کوتاه ایجاد بلوک میان کاربران محبوب شد. این زنجیره طولانیا نیز برای استفاده از فناوری Z-Rollup اقدام کرده است.
با نگاهی به بلوک شماره صفر، اولین بلوک که به نام جنسیس بلوک (Genesis Block) شناخته میشود، ده تراکنش را مشاهده میکنید. یکی از این تراکنشها به نام MRC20 را ایجاد کرده است.
قرارداد MRC20 در جنسیس بلوک پالیگان چیست؟
برای ارسال توکن بومی باید گس پرداخت شود. تیم توسعهدهنده پالیگان قراردادی را ایجاد میکند که به موجب آن یک کاربر میتواند تراکنشی را برای ارسال اتر (ETH) به دیگر امضا کند، در حالی که کاربر سوم (اپراتور) میتواند کارمزد گس این تراکنش را بپردازد. این قابلیت که «تراکنش متا» (Meta Transaction) نام دارد با معرفی استاندارد EIP-712 رایج شد.
تعداد ۱۰ میلیارد توکن متیک (MATIC) به تسهیل تراکنشهای بدون گس تخصیص گرفت. اما به هر حال این قراردادها و آسیبپذیریهایی داشت که میتوانست باعث ایجاد کل موجود شود.
در ۳ دسامبر ۲۰۲۱ (۱۲ آذرماه ۱۴۰۰) قهرمان داستان وارد شد. توسعهدهندههای به نام لئون اسپیسواکر (Leon Spacewalker) گزارشی را به برنامه باگ بانتی سایت ایمونیفای (Immunefi) ارسال کرد. او در این گزارش دقیق عملکرد تابع را ارائه کرده بود. قهرمان دوم که او را هکر کلاه سفید شماره ۲ (کلاه سفید) مینامیم، یک روز بعد از این آسیبپذیری را گزارش کرد. خبر مربوط به آن را میتوانید از این لینک مشاهده کنید.
اما به هر اقدامی قبل از هر اقدامی از قبیله فورک (Fork) یا رفع باگ، در ۵ دسامبر ۲۰۲۱ (۱۴ آذر ۱۴۰۰) حدود ۸۰۰ هزار توکن متیک به فرار رفت. حالا سوال این است که چه آسیب پذیری چه بود؟ چرا برای مدت طولانی کسی متوجه این اشکال نشده است؟ چطور این باگ کشف شد؟
بررسی اکسپلویت در پالیگان
تصویر زیر تابعی را نشان می دهد که بدون گس امکان پذیر می کند انجام شود:
در نگاه اول هیچ اشکالی وجود ندارد. در این تابع موارد از اعضای کاربر، تعداد توکنهای ارسالی، افرادی که میخواهند توکنها را انجام دهند، تاریخ انقضای تراکنش و هر گونه اطلاعات بیشتری را ارسال میکنند.
تابع فوق برخی موارد را اجرا میکند. مثلاً برای ارسال تراکنش متا، اطلاعات مربوط به هش (در قرارداد به آن دیتاهش گفته میشود) را دریافت میکند. سپس مطمئن شوید که از دیتاهش استفاده نمیشود و بعد از تابع ecrecovery را میدهد.
تابع ecrecovery در اصل یک آبجکت Wrapper برای دربرگرفتن تابع Solidity ecrecover است که امکان انتقال مجموعهای از امضاها را میکند.
با استفاده از تابع فوق میتوانم بفهمم که چگونه میتوان از کجا میآیند. توجه داشته باشید که در برنامهنویسی سالیدیتی (Solidity) دستور “Return 0” به این معنی است که در صورت خطا، مقدار برگردانده میشود. اکنون تابع ecrecovery این دستور را کپی کرده است و در صورتی که خطایی وجود داشته باشد، مقدار صفر را برمیگرداند. مواردی که از توسعه دهندگان میدانند، این موضوع میتواند ترسناک باشد. اگر تابع در صورت وجود خطا، صفر را برگرداند به این معنی است که آدرس برگشت صفر نیست!
کد مطابق تصویر زیر بود:
در حالی که احتمالا باید به صورت زیر نوشته میشد:
بنابراین لازم نیست آدرس را بررسی کنیم تا ببینیم به خطا شده است یا خیر. چراکه آخرین خط کد در تابع TransferWithSig انتقال را انجام میدهد و بررسیهای لازم را باید در این خط انجام دهید.
اکنون تابع TransferFrom، تنها تابع Transfer را که در تصویر بالا مشاهده میکنید، فرا میخواند. از عواملی که متوجه این تابع هستند، آدرس را بررسی نمیکند تا ببیند آیا پول کافی دارد یا خیر.
بنابراین شخص میتواند یک امضای نامعتبر را ارسال کند و قرارداد MRC20 را به جای اینکه مقداری را از تابع ecrecovery برگرداند، چند پول را به آدرس ارسال میکند. این باگ همان اشکالی است که میتوان آن را به ۹،۹۹۹۳،۰۰۰ واحد توکن متیک کرد، چراکه قرارداد MRC20 پول را مستقیماً از خودش میفرستد.
بررسی تابع از آدرس مشخص میکند که آیا پول کافی برای تراکنش وجود دارد یا خیر و از این طریق به رفع باگ فوق کمک میکند.
چرا باگهای قراردادهای هوشمند تا مدتها کشف نمیشوند؟
موضوع جالب توجه در ماجرای باگ قرارداد هوشمند پالیگان این بود که بعد از حدود یک سال و نیم، این باگ فقط به فاصله چند روز توسط لئون، یک هکر کلاه سفید دیگر و یک هکر کلاه سیاه کشف شد.
اندکی مشکوک به نظر میرسد، اما تیم ایمیونیفای (Immunefi) معتقد است که چنین اتفاقی رخ میدهد. برخی از اکسلویتها (کدهای مخرب) بر اساس یک مقاله و نوشته یا به راهاندازی یک مسئله، به خاطر موضوع مورد توجه قرار میگیرند و افراد بسیاری از آسیبپذیریهای مربوط به میگردند. در نتیجه چند نفر موفق به پیدا کردن باگ میشوند.
اما در این مورد خاص احتمال قویتر این است که پالیگان در همان محدوده زمانی، قرارداد خود را روی چند ضلعی تایید کرده بود. این افراد به طور همزمان شروع به بررسی قرارداد کردهاند. البته ممکن است احتمالات دیگری هم وجود داشته باشد! به هر حال میتوانم این باگ را پیدا کنم به یک نکته آموزشی ببینیم. در ادامه به برخی مهارتهایی که پیدا کردن باگ قرارداد هوشمند و تبعا از اکوسیستم وب ۳ کمک میکند، اشاره میکنیم.
معرفی استراتژی های مهم در باگ بانتی
آیا میدانید افرادی مانند لئون در مثال یا سایرین باگ هانترها از چه مهارتهایی برای پیداکردن آسیب پذیری یا افشای باگ استفاده میکنند؟ با فرض اینکه شما اصول قراردادهای هوشمند را میدانید، نکات زیر ارائه میشود. ضمنا فراموش نکنید که زبان برنامهنویسی سالیدیتی مهمترین پیشنیاز است.
این است که از استراتژیهای زیر فقط برای هکهای اخلاقی استفاده کنید و از آسیبپذیریها به موارد دیگری گزارش دهید. همچنین توجه داشته باشید که پیدا کنید آسیب پذیری قراردادهای هوشمند کار زمانبر و طاقتفرسایی است و باید موبه مو و خط به خط تمام کدها را بررسی کنید.
پیشنهاد لکن برای پیداکردن باگ این است که ابتدا «نقاط قوت و درآوردن خود را بیابید». اما منظور او چیست؟ به عبارت دیگر باید گفت چیزی را در خود بیابید که شما را از سایر هکرها متمایز میکند. جامعه و کامیونیتی هر پلتفرم باید تمام فضای قرارداد هوشمند را پوشش دهد، بنابراین باید عملکرد بهتری را در آن انتخاب کنید.
۱. یک پروژه بیابید و باگهای آن را جستجو کنید
اولین گزینه برای یافتن باگ یک قرارداد هوشمند، اطلاع دقیق از عملکرد و دانستن جزییات پروتکل است. یک شکارچی باگ باید از ابتدا تا انتهای یک پروتکل را به درستی بفهمد. بعد از بررسی دقیق اسناد مربوطه، پروتکل خود را دوباره پیاده سازی کنید. سپس تراکنش ها را از طریق همان پروتکل در یک بلوک اکسپلورر مشاهده کنید.
۲. با توجه به یک باگ پروژه های خاص را بررسی کنید
یک راه ساده برای شکار باگ، پیداکردن باگی است که افراد زیادی از آن اطلاع ندارند. حالا باید ببنید کدام پروژهها دارای چنین باگی هستند. اجرای این استراتژی مستلزم تحقیقات زیاد است. ابتدا تمام اکسپلویتهای اولیه هوشمند و سپس نسخههای پیشرفته آن را به دقت بررسی کنید. باید ببینید آیا پروتکلهایی وجود دارند که اکسپلویتها را رعایت نمیکنند.
زمانی که باگی را در یک قرارداد هوشمند پیدا کنید، به سراغ سایر پروژهها بروید. ممکن است پروژه های دیگری نیز در برابر این باگ آسیب پذیر باشند. اطلاعات دقیق را در مورد این باگ جدید و نحوه پیداکردن آن به دست بیاورید. سپس اطلاعات خود را در یک وبلاگ یا هر نوع پستی در سایر شبکههای اجتماعی برای توسعهدهندگان قراردادهای هوشمند بنویسید تا آنها هم در صورت مواجهه با این موضوع مهم است که باید انجام دهند.
۳. سرعت عمل داشته باشید
پروژه هایی که نیازمند باگ هانتینگ هستند و میخواهند از استفاده شکارچیان باگ برای قراردادهای هوشمند خود استفاده کنند، در برنامههای باگ بانتی مانند Immunefi ثبت نام کنند. بنابراین هر چقدر زودتر از سایر شکارچیان اقدام کنید، بیشتر برای پیداکردن باگ داشته باشید.
چند راه برای سرعت عمل و اقدام قبل از وجود دیگران دارد. به عنوان مثال لئون با استفاده از فعال کردن کانال نوتیفیکیشن دیسکورد Immunifi قبل از دیگران متوجه این پروژه جدید شد. شما هم میتوانید به سایتهای نوتیفیکشن کمک کنید از ورود پروژههای جدید یا آپدیت آنها باخبر و قبل از بررسی و جستجو در کدها را شروع کنید.
۴. خلاقانه عمل کنید
نکته دیگری که لئون را از دیگران متمایز کرد، این بود که در فرومهای کامیونیتی شرکت داشت و متوجه شد که اعضای جامعه به دنبال یک باگ هستند. بنابراین لئون حتی قبل از تایید باگ بانتی، بررسی قرارداد هوشمند را شروع کرد. به این ترتیب نسبت به سایر توسعهدهندگان زمان بیشتر، زیرا آنها منتظر باگ بانتی بودند.
۵. از ابزارها برای پیداکردن باگ استفاده کنید
باگ هانترها معمولاً از ابزارهایی مانند توسعهدهنده ویژوالVSCode Solidity،Hardhat،Foundry،Brownie، Etherscan و ابزارهای متعدد دیگری استفاده میکنند.
یک استراتژی رایج برای پیداکردن باگ این است که VSCode را بارگذاری کنید. سپس کد را با استفاده از افزونه ویژوال سالیدیتی به VSCode اضافه کنید و کدها را باگ های متداول را بررسی کنید.
بعد از پیداکردن یک نقطه ضعف، باید برای آزمایش یک محیط آزمایشی را راهاندازی کنید. معمولاً میتوان از آزمایشهایی که قبلاً پروتکلها را توسعه دادند، استفاده کرد.
۶. از پروژه های آدیت غافل نشوید
ممکن است موسسات آدیت و حسابرسی هم اشتباه کنند. بهطور مثال بسیاری از پروژههایی که لئون آسیب پذیری آنها را پیدا کردهاند، پیش از این توسط شرکتهای برتر حساب، بازبینی شدهبودند.
۷. دانش خاص به این صنعت را یاد بگیرید
یکی از بزرگترین مواردی که شما را از دیگران متمایز می کند، کسب دانش تخصصی در یک حوزه خاص است. اگر در تخصص خاصی داشته باشید، بهتر میتوانید با همدیگر را بفهمید. مثلاً در مواردی که دانشآموزان فوقالعادهای در مورد آسیبپذیری قراردادهای هوشمند هستند، اما چیزی در پروژههای دیفای (DeFi) نمیدانند، پیداکردن آسیبپذیری در قراردادهای دیفای برای شما سخت است. بسیاری از توسعهدهندگان کدهای قراردادهای پروژههای دیفای را به خوبی متوجه میشوند، اما نمیتوانند اصول اولیه مالی را درک کنند.
بنابراین سعی کنید در یک حوزه خاص مانند صرافیهای غیرمتمرکز (صرافیهای غیرمتمرکز)، پروتکلهای استقراض (پروتکلهای استقراض) یا توکنهای غیرمثلی (NFT) دانش تخصصی به دست آورید. اگر در حوزه امنیت یا وب ۳ دانش و تخصص فوقالعادهای داشته باشید، نسبت به سایر شکارچیان باگ بهتر است.
سخن پایانی
امروز برنامه نویسی یکی از مشاغل پرطرفدار است، اما پیداکرن باگ در قراردادهای هوشمند به مراتب بالاتری دارد. محافظت هر اکوسیستم در برابر هک نیازمند کشف آسیب پذیریها و بگ های موجود در کدهاست. این پروژه های مختلف با ثبت نام در سایت های باغبانتی و پرداخت از افراد و متخصصان این حوزه کمک میگیرند. معمولا کلاه سفیدها یا هکرهای اخلاقی جستجو میکنند از هکرهای مخرب باگها را بیابند و دریافت کنند. مواردی که اشاره شد این افراد از استراتژی یافتن باگ استفاده میکنند. شاید شما بخواهید یک پروژه خاص یا یک باگ خاص را انتخاب کنید، اما به هر حال سرعت عمل، عملکرد خلاقانه، استفاده از ابزارهای مختلف و دانش تخصصی مسیر موفقیت شما را کوتاه تر میکند. نظر شما در مورد باگ بانتی چیست؟ آیا استراتژی های دیگری برای پیداکردن باگ در قراردادهای هوشمند میشناسید؟
خبر فوق به نقل از رسانه اسمارتک نیوز در وبسایت اسمارتک نوشته شده است در تاریخ 2023-03-18 19:32:00