هک DAO؛ باگی که اتریوم را دو تکه کرد
برای ثبت سفارش به حساب نیاز دارید. ثبت نام رایگان است.
در تابستان ۲۰۱۶ اتریوم یک ساله بود و بزرگ ترین پروژه ای که رویش ساخته شده بود، یک صندوق سرمایه گذاری بدون مدیر به اسم The DAO بود. قرار بود سرمایه گذاران روی پروژه ها رای بدهند و کد، خودش پول را جابه جا کند.
هفده ژوئن آن سال، کسی شروع کرد به بیرون کشیدن پول. تا وقتی جلویش گرفته شد، بیش از ۳.۶ میلیون اتر رفته بود.
ده سال گذشته و این ماجرا هنوز مهم ترین اتفاق تاریخ اتریوم است، نه به خاطر مبلغش، بلکه به خاطر تصمیمی که بعدش گرفته شد.
قرارداد The DAO تابعی داشت که به سرمایه گذار اجازه می داد سهمش را بیرون بکشد. آن تابع دو کار می کرد و ترتیبشان غلط بود:
- اول اتر را به آدرس مقصد می فرستاد.
- بعد موجودی آن آدرس را در دفتر داخلی خودش صفر می کرد.
حالا نکته کلیدی: در اتریوم، فرستادن اتر به یک آدرس می تواند کدی را روی آن آدرس اجرا کند. مهاجم قراردادی نوشت که به محض دریافت اتر، دوباره همان تابع برداشت را صدا می زد. چون هنوز به مرحله دوم نرسیده بودیم، دفتر داخلی هنوز می گفت این آدرس طلبکار است. و دوباره. و دوباره.
به این الگو ورود مجدد یا reentrancy می گویند و هیچ چیز پیچیده ای در آن نیست. کل ماجرا یک ترتیب اشتباه بود.
یک نکته که معمولا از قلم می افتد: قرارداد The DAO برای برداشت یک دوره قفل بیست و هشت روزه داشت. همان قفل بود که به جامعه فرصت فکر کردن داد. اگر آن بند نبود، اصلا بحثی درباره فورک شکل نمی گرفت.
حالا سوال اصلی: بلاکچینی که کل ادعایش تغییرناپذیری است، وقتی یک سوم دارایی بزرگ ترین برنامه اش دزدیده می شود، چه کند؟
دو جواب روی میز بود و هر دو بد بودند.
کاری نکنیم. اصل تغییرناپذیری حفظ می شود و همان اول کار، بخش بزرگی از سرمایه گذاران و اعتماد به شبکه از بین می رود.
فورک کنیم. پول برمی گردد و همان اصلی که شبکه رویش بنا شده بود، در اولین آزمون جدی اش کنار گذاشته می شود.
اول یک راه حل میانی به اسم فورک نرم مطرح شد که خودش آسیب پذیری داشت و کنار گذاشته شد. در نهایت رای گیری برگزار شد و بر اساس گزارش خود بنیاد اتریوم، بیش از ۸۵ درصد آرا به فورک بود.
هارد فورک در بیستم ژوئیه ۲۰۱۶ روی بلاک شماره ۱۹۲۰۰۰۰ اجرا شد. اترها به قراردادی منتقل شدند که هر کس به ازای هر صد توکن DAO می توانست یک اتر از آن برداشت کند.
بخشی از ماینرها فورک را نپذیرفتند. استدلالشان فنی بود نه احساسی: باگ در پروتکل اتریوم نبود، در یک قرارداد کاربر بود، و شبکه نباید به خاطر اشتباه یک برنامه، دفتر کلش را عوض کند.
آنها روی زنجیره قدیمی ماندند و آن زنجیره شد اتریوم کلاسیک. یعنی برخلاف تصور رایج، اتریوم کلاسیک زنجیره جدید نیست؛ زنجیره قدیمی است و اتریوم امروزی همان شاخه ای است که جدا شد.
یک پیامد فنی هم داشت که تا امروز روی هر تراکنش اثر دارد: بعد از انشعاب، یک تراکنش امضاشده روی یکی از دو زنجیره را می شد روی دیگری هم پخش کرد. راه حلش چند ماه بعد در فورک اسپیوریوس دراگون آمد و شناسه زنجیره را وارد امضا کرد. داستان کامل انشعاب ها را در فهرست انشعاب های مهم شبکه اتریوم و هویت خود آن زنجیره را در پرونده پیدایش اتریوم کلاسیک آورده ایم.
درس رایجی که از این ماجرا نقل می شود این است: «قراردادها را حسابرسی کنید». درست است ولی سطحی است.
درس واقعی این است که تغییرناپذیری در اتریوم یک ویژگی ریاضی نیست، یک توافق اجتماعی است. کد تا وقتی تغییرناپذیر است که اکثریت شبکه بخواهد. در ۲۰۱۶ نخواستند و عوضش کردند.
این را می شود نقطه ضعف دانست یا نقطه قوت. موضع ما این است که واقع بینانه ترین برداشت، پذیرفتن خود واقعیت است: اگر دارایی تان روی شبکه ای است، دارید به دو چیز اعتماد می کنید، نه یکی. به کد، و به جامعه ای که می تواند کد را تغییر دهد.
و درس دوم که فنی است: همان الگوی ورود مجدد امروز هم زنده است. راه حلش سال هاست شناخته شده و ساده است. اول دفتر داخلی را به روز کن، بعد پول را بفرست. هر جای دیگری که این ترتیب رعایت نشود، همان حفره ۲۰۱۶ دوباره ساخته شده. بیشترین ضررهای امروز هم از همین دست باگ ها می آید و نه از شکستن رمزنگاری؛ تفکیکش را در تحلیل جایی که پول در قراردادها از بین می رود نوشته ایم.
«حمله DAO باعث رفتن اتریوم به اثبات سهام شد.» نه. مرج شش سال بعد و به دلایل کاملا متفاوتی انجام شد. ربط دادن این دو، دو رویداد بی ارتباط را به هم می چسباند.
«فورک، پول همه را برگرداند.» دقیق نیست. قراردادی ساخته شد که دارندگان توکن DAO می توانستند از آن برداشت کنند. کسی که توکنش را قبلا فروخته بود یا آدرسش را از دست داده بود، چیزی نگرفت.
اگر سرمایه گذار عادی هستید و قصد نوشتن قرارداد ندارید، دو نتیجه عملی از این ماجرا برایتان می ماند.
اول اینکه پول گذاشتن در یک قرارداد هوشمند، با نگه داشتن دارایی در کیف پول خودتان یکی نیست. در حالت دوم فقط به شبکه اعتماد کرده اید؛ در حالت اول به شبکه و به کد آن برنامه و به تیمی که نوشته اش. سه اعتماد به جای یکی.
دوم اینکه «قرارداد حسابرسی شده» تضمین نیست. The DAO هم بررسی شده بود و چند نفر حتی پیش از حمله درباره همین الگو هشدار داده بودند. حسابرسی احتمال خطا را کم می کند، صفر نمی کند.
نرخ لحظه ای و شرایط سفارش اتر در میز سفارش اتر با تسویه همان روز است، و برای همان زنجیره قدیمی هم میز خرید و فروش اتریوم کلاسیک جداگانه وجود دارد. اگر ترجیح می دهید تسویه را از مسیر ارزی انجام دهید، خرید ووچر برای تامین موجودی گزینه دیگری است.
گوگل روی این عبارت نه بخش «مردم همچنین می پرسند» دارد و نه جستجوی مرتبط؛ نتایجش کاملا ارگانیک است. این سوال ها بر اساس چیزی نوشته شده که صفحه های بالای همین نتیجه به آن جواب می دهند.
هک DAO دقیقا چه بود؟
سو استفاده از یک اشتباه ترتیبی در قرارداد The DAO که اجازه می داد مهاجم پیش از صفر شدن موجودی اش، دوباره درخواست برداشت بدهد. بیش از ۳.۶ میلیون اتر به این روش منتقل شد. شبکه اتریوم هک نشد؛ یک برنامه روی آن هک شد.
چرا اتریوم به دو شبکه تقسیم شد؟
چون جامعه بر سر واکنش به این حمله دو دسته شد. اکثریت به هارد فورکی رای دادند که وجوه را قابل بازگشت کرد و در بیستم ژوئیه ۲۰۱۶ روی بلاک ۱۹۲۰۰۰۰ اجرا شد. اقلیتی که فورک را قبول نکردند روی زنجیره قدیمی ماندند و آن زنجیره امروز اتریوم کلاسیک نام دارد.
آیا پول سرمایه گذاران برگشت؟
برای کسانی که هنوز توکن DAO داشتند بله. قراردادی ساخته شد که به ازای هر صد توکن، یک اتر قابل برداشت بود. کسانی که توکنشان را قبلا واگذار کرده بودند از این مسیر چیزی دریافت نکردند.
آیا چنین حمله ای امروز هم ممکن است؟
بله، و هنوز اتفاق می افتد. زبان و ابزارها بهتر شده اند ولی خود الگو از بین نرفته. هر قراردادی که قبل از به روزرسانی وضعیت داخلی اش پول بفرستد، همان حفره را دارد؛ فرقی نمی کند در چه سالی نوشته شده باشد.
هک DAO یک باگ ساده در یک قرارداد بود که به بزرگ ترین بحران هویتی تاریخ بلاکچین تبدیل شد. چیزی که از آن باقی مانده دو زنجیره است، یک الگوی امنیتی که هنوز باید یادش داد، و یک واقعیت ناراحت کننده درباره تغییرناپذیری.
اتریوم کلاسیک هنوز وجود دارد و همین وجود داشتنش، مدرک زنده آن اختلاف است. زنجیره ای که فورک نکرد، هنوز دارد بلاک می سازد.
منابع اولیه: تاریخچه رسمی انشعاب DAO در سایت اتریوم و راهنمای امنیت قراردادهای هوشمند اتریوم.