سرقت ۱۱۶ میلیون دلاری از کول کارد با یک خط کد قدیمی

یک خط تنظیمات در فریمور کیف پول سخت‌افزاری کول کارد (Coldcard) که از مارس ۲۰۲۱ فعال بود، باعث شد این دستگاه‌ها به‌جای استفاده از تراشه اختصاصی تولید عدد تصادفی، به یک منبع ضعیف‌تر برای تولید seed متکی شوند. این مشکل برای پنج سال شناسایی نشد تا اینکه مهاجمان توانستند seedهای ضعیف را با حمله brute-force پیدا کنند و هزاران آدرس بیت‌کوین را خالی کنند.

بر اساس گزارش بخش فارسی صرافی اوربیت، این حمله در نهایت به سرقت ۱,۸۱۶ بیت‌کوین از بیش از ۵,۲۰۰ آدرس در چهار موج حمله منجر شد و به‌عنوان بزرگ‌ترین سوءاستفاده از کیف پول سخت‌افزاری در تاریخ کریپتو مطرح شده است.

کاربران کول کارد اشتباه نکردند؛ مشکل از تولید کلید بود

در این حمله، کاربران فریب فیشینگ نخوردند، دستگاهی از آن‌ها دزدیده نشد و عبارت بازیابی خود را در جای ناامن ذخیره نکردند. مشکل اصلی این بود که کیف پول Coldcard برای چند سال، کلیدهای خصوصی ضعیف تولید کرده بود؛ آن هم به‌دلیل یک تنظیم اشتباه در فریمور.

این موضوع بحران بزرگی برای مدل خودحضانتی بیت‌کوین ایجاد کرد، زیرا بسیاری از قربانیان از کاربران بسیار محتاط و امنیت‌محور بودند؛ کسانی که دقیقاً طبق توصیه‌های امنیتی عمل کرده بودند.

ماجرای build flag چه بود؟

مشکل فنی از یک ماکرو در فریمور Coldcard به نام MICROPY_HW_ENABLE_RNG شروع شد. این مقدار روی صفر تنظیم شده بود، چون شرکت Coinkite از wrapper اختصاصی خود برای تولید عدد تصادفی سخت‌افزاری استفاده می‌کرد.

اما کتابخانه رمزنگاری libngu فقط بررسی می‌کرد که این ماکرو وجود دارد یا نه؛ نه اینکه واقعاً فعال است یا خیر. به همین دلیل، با وجود اینکه ماکرو وجود داشت اما مقدار آن صفر بود، کتابخانه تصور کرد تولیدکننده عدد تصادفی سخت‌افزاری در دسترس نیست و به fallback نرم‌افزاری Yasmarang در MicroPython برگشت.

این fallback از شماره سریال تراشه و رجیسترهای زمانی مقداردهی اولیه می‌شد و پس از شروع کار، entropy تازه و امن جمع‌آوری نمی‌کرد.

کاهش خطرناک قدرت seed کول کارد؛ از ۱۲۸ بیت به ۴۰ بیت

یک عبارت بازیابی ۱۲ کلمه‌ای BIP-39 باید ۱۲۸ بیت entropy داشته باشد؛ سطحی که brute-force کردن آن عملاً غیرممکن است. اما در این نقص، seedهای تولیدشده توسط fallback نرم‌افزاری در مدل‌های Mk3 حدود ۴۰ بیت entropy مؤثر داشتند.

در مدل‌های Mk4، Mk5 و Q نیز مقدار entropy مؤثر حدود ۷۲ بیت برآورد شده بود؛ عددی که بهتر از ۴۰ بیت است، اما همچنان بسیار پایین‌تر از امنیت استاندارد ۱۲۸ بیتی محسوب می‌شود.

۴۰ بیت یعنی حدود یک تریلیون حالت ممکن. این عدد برای انسان بسیار بزرگ به نظر می‌رسد، اما برای یک کلاستر GPU امروزی قابل جست‌وجو است. مهاجم نیازی به دسترسی فیزیکی به دستگاه یا شنود ارتباطات نداشت؛ کافی بود seedهای احتمالی را تولید کند، آدرس‌های بیت‌کوین مربوط به آن‌ها را بسازد و با بلاکچین عمومی مقایسه کند.

چه کیف پول های کول کارد در معرض خطر بودند؟

این نقص از فریمور نسخه 4.0.1 در مارس ۲۰۲۱ وارد شد و تا انتشار وصله اضطراری در ۳۱ جولای ۲۰۲۶ باقی ماند. طبق متن، هر seed که در این بازه پنج‌ساله بدون استفاده از روش دستی dice-roll ساخته شده باشد، می‌تواند در معرض خطر باشد.

Coinkite گفته اگر کاربران هنگام ساخت seed حداقل ۵۰ بار تاس فیزیکی انداخته و نتایج را وارد کرده باشند، این مسیر آسیب‌پذیر دور زده شده است. همچنین استفاده از یک passphrase قوی BIP-39 می‌تواند یک کیف پول جدا ایجاد کند که فقط با seed words قابل دسترسی نیست.

با این حال، انتقاد اصلی این است که نمی‌توان از اکثر کاربران انتظار داشت برای امنیت پایه، حتماً تاس فیزیکی بیندازند.

چهار موج حمله و سرقت میلیون‌ها دلار بیت‌کوین

حمله در چند موج انجام شد. موج اول در ۳۰ جولای حدود ساعت ۲:۱۴ بامداد UTC آغاز شد و مهاجم در ۲۵ دقیقه، ۵۹۴ بیت‌کوین را از حدود ۵۰۰ آدرس خارج کرد.

در موج دوم، مجموع سرقت به ۱,۰۸۲ بیت‌کوین از ۱,۱۹۶ آدرس رسید. الگوی تراکنش‌ها به موج اول شباهت داشت و Galaxy Research احتمال داد همان مهاجم پشت این مرحله نیز بوده است.

در موج سوم، مجموع تأییدشده به ۱,۳۶۷ بیت‌کوین از ۴,۵۸۵ آدرس رسید که حدود ۸۹ میلیون دلار ارزش داشت. با این حال، الگوی تراکنش‌ها در این موج متفاوت بود و احتمال چند مهاجم مطرح شد.

موج چهارم مشکوک نیز در ۴ آگوست گزارش شد که طبق برآورد اصلاح‌شده Galaxy، حدود ۴۴۹ بیت‌کوین از ۷۰۹ آدرس خارج شده بود. اگر این موج تأیید شود، مجموع زیان می‌تواند به حدود ۲,۰۵۵ بیت‌کوین، نزدیک به ۱۳۰ میلیون دلار برسد.

چرا این حمله با فیشینگ و هک صرافی فرق دارد؟

در فیشینگ، هک صرافی یا حمله به زنجیره تأمین، معمولاً مهاجم باید قربانیان خاصی را هدف بگیرد. اما در این پرونده، حمله بر پایه ریاضی و ضعف entropy انجام شد.

تمام آدرس‌های بیت‌کوین عمومی هستند. مهاجم می‌تواند seedهای احتمالی تولید کند، آدرس‌های متناظر را بسازد و با کل بلاکچین مقایسه کند. هر تطابق، یک کیف پول آسیب‌پذیر را نشان می‌دهد.

به همین دلیل، این حمله به رفتار اشتباه کاربر وابسته نبود. حتی کاربری که دستگاه خود را کاملاً امن نگه داشته و عبارت بازیابی را به‌درستی محافظت کرده بود، در صورت تولید seed روی فریمور آسیب‌پذیر، همچنان در معرض خطر قرار داشت.

آیا خودحضانتی بیت‌کوین شکست خورده است؟

این حادثه باعث شد برخی کاربران بیت‌کوین را از کیف پول‌های شخصی به صرافی‌ها منتقل کنند. طبق داده‌های درون‌زنجیره‌ای نقل‌شده در متن، جریان انتقال بیت‌کوین از کیف پول‌های خودحضانتی به آدرس‌های صرافی از ۳۱ جولای مثبت بوده است.

با این حال، متن تأکید می‌کند که این حمله لزوماً شکست مفهوم خودحضانتی نیست؛ بلکه شکست پیاده‌سازی تولید seed در یک شرکت بوده است. پروتکل بیت‌کوین و رمزنگاری اصلی آن طبق طراحی عمل کرده‌اند. مشکل در پیکربندی ساخت فریمور Coinkite بوده است.

نکته مهم‌تر این است که کیف پول‌های چندامضایی یا multisig می‌توانستند جلوی این سرقت را بگیرند. اگر حتی یکی از کلیدهای لازم برای امضا روی دستگاهی غیر از Coldcard تولید شده بود، مهاجم نمی‌توانست تراکنش خروجی را کامل کند.

نقش هوش مصنوعی در کشف باگ چه بود؟

مدیرعامل Coinkite، رودولفو نواک، احتمال داده که مهاجم از هوش مصنوعی برای پیدا کردن این نقص فریمور استفاده کرده باشد. او همچنین گفته بررسی کد با کمک هوش مصنوعی از سمت خود شرکت، چند هفته قبل از حمله، این مشکل را پیدا نکرده بود.

برخی پژوهشگران امنیتی با این روایت مخالفت کرده‌اند و گفته‌اند غیرفعال شدن تولیدکننده عدد تصادفی سخت‌افزاری به‌دلیل یک build flag، یک خطای مهندسی انسانی بوده که باید سال‌ها قبل با بررسی معمول کد شناسایی می‌شد.

با این حال، مسئله اصلی فراتر از این است که آیا واقعاً هوش مصنوعی در این حمله استفاده شده یا نه. پرسش مهم‌تر این است که اگر ابزارهای هوش مصنوعی بتوانند مخازن عمومی فریمور را به‌سرعت برای ضعف‌های entropy و خطاهای پیکربندی اسکن کنند، آیا همه تولیدکنندگان کیف پول سخت‌افزاری با سطح جدیدی از ریسک روبه‌رو می‌شوند؟

جمع‌بندی؛ درس اصلی حمله Coldcard چیست؟

حمله Coldcard یک هشدار جدی برای کل صنعت کیف پول‌های سخت‌افزاری است. این حادثه نشان داد که حتی یک خط تنظیمات اشتباه در فریمور می‌تواند امنیت seed را از سطح تقریباً غیرقابل‌شکستن به سطحی قابل brute-force کاهش دهد.

اما این ماجرا به‌تنهایی به معنی شکست کامل خودحضانتی نیست. درس اصلی این است که تولید seed باید به‌صورت مستقل، مداوم و در سطح فریمور تولیدی واقعی audit شود؛ نه فقط در سطح ادعاهای امنیتی یا متن‌باز بودن کد.

برای کاربران بزرگ‌تر، استفاده از ساختار چندامضایی و توزیع کلیدها میان دستگاه‌های مختلف می‌تواند یک لایه امنیتی حیاتی باشد. برای صنعت نیز پیام روشن است: امنیت کیف پول سخت‌افزاری فقط به نگهداری فیزیکی دستگاه وابسته نیست؛ بلکه به کیفیت کدی وابسته است که کلیدهای خصوصی را تولید می‌کند

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *