В отдельной, более ранней волне той же атаки было похищено 594 BTC (~$38 млн) примерно из 500 одноподписных кошельков за 25 минут около 01:31 UTC . Galaxy Research, Chainalysis и инженерная команда Block независимо друг от друга связали все эти кражи с одной и той же уязвимостью Coldcard .
Команда инженеров Block по биткоину и безопасности под руководством инженера Клея Гарретта (Clay Garrett) установила, что хакер использовал платный аккаунт известного поставщика блокчейн-услуг для эффективного поиска и запроса уязвимых адресов . Необычно быстрый и последовательный характер транзакций — адреса с одинаковой уязвимостью опустошались один за другим — привлёк внимание следователей. Block подтвердил наличие следов, связывающих активность злоумышленника с инфраструктурой этого провайдера .
Расследование Block выявило то, что Гарретт назвал «экстраординарной точностью, вплоть до уровня учётной записи» . Аналитический сервис фактически выступил в роли инструмента разведки, позволив хакеру быстро определить, какие адреса были созданы на уязвимой прошивке, и выбрать самые крупные цели .
Ошибка была допущена в коммите прошивки от марта 2021 года (начиная с версии 4.0.1 для Mk3) в ходе миграции на библиотеку libsecp256k1 от Bitcoin Core . Ошибка в макросе конфигурации сборки привела к тому, что прошивка обходила штатный аппаратный генератор случайных чисел (TRNG) STM32 и вместо него использовала детерминированный программный ГСЧ Yasmarang из MicroPython .
Конфигурация платы устанавливала MICROPY_HW_ENABLE_RNG в ноль, так как у Coldcard был собственный обёрточный модуль для аппаратного ГСЧ. Однако библиотека libngu неправильно обрабатывала этот макрос: её проверка (#ifndef MICROPY_HW_ENABLE_RNG) проверяла только то, определён ли макрос, а не то, равно ли его значение нулю . Поскольку макрос был определён (хоть и с нулевым значением), libngu решила, что аппаратный путь доступен, и подключила программную функцию rng_get() из MicroPython .
Фактическая энтропия снизилась до примерно 32–40 бит (вместо запланированных 128+ бит), то есть существовало лишь около 4 миллиардов возможных значений seed — что легко поддаётся полному перебору на современном оборудовании . Seed-фразы, созданные без добавления пользовательских бросков кубиков или парольной фразы BIP 39, были полностью скомпрометированы .
Генеральный директор Coinkite Родольфо Новак (NVK) позже признал ошибку: «Я явно установил MICROPY_HW_ENABLE_RNG в ноль, думая, что нам не нужна ни одна из версий, но это не то, что делает этот макрос» .
| Пострадавшие | Незатронутые |
|---|---|
| Coldcard Mk3, прошивка 4.0.1 – 5.0.3 | Mk4, Q, Mk5 (по первоначальному анализу Coinkite) |
| Seed-фразы, созданные без пользовательских бросков кубиков или парольной фразы BIP 39 | Seed-фразы, созданные с пользовательскими бросками кубиков или парольной фразой |
Позже Coinkite расширила предупреждение на некоторые версии прошивок Mk4, Mk5 и Q и выпустила экстренные обновления для всех затронутых моделей .
Этот эксплойт подорвал одну из ключевых концепций самоконтроля (self-custody) — что защищённый элемент аппаратного кошелька гарантирует криптографическую безопасность независимо от ошибок в ПО .
Подробный технический анализ см. в отчёте инженеров Block и техническом обосновании Coinkite .