Дослідники Block розкрили критичну помилку в прошивці апаратних гаманців Coldcard канадської компанії Coinkite: починаючи з березня 2021 року, генерація сид-фраз на уражених пристроях використовувала передбачуваний програмний генератор псевдовипадкових чисел (PRNG) замість апаратного. Ефективна ентропія сидів становила від 40 до 72 біт замість очікуваних 128 біт для 12-слівної фрази BIP-39. Coinkite випустила екстрене оновлення прошивки 31 липня, але воно не виправляє вже згенеровані слабкі сіди — власникам необхідно створити новий сид на оновленій прошивці та перевести кошти. Паралельно Galaxy Research зафіксувала підозрілу операцію 30 липня: 1 196 біткоїн-адрес були спорожнені за 41 хвилину на суму 1 082,65 BTC (~$70,2 млн), однак причинно-наслідковий зв’язок із цією вразливістю не підтверджений.
Технічна суть вразливості
Корінь проблеми — у конфігурації збирання прошивки Coldcard. Макрос MICROPY_HW_ENABLE_RNG був установлений у нуль, оскільки Coinkite використовує власну обгортку для апаратного генератора випадкових чисел STM32. Однак бібліотека libngu перевіряла лише наявність макроса, а не його значення. У результаті збирання прив’язувалося до програмного резервного механізму MicroPython — алгоритму Yasmarang.
Цей програмний PRNG ініціалізувався з унікального ідентифікатора чипа (UID) та значень таймерних регістрів, після чого не отримував свіжої ентропії. За даними дослідників Block, зловмисник, здатний визначити або суттєво обмежити простір UID пристрою, стан таймера та історію попередніх викликів генератора, може відтворити потік вихідних значень офлайн — без доступу до пристрою. Отримані кандидати на сид-фрази перевіряються шляхом обчислення адрес і звіряння з публічними даними блокчейна.
Оцінки ефективної ентропії розходяться між вендором і дослідниками:
- Mk3: Coinkite оцінює ентропію приблизно в 40 біт
- Mk4, Mk5 і Q: близько 72 біт за оцінкою Coinkite
- Block встановлює умовні верхні межі нижче 240,7 і 273,3 відповідно, попереджаючи, що останнє значення не еквівалентне 73-бітній криптографічній стійкості
Для порівняння: стандартний 12-слівний сид BIP-39 забезпечує 128 біт ентропії. Block не опублікував результатів бенчмарку перебору, а практична вартість атаки залежить від наявної інформації про UID, час завантаження, попередні виклики генератора та вартість деривації ключів.
Уражені версії
Вразливість визначається прошивкою, на якій був створений сид, а не поточною встановленою версією:
- Mk3: версії 4.0.1–4.1.9 (виправлено в 4.2.0) за даними Coinkite; Block додатково включає Mk2 і версію 4.0.0
- Mk4 і Mk5: усі версії до 5.6.0
- Q: усі версії до 1.5.0Q
- Edge-збирання: до 6.6.0X для Mk4/Mk5, до 6.6.0QX для Q
Продукти TAPSIGNER, OPENDIME і SATSCARD використовують іншу кодову базу й не уражені.
Важлива розбіжність: Coinkite у своєму попередженні не згадує модель Mk2, тоді як дослідження Block включає її до списку вразливих пристроїв. Власникам Mk2 слід вважати свої сіди потенційно скомпрометованими.
Підозріла операція 30 липня
За даними Galaxy Research, 30 липня невідомий оператор за 41 хвилину спорожнив 1 196 біткоїн-адрес, перемістивши 1 082,65 BTC. Galaxy зазначила, що за попередні 30 днів не виявлено інших транзакцій з аналогічною комбінацією ознак: комісія 30 sat/vB і відсутність решти.
Однак Galaxy попередила, що цей патерн ідентифікує оператора, а не факт крадіжки: масове переміщення коштів виглядає однаково, незалежно від того, здійснене воно власником чи зловмисником. Жоден публічний звіт не відтворив сид жертви та не зіставив його зі спорожнілою адресою. Зв’язок між цією операцією та вразливістю Coldcard залишається припущенням, заснованим на аналізі патернів блокчейна.
Оцінка впливу
Під загрозою перебувають усі користувачі Coldcard, які згенерували сид на вразливих версіях прошивки без використання достатньої кількості кидків гральних кісток. З огляду на те, що Coldcard позиціонується як гаманець для довгострокового зберігання великих сум у біткоїні, потенційна шкода є значною. Моделі Mk3 з ентропією близько 40 біт перебувають у зоні найбільшого ризику — такий простір ключів може бути перебраний із використанням сучасних обчислювальних ресурсів.
Мультипідпис (multisig) знижує ризик лише в тому разі, якщо кворум не складається повністю з уражених пристроїв Coldcard.
Практичні рекомендації
- Визначте версію прошивки, на якій був створений сид. Якщо вона входить до списку вразливих — вважайте сид скомпрометованим.
- Оновіть прошивку до виправленої версії (4.2.0 для Mk3, 5.6.0 для Mk4/Mk5, 1.5.0Q для Q).
- Згенеруйте новий сид на оновленій прошивці. Перенесення старого сида на оновлену прошивку або в інший гаманець не усуває слабкість — вразливість закладена в самому сиду.
- Переведіть усі кошти зі старих адрес на адреси, отримані з нового сида.
- Використовуйте кидки кісток: Coinkite стверджує, що сид, створений із використанням не менше 50 чесних, незалежних і приватних кидків гральних кісток, не піддається цій вразливості. Якщо кількість або приватність кидків під сумнівом — мігруйте.
- BIP-39 парольна фраза: сильна унікальна парольна фраза створює окремий гаманець, недоступний за одними лише словами сида, але Coinkite все одно рекомендує заміну сида.
Власникам уражених пристроїв Coldcard необхідно діяти негайно: оновити прошивку, створити новий сид і перевести кошти на нові адреси. Зволікання залишає біткоїни під захистом ентропії в 40–72 біти — на порядки нижче стандарту BIP-39. Очікування підтвердження зв’язку вразливості з конкретними крадіжками не є розумною стратегією: сама по собі передбачуваність генератора робить сіди вразливими, незалежно від того, чи експлуатував їх хтось на практиці.