قراردادهای هوشمند دلار جمینای، بستری برای سرقت
دوقلوهای وینکلوس بابت خسارت 65 میلیون دلاری که سال 2008 از مارک زاکربرگ به خاطر سرقت ایدهی آنها برای شبکهی اجتماعیِ فیسبوکش گرفتند معروف هستند. در سال 2013، این دو برادر به طور خیلی جدی روی بیتکوین سرمایهگذاری کردند و هماکنون 1 درصد از کل بیتکوینهای موجود (که هر یک 120 دلار قیمت دارد) متعلق به آنهاست.
کمی بعد، این دو برادر صرافی رمزاارز جمینای را افتتاح و در سال 2018، دلار جمینایِ استیبلکوین[1] را تحت عنوان GUSD راهاندازی نمودند. 1 توکن GUSD همیشه قیمتش 1 دلار آمریکایی است. استیبلکوینها برای «دیجیتالی کردنِ» دلارهای واقعی بسیار به کار میآیند. آنها مبادلات دلاریِ بلاکچین را بین صرافیها سریع و آسان میکنند. ضامن تبدیل معکوس به دلار شرکتی است که آنها را صادر کرده و به شما فروخته است. ما تحت سرویس Kaspersky Smart Contract Source Code Review خود، قرارداد هوشمندی را مورد تحلیل و بررسی قرار دادیم که عملکرد GUSD را دارد و ما در آن نقصی شناسایی کردیم.
- بیانیه رفع مسئولیت
توجه داشته باشید قرارداد هوشمند مربوطه از قبل مورد تحلیل قرار گرفته بوده، هرچند نمیدانیم نقایص کد در گزارش شرح داده شده بود یا خیر. در راستای سیاست Responsible Disclosure[2] خود، با تیم امنیتی جمینای تماس گرفتیم تا مشکل را به ما گزارش دهند. چیزی که به ما اطلاع دادند این بود که این مشکل در طول فاز طراحی پیش آمد اما هیچ خطری برای GUSD نداشت. در ادامه قصد داریم تا به شما نشان دهیم قراردادهای هوشمند چطور کار میکنند. پس با ما همراه شوید.
- قراردادهای هوشمند دلار جمینای
اگر بخواهیم به طور کلی صحبت کنیم، وقتی فردی میخواهد بر اساس بلاکچین اتریوم توکنهای جدید بسازد، قرارداد هوشمندی (یک مینیبرنامه) را که موارد زیر را مشخص میکند مینویسد:
• داده (این توکنها در فلان آدرس هستند)
• متودها (لطفاً توکنهای من را به فلان آدرس انتقال بده)
سازندگان سیستم دلار همچنین موارد زیر را اجرا کردند:
• آنها این قرارداد را به سه مؤلفه جدا کردند: پروکسی (رابط دائمیای که با آن، صاحبان توکن میتوانند عملیاتهای خود را اجرا کرده و به تعامل بپردازند) ، انبار (نقشهبرداری از ماندهحساب صاحبان توکن) و Impl (منطق اصولی).
• آن مؤلفه که منطق کار را شرح میدهد میتواند با ویژگیهای جدیدی همچون توانایی در فریز کردن وجوه، تأمین و آپدیت گردد. علاوه بر این، اطلاعات و رابط باقیمانده بدونتغییر باقی خواهد ماند. آپدیت برای همه شفاف و روشن است.
• برای آپدیت کردن و تحت نظارت قرار دادن، از یک قرارداد هوشمند «متولی» که متولیان مختلفی برای ارائهی سطح حفاظتی بیشتر به آن مدیریتش میکنند، استفاده میشود. اگر متولیای اقدامی را پیشنهاد دهد، بقیه باید پیش از آنکه آن اقدام رخ دهد آن را تأیید کنند.
این امور ارتقابخشی دقیق بوده و در نهایت به افزایش کلی میزان امنیت و انعطافپذیری خواهد انجامید.
- پرداختیهای آنتیاسپم
اگر کسی غیر از متولی اصلی وارد طرح پیشنهادی قرارداد متولی شود باید 1 اتریوم سهم پرداخت کند (حدود 200 دلار به نرخ ارز فعلی). همانطور که در نظرات خود قرارداد بدان اشاره شده، این اقدام آنتیاسپمی هدفش منصرف کردن شرکتکنندگان از درخواست دادنهای بسیار است. پرداختیهای آنتیاسپم در نهایت به سمت یک نفر سوق داده خواهد شد: همان فردی که تأیید یک درخواست/طرح را اعلام میکند. این اجراییه شاید چندان هم منصفانه به نظر نرسد اما کامنتها کاملآً نشان میدهد سازندگان آن بدین روش آن را متقاعد کردند.
} else {
if (address(this).balance > 0) {
// reward sender with anti-spam payments
// ignore send success (assign to ʹsuccessʹ but this will be overwritten)
success = msg.sender.send(address(this).balance);
ما به نوبه خود، استفاده از رویکرد Solidity Withdrawal Pattern را توصیه میکنیم.
- مهاجمین در حملهی سبک Front-running میتوانند تمام پرداختیهای آنتیاسپم را سرقت کنند
فردی که تأیید درخواست را تعیین میکند همچنین تمام پرداختیهای اتریومِ آنتیاسپم را نیز دریافت مینماید. او برای انجام این کار، تابع completeUnlock قرارداد هوشمد را فراخوان (Call) میکند و امضاهای دو متولی را در پارامترها میپذیرد. مشکل این است که اتریوم درست مانند هر بلاکچین دیگری درخواستها را با تأخیر اجرا میکند. تراکنش مشتری (خواه انتقال وجه باشد و خواه فراخوان کردن یک تابع[3]) مدتی در صف انتظار میماند (معمولاً 15 ثانیه یا طولانیتر). در طول این مدتزمان قطعاً هر کسی میتواند نقل و انتقالات برنامهریزیشدهی سایر کاربران اتریومی را (شامل مقادیر، دریافتکنندگان و پارامترها) مشاهده نماید. و افراد نامحرم در این میان میتوانند از چنین اطلاعاتی برای ساخت تراکنش خود و هل دادن آن به جلو از طریق پرداخت کمیسیون بیشتر به ماینر استفاده کنند.
ار مزیتی که از طریق چنین روش موذیانهای بدست آید حملهی نوع front-running محسوب میشود.
به نقل از investopedia.com:
Front-running زمانی رخ میدهد که یک کارگزار یا هر نهاد دیگری وارد تجارت میشود زیرا از پیش از تراکنش بزرگِ عمومینشدهای اطلاع دارد؛ تراکنشی که قیمت دارایی را تحتالشعاع قرار خواهد داد و در برای کارگزار سود مالی بالایی را رقم خواهد زد. همچنین این حمله زمانی صورت میگیرد که کارگزار و یا تحلیلگر برای اکانت خود زودتر از توصیهی خرید یا فروش شرکت خود به کلاینتها، دست به خرید یا فروش سهم بزند.
در مورد کنونی ما، یک فرد کاملاً بیگانه میتواند رباتی را راهاندازی کند تا قرارداد متولی را تحت نظارت قرار دهد. اگر ببیند کسی تابع completeUnlock را فراخوان کرد (یعنی تعامل متولی با دلار جمینای) بلافاصله همهی پارامترها را کپی کرده و تابع را برای استخراج اتری که آنجا جمعشده است فرامیخواند.
به منظور مقابله با چنین حملهای بار دیگر توصیهی ما به شما این است که از رویکرد محبوب Solidity Withdrawal Pattern استفاده کنید. از اینها مهمتر اینکه توصیه میکنیم نگذارید افراد بیگانه تابعی که مخصوص متولیهاست را فراخوانند.
- اجرای عملیِ یک حمله
گرچه در تئوری چیز ترسناکی به نظر میرسد اما آسیبپذیری شناساییشده در عمل نسبتاً خوشخیم است. میپرسید چرا؟ به دلایل زیر:
• پرداختیهای آنتیاسپم برای متولان چنین سرمایهگذاری بزرگی مانند دلار جمینای تا حدی به دغدغه تبدیل شده است. جمعآوری سرمایه GUSD (حجم کلی توکنهای صادرشده) در یک مقطع زمانی به 100 میلیون دلار رسید. حتی همین الان هم از 5 میلیون دلار تجاوز کرده است.
• پرداختیهای آنتیاسپم هنوز در این قرارداد ظاهر نشدهاند و شاید هرگز هم چنین چیزی صورت نگیرد، زیرا متولی اصلی هیچ رقمه موظف به واریز آنها نیست (بقیه متولیها ملزم به این کار هستند).
• کاربران با علم به این آسیبپذیری میتواند براحتی جلوی تابع آسیبپذیر را گرفته و یا قرارداد را آپدیت کنند.
• در طول این بازنگری و تحلیل، متوجه شدیم هیچ آسیبپذیریای که بخواهد توکنهای GUSD را تهدید کند وجود ندارد.
نظرات این دو برادر دوقلو: «ما این طرح را انتخاب کردیم چون جمینای نمیخواهد اتر را تحت شرایط عادی به خطر بیاندازد و در نتیجه تصمیمی ریسکدار گرفتیم و آن تصمیم هم این بود که پیچیدگی پایگاه کدمان را صرفاً جهت منافع غیرمادیِ مکانیزمی قویتر بیشتر نکنیم. اولویتبندی کدی ساده و مطمئن همچنان بهترین راهحل برای دلار جمینای و کاربرانش است. در آینده اگر خطر، تغییر مسیر داد و قراردادی هزینهبردارتر و پیچیدهتر به راهحل خوبی تبدیل شد روی این تصمیم تجدیدنظر خواهیم کرد».
ما تصمیم گرفتیم این پست را با هماهنگی جمینای نشر دهیم و مد نظرمان این مسئله بود که شرایط آنتیاسپم تنها بواسطهی ترکیبی از موقعیتهای خاص و غیرممکن است که به خطر میافتد و اینکه GUSD در معرض خطر نیست. باری دیگر به همه یادآوری میکنیم که باید رویکرد جامع امنیتی برای ICOها و سایر فعالیتهای مرتبط با رمزارزها و بلاکچینها اتخاذ کنند.
[1] استیبل کوین یک ارز دیجیتال با قیمت ثابت است. قیمت اکثر ارزهای دیجیتال توسط بازار تعیین میشود که در آن خریداران و فروشندگان کوینها را مبادله میکنند و قیمت بر حسب عرضه و تقاضا مشخص میشود. در مقابل، استیبل کوین ها به دنبال دستیابی به قیمت ثابت میباشند.
[2] در بخش امنیت کامپیوتر یا جای دیگر، responsible disclosure یک مدل افشاسازیِ آسیبپذیری است که در آن، یک آسیبپذیری یا نقص در همان زمان تخصیصدادهشده برای پچ کردن آن آسیبپذیری و یا برطرفسازی نقص افشا میشود.
[3] Calling a function
منبع: کسپرسکی آنلاین
تنظیم: روابط عمومی شرکت ایدکو (توزیع کننده محصولات کسپرسکی در ایران)؛
- ۹۸/۱۰/۰۷