هک کیف پولهای کولدکارد؛ بیش از ۱۳۰ میلیون دلار بیتکوین به سرقت رفت
مهاجمان توانستهاند به کیف پولهای بیتکوین دسترسی پیدا کنند که پیش از این غیرقابل دسترس تلقی میشدند. این کوینها در دستگاههای Coldcard، کیف پولهای سختافزاری تولیدی شرکت کانادایی Coinkite نگهداری میشدند؛ دستگاههایی که هرگز به اینترنت متصل نمیشوند. هیچ لینک فیشینگی، بدافزاری یا لپتاپ دزدیدهشدهای در کار نبوده است. مهاجمان صرفاً توانستهاند کلیدهای خصوصی را کشف کنند.
تحقیقات Galaxy Research بیش از ۱,۵۹۶ بیتکوین را که در سه موج تأیید شده به سرقت رفته، ردیابی کرده است. با احتساب موج چهارم احتمالی، مجموع این رقم به حدود ۲,۰۵۵ بیتکوین میرسد که با قیمتهای فعلی حدود ۱۳۰ میلیون دلار ارزش دارد. در یکی از این عملیاتها، ۷۰ میلیون دلار در عرض ۴۱ دقیقه جابجا شده است. شرکت Coinkite اعلام کرده که حداقل ۱۵ مهاجم جداگانه در این سرقتها دست داشتهاند.
این شرکت در تاریخ ۱ اوت (۱۰ مرداد) یک سند فنی منتشر کرد و به توضیح آنچه اشتباه پیش رفته، پرداخت. این سند به طرز غیرمعمولی صادقانه است و به طور خلاصه میتوان گفت که کیف پولها به مدت هشت سال در حال تولید اعداد تصادفی معیوب بودهاند، بدون اینکه کسی متوجه شود.
در سال ۲۰۲۱، Coinkite رمزنگاری Coldcard را به libsecp256k1 منتقل کرد؛ همان کتابخانهای که Bitcoin Core از آن استفاده میکند. این تصمیم در ظاهر درست بود، اما در مرحله ادغام، مشکل رخ داد.
این مهاجرت به طور پنهانی، تولید بذرهای اولیه (seed generation) را از مولد اعداد تصادفی سختافزاری خود Coldcard منحرف کرده و به جای آن از الگوریتم نرمافزاری جایگزین MicroPython، به نام Yasmarang، استفاده کرده است. این الگوریتم برای دستگاههایی طراحی شده که فاقد تراشه تولید اعداد تصادفی هستند.
خسارات ناشی از هک کولدکارد از ۱۰۰ میلیون دلار فراتر رفت
با اطمینان بالا، ۱,۵۹۶ بیتکوین از حدود ۷,۳۰۰ آدرس در سه موج تأیید شده به سرقت رفته است، به علاوه ۱۴ مورد کوچکتر. اگر موارد مشکوک (اما تأیید نشده) را اضافه کنیم، مجموع خسارات به ۱۳۰ میلیون دلار (۲ هزار بیتکوین) میرسد.
دلیل اصلی مشکل: یک خطای کوچک در کد
دستگاه Coldcard دارای تراشه تولید اعداد تصادفی است، اما به نظر میرسد این تراشه دیگر مورد استفاده قرار نگرفته است. دلیل این امر به طرز باورنکردنی کوچک است. یک ابزار بررسی کد (build guard) از دستور #ifndef استفاده کرده که وجود یک تنظیم را بررسی میکند، نه فعال بودن آن را. Coinkite این تنظیم را روی صفر (به معنی “خاموش”) قرار داده بود. از آنجایی که صفر همچنان به عنوان یک مقدار تعریف شده محسوب میشود، بررسی ایمنی با موفقیت انجام شده و ساخت کد تکمیل شده است. هر دو نسخه تابع، امضاهای یکسانی داشتند، بنابراین هیچ چیز غیرعادی به نظر نمیرسید.
شرکت Coinkite در این باره نوشته است: “بخش عمدهای از تصادفی بودن در COLDCARD از یک مولد اعداد شبه تصادفی (PRNG) تأمین میشد که من نمیدانستم واقعاً در پایگاه کد منبع وجود دارد.” مولدهای اعداد شبه تصادفی، اعدادی را تولید میکنند که ظاهراً تصادفی هستند اما از یک دستورالعمل ثابت از یک مقدار اولیه پیروی میکنند.
اگر دستورالعمل یکسان با همان مقدار اولیه تغذیه شود، خروجی همیشه یکسان خواهد بود.
در دستگاههای Mk2 و Mk3 با سیستمعاملهای ۴.۰.۱ تا ۴.۱.۹، مقدار اولیه از شماره سریال تراشه و ساعت آن گرفته میشد. Coinkite تخمین میزند که فضای جستجوی حاصل حدود ۴۰ بیت بوده است. مدلهای جدیدتر کمی آنتروپی از عنصر امن (secure-element) را نیز اضافه کردهاند که این رقم را به حدود ۷۲ بیت افزایش داده است.
هیچکدام از این اعداد به ۱۲۸ بیت، که هدف مورد نظر است، نمیرسد.
این اختلاف مهمتر از آن چیزی است که به نظر میرسد. بیتها توان هستند. فضای جستجوی ۱۲۸ بیتی، ترکیبات بیشتری نسبت به تعداد اتمهای موجود در جهان قابل مشاهده دارد و هیچکس قادر به جستجوی آن نیست. چهل بیت حدود یک تریلیون است؛ عددی که یک لپتاپ معمولی میتواند آن را پردازش کند. هر بیت از دست رفته، کار مورد نیاز را نصف میکند.
تیم مهندسی Block، که تحلیل خود را منتشر کرده، فضای جستجوی مؤثر عنصر امن در دستگاههای جدیدتر را ۲ به توان ۳۲ نامزد و به طور متوسط حدود ۲ به توان ۳۱ آزمایش تخمین زده است. ارزیابی آنها برای بردهای قدیمیتر صریحتر است: برای یک شناسه دستگاه، وضعیت تایمر و تاریخچه تماس مشخص، تولید کیف پول قطعی (deterministic) است.
و قطعی بودن، دقیقاً مخالف تصادفی بودن است که برای رمزنگاری ضروری است.
Coinkite گمان میکند که این مشکل توسط ماشین کشف شده است. این شرکت نوشته است: “ما باید فرض کنیم که کسی از هوش مصنوعی برای بررسی نسخههای قبلی سیستمعامل ما استفاده کرده و به این مشکل برخورده است.” آنها افزودند که اخیراً یکی از بهترین مدلهای هوش مصنوعی موجود را روی همین کد اجرا کردهاند و هیچ چیز پیدا نکردهاند. “مهاجمان و مدافعان هر دو از ابزارهای هوش مصنوعی یکسانی استفاده میکنند، اما امروز این ابزار به ما کمکی نکرد و فقط به نفع افراد بدکار بود.”
سیستمعامل اصلاح شده برای تمام مدلهای تحت تأثیر منتشر شده است. این بهروزرسانی بذرهای موجود را ترمیم نمیکند؛ آن کیف پولها باید دوباره تولید شده و وجوه آنها منتقل شوند. Decrypt پیش از این چگونگی تغییر ذخیرهسازی هوا-ایزوله (air-gapped) پس از چنین بهرهبرداری و افزایش خسارات به بیش از ۱۱۴ میلیون دلار را پوشش داده است.
آنتروپی: معیاری از عدم قطعیت
آنتروپی معیاری است از اینکه مهاجم چقدر نمیداند. به عبارت دیگر، اساساً عدم قطعیت است که بر حسب بیت شمارش میشود. یک بیت معادل یک پرتاب سکه است: دو نتیجه، و یک حدسزننده نیمی از مواقع درست حدس میزند. ده بیت برابر با ۱,۰۲۴ نتیجه است. هر بیت، حجم کار حدسزننده را دو برابر میکند.
کیف پول بیتکوین یک عدد بسیار بزرگ است که مخفی نگه داشته میشود. آدرسی که افراد کوینها را به آن ارسال میکنند، از طریق ریاضی از آن مشتق میشود و این مشتق فقط در یک جهت عمل میکند – شما میتوانید از کلید به آدرس بروید، اما هرگز برعکس.
بنابراین، امنیت هر کیف پول بر یک سؤال متکی است: مهاجم باید چند عدد را امتحان کند؟
اگر عدد با ۱۲۸ بیت آنتروپی انتخاب شده باشد، پاسخ این است: “بیشتر از آنچه فیزیک اجازه میدهد.” اگر با ۴۰ بیت انتخاب شده باشد، پاسخ این است: “کمی وقت به من بدهید.”
این همان ویژگی است که تهدید محاسبات کوانتومی را قابل بحث میکند – یک ماشین کوانتومی به ریاضیاتی حمله میکند که کلید را به آدرس مرتبط میکند. باگ Coldcard هرگز نیازی به این کار نداشت. این باگ، کلیدها را قابل حدس میزد، پیش از آنکه آن ریاضیات درگیر شود.
اینجاست که واژگان لغزنده میشود. یک مولد اعداد شبه تصادفی خروجی تولید میکند که از آزمونهای آماری برای تصادفی بودن عبور میکند، بنابراین اساساً چیزی نیست که یک صفحه گسترده آن را پرچمگذاری کند. این خروجی همچنان به طور کامل توسط مقدار اولیه آن تعیین میشود. تصادفی به نظر میرسد، اما نیست.
تصادفی بودن آماری و غیرقابل پیشبینی بودن رمزنگاری، دو خاصیت متفاوت هستند و خروجی Coldcard از آزمون اول با موفقیت عبور میکرد، اما در آزمون دوم کاملاً شکست میخورد.
تصادفی بودن واقعی باید از نویز فیزیکی ناشی شود: لرزش الکتریکی در یک مدار، نوسانات حرارتی، واپاشی رادیواکتیو. تراشه سختافزاری در Coldcard برای همین منظور بود. این همان تراشهای است که پرچم ساخت کد آن را قطع کرده بود.
تاسها، راه حل یا دام؟
همانطور که کاربران برای تولید مجدد بذرها عجله داشتند، بسیاری به سراغ راه حل ساده و کمتکنولوژی رفتند. Coldcard به شما اجازه میدهد تاسهای فیزیکی را بیندازید و نتایج را به عنوان آنتروپی وارد کنید. راهنمایی خود Coinkite، بذر تولید شده با حداقل ۵۰ پرتاب مستقل و خصوصی تاس را در برابر باگ ایمن میداند.
ممکن است احمقانه به نظر برسد، اما این شرکت در واقع یک کیسه حاوی “۱۰۰ تاس کوچک و بامزه” میفروشد تا این فرآیند را برای شما آسانتر کند.
در ۳۱ ژوئیه (۹ مرداد)، لوک دشجر، توسعهدهنده Bitcoin Core، هشداری منتشر کرد: “تعداد زیادی از افراد پیشنهاد استفاده از تاس برای کاهش آسیبپذیری Coldcard را میدهند. توجه داشته باشید که تاسهای معمولی برای امنیت رمزنگاری طراحی نشدهاند. اگر قصد انجام این کار را دارید، احتمالاً باید تاسهای دقیق کازینویی بخرید. و حتی در این صورت، منبع دیگری از آنتروپی داشته باشید.”
توییتر بیتکوین با آرامش با این موضوع برخورد نکرد.
یکی از کاربران نوشت: “هاها، حالا دیگر نمیتوانید تاس هم بیندازید. خودحفاظتی تمام شد…” دیگری پرسید که آیا باید کسی را با پارکینسون استخدام کند تا تاسها را بیندازد؟ (کار جالبی نبود.)
احتمالاً مفیدترین پاسخ، پاسخی بود که با محاسبات همراه بود. جاستین شارپ، توسعهدهنده، اعداد را محاسبه کرد که هر تاس معیوب چقدر هزینه دارد:
“زیادهروی است. یک تاس شش وجهی کامل در هر پرتاب ۲.۵۸۵ بیت آنتروپی میدهد. یک تاس با انحراف قابل توجه، مثلاً با یک وجه که ۲۰٪ مواقع به جای ۱۶.۷٪ فرود میآید، همچنان حدود ۲.۵۵ بیت میدهد. در ۹۹ پرتاب، این تفاوت بین حدود ۲۵۶ بیت و حدود ۲۵۲ بیت آنتروپی است.”
چهار بیت از ۲۵۶ بیت. این کل جریمه برای یک تاس با انحراف قابل مشاهده است.
دشجر در این مورد اشتباه نمیکند که تاسهای ارزان قیمت انحراف قابل اندازهگیری دارند – پینهای قالبگیری شده پلاستیک مقادیر متفاوتی از هر وجه را حذف میکنند، دقیقاً به همین دلیل است که کازینوها از تاسهای دقیق و همسطح استفاده میکنند. او در مورد فیزیک درست میگوید، اما در مورد اهمیت موضوع اشتباه میکند. از دست دادن چهار بیت از ۲۵۶ بیت، شما را در ۲۵۲ بیت قرار میدهد. باگ Coldcard کاربران را در ۴۰ بیت قرار داده بود.
با این حال، استدلال قویتری در توصیه او نهفته است، و آن در مورد تلورانس تولید نیست. بلکه در مورد عدم اعتماد به یک منبع واحد است. شکست Coldcard این نبود که آنتروپی آن کمی منحرف شده بود – بلکه این بود که یک جزء به طور خاموش کار نمیکرد و هیچ چیز آن را تشخیص نداد.
اگر بذری را در یک Coldcard تحت تأثیر، بدون پرتاب تاس (واقعاً) یا یک عبارت عبور قوی BIP-39 تولید کردهاید، آن بذر در معرض خطر است.
سیستمعامل را بهروزرسانی کنید، یک بذر جدید تولید کنید، اثر انگشت (fingerprint) را تأیید کنید، یک تراکنش آزمایشی ارسال کنید، و سپس همه چیز را منتقل کنید. راهنمایی Coinkite این مراحل را برای هر مدل توضیح میدهد. بذرهای صادر شده، نقص را با خود حمل میکنند – انتقال یک بذر معیوب به یک برنامه کیف پول دیگر مشکلی را حل نمیکند.
برای بقیه، نکته این نیست که کیف پولهای سختافزاری خراب هستند یا تاسها یک دام هستند.
بلکه این است که “تصادفی” یک ادعا است و ادعاها نیاز به بررسی دارند. کد منبع Coldcard در تمام این مدت عمومی بود. مولد سختافزاری مورد نظر دقیقاً در باینری وجود داشت. بازبینان وجود آن را تأیید کردند، اما هرگز تأیید نکردند که مولد بذر واقعاً آن را فراخوانی کرده است.
هشت سال ممیزی به کد صحیح نگاه کرده بود. هیچکس بررسی نکرد که آیا واقعاً اجرا میشود یا خیر.