איך באג של אקראיות מ-2021 רוקן ארנקים קרים ביותר מ-110 מיליון דולר?

A heavy antique steel safe standing alone in a bare concrete room, its thick door hanging slightly open onto darkness inside, thin grey dust settled on the floor around it. Cold overcast daylight enters from a high window at a low angle, raking across the metal surface. Muted greys, deep shadow, desaturated palette, cinematic wide composition with shallow depth of field.

ב-30 ביולי 2026 התחילו לזוז ביטקוינים שלא זזו שנים. לא אחד, לא עשרה. בתוך 41 דקות התרוקנו כ-1,196 כתובות ביטקוין, קצת יותר מ-1,080 מטבעות, שווי של כ-70 מיליון דולר לפי השער באותו יום. חברת המחקר Galaxy Research, שמיפתה את הגל, מצאה שהמטבעות שנגנבו שכבו במקומם 3.18 שנים בממוצע. אלה לא היו חשבונות מסחר פעילים. אלה היו אנשים שקנו ביטקוין, העבירו אותו לארנק חומרה, כתבו את ה-seed על נייר או על לוחית פלדה, והלכו לישון.

אף אחד לא נגע במכשירים שלהם. לא היה פישינג, לא הייתה תוכנת ריגול, לא היה חוזה חכם שנפרץ. התוקף מעולם לא ראה את הארנקים האלה. הוא פשוט ניחש את המפתחות שלהם, במחשב שלו, בלי אינטרנט, בלי קשר לקורבנות.

המכשיר שבו מדובר הוא Coldcard, ארנק חומרה לביטקוין בלבד מתוצרת החברה הקנדית Coinkite. הוא נחשב לאחד המכשירים המוערכים ביותר בקהילה הביטקוינרית הוותיקה. נכון ל-5 באוגוסט, ההערכות לגבי היקף הגניבה נעות בין כ-114 מיליון דולר, לפי הספירה המאומתת של CoinDesk על יותר מ-5,200 כתובות, לבין כ-130 מיליון דולר לפי Galaxy ו-Elliptic, שכוללות גל רביעי שטרם אושר סופית. המספר עדיין עולה. אלכס ת'ורן מ-Galaxy מעריך שכבר לא מדובר בתוקף אחד אלא בלפחות 15 גורמים נפרדים שרצים על אותה חולשה במקביל.

האקראיות היא כל מה שעומד בין הכסף שלך לבין תוקף

המפתח הפרטי שלך הוא, בסופו של דבר, מספר. מספר גדול מאוד, אבל מספר. אין בו שום דבר קסום ואין בו שום דבר שקשור אליך אישית. כל מה שמגן עליו הוא שהוא נבחר באקראי מתוך כמות אפשרויות כל כך עצומה שאף אחד לא יכול לעבור עליהן.

המונח המקצועי לכמות האקראיות האמיתית שנכנסה לבחירה הזאת הוא אנטרופיה, ומודדים אותה בביטים. כל ביט נוסף מכפיל את מספר האפשרויות. תקן התעשייה ל-seed של 12 מילים הוא 128 ביט, כלומר 2 בחזקת 128 אפשרויות. זה מספר בן 39 ספרות. אין בעולם חומרה שתעבור עליו, ולא תהיה.

הנקודה שקל לפספס היא שהאנטרופיה לא נמדדת לפי אורך ה-seed אלא לפי מקור האקראיות. שתים עשרה מילים נראות אותו דבר בין אם נוצרו מרעש חומרתי אמיתי ובין אם נוצרו ממחולל שהיה לו רק מיליון מצבים אפשריים. הנייר נראה זהה. הכתובת נראית זהה. ההבדל היחיד הוא כמה זמן לוקח לעבור על כל האפשרויות.

מנעול עם 128 ביט: כדי לעבור על כל הצירופים תצטרך יותר אנרגיה ממה שהשמש תפיק במשך חייה. זה לא קשה. זה בלתי אפשרי.

מנעול עם 40 ביט: כ-1.1 טריליון צירופים. כרטיס מסך אחד עובר על זה בימים ספורים. אשכול מכונות עובר על זה בשעות. זה לא מנעול, זה סוג של תור.

זה בדיוק מה שקרה כאן. Coinkite אישרה בהודעה הרשמית שלה שדגמי Mk2 ו-Mk3 ייצרו seed עם כ-40 ביט של אנטרופיה אפקטיבית במקום 128, ושדגמי Mk4, Mk5 ו-Q ייצרו כ-72 ביט, לפי המסמך הטכני שפרסמה. המילים על הנייר נשארו שתים עשרה. מרחב האפשרויות התכווץ פי מספר שקשה בכלל לכתוב.

שורת קוד אחת מ-2021

הקושחה של Coldcard היא קוד פתוח. כל אחד יכול לקרוא אותה. זה בדיוק מה שהופך את הסיפור לכל כך לא נוח.

במרץ 2021 עברה Coinkite שינוי תשתיתי, מעבר לספריית ההצפנה libsecp256k1 של Bitcoin Core. בתוך המעבר הזה נשבר בשקט החיבור בין פונקציית ייצור ה-seed לבין מחולל המספרים האקראיים החומרתי של השבב, ה-TRNG של המעבד. במקום להגיע אליו, הקריאה נפלה לחלופה התוכנתית שמגיעה עם MicroPython, מחולל בשם Yasmarang.

הסיבה הטכנית מבישה בפשטות שלה. תנאי הידור בקוד בדק אם משתנה מסוים מוגדר ולא אם הוא מופעל. הקוד החומרתי הנכון היה קיים בבינארי, אבל הקריאה בפועל נותבה למקום אחר. לשתי הפונקציות הייתה חתימה זהה, ולכן שום כלי בדיקה ושום מבקר קוד אנושי לא ראה שיש כאן פער. המכשיר עבד. הוא ייצר seed. הוא פשוט ייצר אותו ממקור אחר לגמרי ממה שהיה אמור.

ad

המחולל התוכנתי הזה מאותחל מנתונים דלים: המזהה הייחודי של השבב ומצב טיימרים פנימיים. בדגמים החדשים יותר נוספה לו גם אנטרופיה משני רכיבי האבטחה SE1 ו-SE2, ומכאן ההפרש בין 40 ביט ל-72. בשני המקרים מדובר בכמות אקראיות שאפשר למפות אותה מראש. תוקף שמבין את המנגנון לא צריך לנחש מפתחות אחד אחד. הוא מייצר את כל מרחב המצבים האפשרי של המחולל, גוזר מכל מצב את ה-seed, מכל seed את הכתובות, ואז פשוט מצליב מול הבלוקצ'יין, שהוא ציבורי לחלוטין, כדי לראות איפה יש כסף. הבדיקה הזאת לא דורשת שום מגע עם הקורבן, ולכן אף אחד לא ראה אותה מתקרבת.

את הפגם עצמו איתרה וחשפה חברת Block. Coinkite הוציאה קושחה מתוקנת ב-31 ביולי, יום אחרי הגל הראשון. רודולפו נובאק, מייסד Coinkite, אמר שהוא מעריך שהתוקפים הגיעו לחולשה בעזרת סקירת קוד בסיוע בינה מלאכותית, ושסקירה כזאת מוצאת היום באגים רדומים מהר יותר ממומחים ותיקים. אין הוכחה פומבית לטענה הזאת, והיא נשארת הערכה של החברה שנפגעה. מה שכן ברור הוא שקוד פתוח בן ארבע שנים, שנקרא על ידי אלפי עיניים, החזיק את הפגם הזה בלי שאיש שם לב עד שמישהו הרוויח ממנו 70 מיליון דולר ביום אחד.

הטענה המתבקשת היא שקוד סגור היה מונע את זה, ושהתוקף לא היה יכול לקרוא את הקושחה מלכתחילה. היא לא עומדת. תוקף שרוצה למצוא חולשה במחולל אקראיות לא חייב את הקוד: מספיק לו לאסוף כתובות ציבוריות ולחפש בהן דפוסים סטטיסטיים, וזו בדיוק הדרך שבה נמצאו כשלי אנטרופיה קודמים בארנקים סגורים. מה שקוד פתוח כן נותן הוא את היכולת של גורם שלישי, במקרה הזה Block, לאתר את הפגם ולפרסם אותו במקום למכור אותו. הבעיה כאן לא הייתה שהקוד גלוי. הבעיה הייתה שאף אחד לא בדק, לאורך יותר מארבע שנים, שהפונקציה שנקראה בפועל היא הפונקציה שהתכוונו לקרוא לה.

אילו דגמים וגרסאות נכללים בהודעה?

הרשימה הבאה לקוחה מההודעה הרשמית של Coinkite מ-30 ביולי, כפי שעודכנה ב-1 באוגוסט. אם אתה מחזיק Coldcard, זו הרשימה שקובעת, לא סיכומים באתרי חדשות.

דגם גרסאות פגיעות גרסה מתוקנת
Mk2 / Mk3 4.0.1 עד 4.1.9 (ממרץ 2021) 4.2.0 ומעלה
Mk4 / Mk5 כל גרסה לפני 5.6.0 5.6.0 ומעלה
Q כל גרסה לפני 1.5.0Q 1.5.0Q ומעלה
גרסאות Edge לפני 6.6.0X או 6.6.0QX 6.6.0X / 6.6.0QX ומעלה

מה שלא נכלל: דגם Mk1, seeds שנוצרו לפני גרסה 4.0.0, וכן המוצרים TAPSIGNER, OPENDIME ו-SATSCARD, שאינם מושפעים כלל.

הבחנה אחת חשובה שנוטה להיעלם בכותרות. כל הגניבות שתועדו עד כה תואמות למרחב של 40 ביט, כלומר לדגמי Mk2 ו-Mk3. אין עדות פומבית ל-seed בן 72 ביט שנפרץ, ופריצה כזאת דורשת משאבים בסדר גודל אחר לגמרי. מנגד, חוקרים מ-Block העריכו שבחלק מהמקרים האנטרופיה הסודית בדגמים החדשים נמוכה משמעותית מ-72 ביט. כל עוד המחלוקת הזאת פתוחה, ההנחה הזהירה היא שגם המכשירים החדשים אינם בטוחים.

למה עדכון הקושחה לא מציל אף אחד?

זו הנקודה שהכי הרבה אנשים מפספסים, והיא גם המסוכנת ביותר.

עדכון קושחה מתקן את המכשיר. הוא לא מתקן את ה-seed. ה-seed נוצר פעם אחת, ביום שהגדרת את הארנק, ומאותו רגע כל המפתחות והכתובות שלך נגזרים ממנו בשרשרת דטרמיניסטית. אם הנקודה ההתחלתית הייתה חלשה, כל מה שנגזר ממנה חלש באותה מידה, לנצח. אין תיקון שמשנה את זה בדיעבד, כי המספר כבר קיים והוא כבר ניתן לניחוש.

Coinkite כותבת את זה במפורש: עדכון הקושחה אינו מתקן seed שנוצר בגרסה פגומה. הפעולה היחידה שמשנה משהו היא יצירת seed חדש לגמרי על מכשיר מעודכן, והעברה מלאה של הכספים לכתובות החדשות. עדכון בלי מיגרציה משאיר אותך בדיוק באותו סיכון, רק עם תחושת ביטחון מזויפת.

מי לא נפגע, והלקח האמיתי של האירוע

יש קבוצה של משתמשים שהחולשה הזאת לא נגעה בהם בכלל, והם אלה שלא סמכו על המכשיר לבדו.

ל-Coldcard יש פיצ'ר בשם Add Dice Rolls. הוא מאפשר לך לגלגל קובייה פיזית ולהזין את התוצאות, והמכשיר משלב את הקלט הזה יחד עם האנטרופיה שהוא עצמו ייצר. הבאג פגע רק בחלק שהמכשיר תרם. האנטרופיה שהמשתמש הכניס בעצמו נשארה שלמה, כי היא באה מקובייה על שולחן ולא ממחולל תוכנתי. לפי ההודעה הרשמית, 50 עד 98 גלגולים עצמאיים ופרטיים תרמו לבדם לפחות 128 ביט, ו-99 גלגולים ומעלה תרמו כ-256 ביט. מי שגלגל פחות מ-50, או שהזין רצף שכבר היה מוכר למישהו, נמצא בסיכון.

ad

שכבת הגנה שנייה שעבדה היא passphrase של BIP-39, המילה או הצירוף הנוסף שמוסיפים מעל ה-seed ויוצרים ארנק נפרד. אם ה-passphrase שלך ארוך ואקראי באמת, התוקף לא מגיע לכספים גם אם ניחש את שתים עשרה המילים. אם הוא שם של ילד, תאריך, שורה משיר או משהו שהשתמשת בו במקום אחר, הוא לא מוסיף כמעט כלום. גם כאן הביטחון לא נובע מהמנגנון אלא מכמות האקראיות שהכנסת אליו.

השלישית היא multisig על פני יצרנים שונים. מי שהחזיק סכומים משמעותיים בהגדרה של 2 מתוך 3 עם מכשירים משלוש חברות, ורק אחד מהם היה Coldcard פגיע, לא איבד דבר. תוקף שהשיג מפתח אחד לא עבר את הסף.

המכנה המשותף לשלוש הקבוצות האלה אינו מזל. הוא הנחה אחת: אל תיתן לרכיב אחד להיות הדבר היחיד שעומד בין הכסף שלך לבין העולם. ההנחה הזאת נשמעה במשך שנים כמו פרנויה של אנשים שאין להם מה לעשות עם הזמן שלהם. ב-30 ביולי היא הייתה ההבדל בין להישאר עם הכסף לבין לא.

מה קורה עם הכסף שנגנב?

התשובה הקצרה היא שרובו עדיין יושב במקום, וזה לא אומר הרבה. אחת מכתובות התוקפים מחזיקה נכון ל-5 באוגוסט כ-36 מיליון דולר בביטקוין שלא זזו. Galaxy דיווחה על כשש מאות כתובות החשודות כשייכות לתוקפים לרשויות אכיפה בארצות הברית, ו-Coinkite הודיעה שתסייע ללקוחות שנפגעו בדוחות משטרה, בתביעות ביטוח ובחקירות פרטיות. היא לא הודיעה על פיצוי.

במקביל נוצרה על הבלוקצ'יין תופעה שקשה לקרוא בלי אי נוחות. קורבנות מתחילים לשלוח לכתובת התוקף סכומים זעירים עם הודעות מוצמדות בשדה OP_RETURN, השדה שמאפשר לחרוט טקסט קצר בעסקה. "גנבת, בבקשה תחזיר משהו" נכתב שם, ולידו בקשה להחזיר 80% מחמישה ביטקוין. לצד הפניות האלה כבר מופיעות גם הצעות שירות לתוקף עצמו, מישהו שמציע להלבין ולהמיר את המטבעות בעמלה של 10%. הכל חתום בזמן ופומבי לתמיד. שקיפות הרשת עובדת כאן לשני הכיוונים, ושום צד לא באמת מרוויח ממנה.

סדר הפעולות למי שמחזיק Coldcard

אם יש לך Coldcard, או אם ה-seed שלך נוצר אי פעם על Coldcard גם אם אתה משתמש בו היום במקום אחר, יש סדר פעולות הגיוני. הוא לא דחוף באותה מידה לכולם, אבל הוא כן דחוף למי שנמצא בקבוצה הראשונה.

  1. קרא את ההודעה הרשמית של Coinkite ישירות בבלוג של החברה, ובדוק את הדגם ואת גרסת הקושחה שבה נוצר ה-seed שלך מול הרשימה שם. סיכומים באתרי חדשות מתעדכנים לאט יותר מהמקור.
  2. ודא שהגיבוי הקיים שלך קריא לפני שאתה נוגע במשהו. אין דבר גרוע יותר מלגלות באמצע מיגרציה חירומית שהלוחית או הנייר שלך לא ברורים.
  3. אם אתה ב-Mk2 או Mk3 בסינגל-סיג בלי גלגולי קובייה ובלי passphrase חזק, זה המצב הדחוף. כאן אפשר להוסיף passphrase אקראי וחזק ולהעביר את הכספים מאחוריו כצעד ביניים מיידי, לפני שמתפנים למיגרציה מסודרת.
  4. עדכן את הקושחה לגרסה המתוקנת, מהאתר הרשמי בלבד, לפני יצירת כל seed חדש. יצירת seed חדש על קושחה ישנה משחזרת בדיוק את אותה בעיה.
  5. צור seed חדש לגמרי, רצוי עם גלגולי קובייה עצמאיים משלך. אין שום סיבה לוותר על השכבה הזאת אחרי מה שקרה.
  6. בדוק בקטן לפני שאתה מעביר בגדול. אמת את כתובת הקבלה על מסך המכשיר עצמו, שלח סכום זעום, ורק אחרי שהוא הגיע העבר את היתרה.
  7. שמור את הגיבוי הישן עד שהמיגרציה הושלמה ואומתה במלואה, ואל תשתמש ב-seed הישן שוב לעולם, גם לא במכשיר חדש.

לגבי העמלות: הרשת עמוסה בדיוק בגלל האירוע הזה. ה-mempool של ביטקוין הגיע ב-4 באוגוסט ל-89,031 עסקאות ממתינות, הרמה הגבוהה ביותר מאז פברואר 2025, וכתובות פעילות נגעו ב-712 אלף, שיא של שלושה חודשים. מי שמעביר עכשיו משלם יותר. זה שיקול אמיתי לגבי תזמון, אבל הוא לא שיקול לגבי עצם המיגרציה.

החוזים החכמים לא היו הבעיה ביולי

המקרה הזה נוגע בנקודה רחבה יותר. הדימוי המקובל של סיכון בקריפטו הוא חוזה חכם שבור, פרוטוקול DeFi צעיר מדי, גשר בין רשתות. סיכום ההפסדים של יולי 2026 מצייר תמונה אחרת.

ad

הסיכומים החודשיים נעים בין כ-210 מיליון דולר על פני כ-30 אירועים לבין כ-242 מיליון, והפער נובע בעיקר מכך שמספר Coldcard עצמו המשיך לתפוח אחרי סוף החודש. בכל אחת מהספירות, האירוע הגדול ביותר בחודש לא היה חוזה חכם. כשל ביצירת מפתחות היווה כ-45% מסך ההפסדים, וגניבת מפתחות פרטיים בדרכים אחרות עוד כ-16%. כלומר כ-61% מהכסף שאבד באותו חודש הלך דרך המפתחות עצמם, לא דרך הלוגיקה של הפרוטוקולים. בעיות אורקל ובאגים בלוגיקה של חוזים תרמו כ-14% כל אחת.

וזה גם לא תקדים. באוגוסט 2023 התגלה באג בשם Milk Sad בכלי Libbitcoin Explorer, שייצר seeds מ-32 ביט של אנטרופיה בלבד, על בסיס שעון המערכת. שם נגנבו כ-900 אלף דולר. אותו סוג כשל בדיוק, בסדר גודל קטן פי יותר ממאה, שלוש שנים קודם. התעשייה ידעה. היא פשוט לא בדקה.

המסקנה שכמה בתי השקעות כבר הסיקו היא שהאירוע ידחוף כסף לכיוון משמורת מוסדית. קנטור פיצג'רלד כתבה שהיא מצפה לזרימות מוגברות לבורסות ולמשמורנים, ו-FRNT ציינה שקרנות סל על ביטקוין עשויות למשוך מי שלא רוצה לנהל מפתחות בעצמו. הטיעון הנגדי מובן מאליו לכל מי שזוכר את 2022: משמורן צד שלישי לא מבטל סיכון, הוא מחליף סיכון טכני בסיכון של גורם אחד שיכול לקרוס או להיתפס. FRNT עצמה העריכה שהמגזר יסתגל ולא ינטוש את המשמורת העצמית, בדיוק כפי שקרה אחרי Milk Sad.

מה שהאירוע כן משנה הוא איפה צריך להסתכל. הביטקוין שנגנב ב-30 ביולי היה מאובטח בדיוק לפי הספר: מכשיר ייעודי, לא מחובר לרשת, גיבוי פיזי, ידיים שלא זזות שנים. כל זה היה נכון, וזה לא הספיק, כי הבטיחות של כל המבנה נקבעה בשנייה אחת בעבר, ברגע שבו נבחר המספר הראשון. את הרגע ההוא אי אפשר לבדוק בדיעבד. אפשר רק לא לתת אותו במלואו לרכיב אחד.

שיתוף
גרפים אחרונים

כתבות שעשויות לעניין אותך