לפי Chainalysis, כ-30 מיליון דולר נגנבו בעשר הדקות הראשונות, לאחר שהתוקף התמקד בכתובות עם היתרות הגדולות ביותר — ובהן ארנק שהחזיק כ-1.8 מיליון דולר . במקביל זוהתה סדרה נוספת של העברות, שבה נמשכו כ-594 ביטקוין, בשווי של כ-38 מיליון דולר, מכ-500 ארנקי ביטקוין בעלי חתימה יחידה בתוך כ-25 דקות . Galaxy Research, Chainalysis וצוות ההנדסה והאבטחה של Block קשרו את הפעילות לאותה חולשה ב-Coldcard .
צוות הביטקוין והאבטחה של Block, בהובלת המהנדס קליי גארט, זיהה שהתוקף השתמש בחשבון בתשלום אצל ספק מוכר של שירותי בלוקצ'יין כדי לאתר כתובות פגיעות ולבצע שאילתות הקשורות אליהן . שם הספק לא פורסם.
דפוס הפעילות בשרשרת היה חריג: רצף מהיר של העברות מכתובות רבות שחלקו אותה חולשה. החוקרים מצאו ראיות שקישרו את הפעילות של המפעיל ישירות לתשתית של אותו ספק . במילים אחרות, שירות ניתוח שנועד לספק מידע על רשתות בלוקצ'יין שימש את התוקף ככלי סיור: הוא אפשר לו למפות במהירות אילו כתובות נוצרו באמצעות קושחה פגיעה, ולדרג את המטרות לפי גודל היתרה .
Block תיארה את הממצאים כראיות בעלות "ספציפיות יוצאת דופן, עד רמת החשבון" . השימוש בחשבון בתשלום סיפק לחוקרים נתיב חשוב לקישור בין התוקף לבין תהליך העבודה שבאמצעותו אותרו הארנקים.
התקלה הוכנסה בשינוי קושחה ממרץ 2021, שהחל להופיע החל מגרסת Mk3 4.0.1, במהלך מעבר לשימוש בספריית libsecp256k1 של Bitcoin Core . שגיאה במאקרו של תצורת הבנייה גרמה לקושחה לעקוף את מחולל המספרים האקראיים האמיתי בחומרה (TRNG) של שבב STM32, ולהשתמש במקום זאת במחולל התוכנה הדטרמיניסטי Yasmarang של MicroPython .
בתצורת הלוח של גרסת הייצור הוגדר המאקרו MICROPY_HW_ENABLE_RNG כ-0, משום ש-Coldcard השתמשה בעטיפה נפרדת למחולל האקראיות החומרתי. אלא שהספרייה libngu לא בדקה אם המאקרו מופעל, אלא רק אם הוא מוגדר. מכיוון שהמאקרו היה מוגדר — גם אם ערכו היה אפס — הספרייה הסיקה בטעות שהמסלול החומרתי זמין, וחיברה את הקוד לפונקציה מבוססת התוכנה rng_get() של MicroPython .
התוצאה הייתה ירידה חדה באיכות האקראיות: מכ-128 ביטים או יותר שתוכננו במקור, לכ-32–40 ביטים בלבד . משמעות הדבר היא מרחב של בערך 4 מיליארד ערכי זרעים אפשריים — מספר שניתן לסריקה בכוח חישוב מודרני. זרעים שנוצרו ללא הטלת קוביות שביצע המשתמש בעצמו וללא passphrase נוסף של BIP39 היו חשופים במיוחד .
מנכ"ל Coinkite, רודולפו נובאק (NVK), הכיר מאוחר יותר בטעות: "הגדרתי במפורש את MICROPY_HW_ENABLE_RNG לאפס, מתוך מחשבה שאיננו זקוקים לאף אחת מהגרסאות — אבל זה לא מה שזה עושה" .
| הושפעו | לא הושפעו לפי הניתוח הראשוני |
|---|---|
| Coldcard Mk3 עם קושחה מגרסה 4.0.1 ועד 5.0.3 | Mk4, Q ו-Mk5 |
| זרעים שנוצרו ללא הטלות קובייה של המשתמש או passphrase של BIP39 | זרעים שנוצרו בעזרת הטלות קובייה שסיפק המשתמש או passphrase |
בהמשך הרחיבה Coinkite את אזהרת האבטחה כך שתכלול גרסאות מסוימות של קושחות Mk4, Mk5 ו-Q, ושחררה עדכוני חירום לכל הדגמים שנמצאו מושפעים .
האירוע פגע באחת ההבטחות המרכזיות של משמורת עצמית: הרעיון שארנק חומרה מאפשר למשתמש להחזיק במפתחותיו בלי להסתמך על צד שלישי, ושמירה לא מקוונת מספיקה כדי להגן על הנכסים. כאן, הבעיה לא הייתה בפרוטוקול הביטקוין עצמו אלא בדרך שבה הקושחה יצרה את הזרע הסודי .
הפרשה הדגישה ש"אחסון קר" אינו ערובה מוחלטת. צ'אנגפנג ז'או (CZ), מייסד Binance, הזהיר בפומבי שגם ארנק חומרה המנותק מהרשת עלול להפוך לפגיע בעקבות תקלה בקושחה . בידוד מהרשת מגן מפני סוגים מסוימים של תקיפות, אך אינו מתקן מפתח שנוצר מלכתחילה מתוך אקראיות חלשה.
הבאג נותר בקוד פתוח במשך יותר מחמש שנים, עד שנחשף ונוצל. הדבר אינו מבטל את היתרונות של קוד פתוח, אך מראה שפרסום הקוד כשלעצמו אינו מבטיח שכל שגיאה תזוהה בזמן. בעקבות המקרה יש חוקרים הטוענים כי ביקורת אנושית צריכה להיתמך גם בכלי ביקורת אוטומטיים מבוססי בינה מלאכותית, במיוחד באזורים עדינים כמו שילוב מחוללי אקראיות .
כאשר יצרן ארנק חומרה טועה באופן שבו נוצרת אקראיות, כל הארנקים שנוצרו באותה קושחה עלולים להפוך לפגיעים בבת אחת. זהו סיכון מערכתי של נקודת כשל יחידה. פתרונות משמורת מסוימים מנסים לצמצם אותו באמצעות פיצול מפתחות וחישוב רב-צדדי (MPC), אך הם מחזירים לתמונה סיכונים אחרים הקשורים לסמכות מרכזית ולצדדים שלישיים.
לכן השאלה שניצבת כעת בפני משתמשי קריפטו אינה רק אם להחזיק ביטקוין בעצמם, אלא גם אם הם מסוגלים לנהל את תהליך האבטחה — החל מיצירת הזרע ועד בדיקת הקושחה, גיבוי המפתחות והעברה לארנק חדש במקרה של התרעה.
לניתוח הטכני המלא אפשר לעיין בדו"ח ההנדסה של Block ובמסמך הרקע הטכני של Coinkite .