Кратко
- Ошибка в прошивке означала, что кошельки Coldcard генерировали сид-фразы с помощью программного псевдослучайного генератора вместо аппаратного чипа, предназначенного для этой задачи.
- Из-за ошибки пространство поиска фактически сократилось со 128 бит до примерно 40 на старых моделях.
- Вот что всё это значит и как это привело к краже более 130 миллионов долларов в биткоинах.
Кто-то опустошает биткоин-кошельки, которые никогда не должны были быть доступны.
Монеты лежали на устройствах Coldcard — аппаратных кошельках канадского производителя Coinkite, которые никогда не подключаются к интернету. Никакой фишинговой ссылки. Никакого вредоносного ПО. Никакого украденного ноутбука. Злоумышленники просто вычислили закрытые ключи.
Galaxy Research отследила кражу более 1 596 BTC в трёх подтверждённых волнах, а также предполагаемую четвёртую волну, которая увеличила бы общую сумму до примерно 2 055 BTC — около 130 миллионов долларов по текущим ценам. Одна операция переместила 70 миллионов долларов за 41 минуту. Coinkite сообщает, что как минимум 15 отдельных злоумышленников приняли участие.
Компания опубликовала технический обзор 1 августа, объясняющий, что пошло не так. Это необычно откровенный документ, и если кратко, то кошелёк восемь лет бросал гружёные кости, и никто этого не замечал.
Ноль — это тоже что-то
В 2021 году Coinkite перевела криптографию Coldcard на libsecp256k1 — ту же библиотеку, которую использует Bitcoin Core. Разумное решение. Именно на этапе интеграции всё развалилось.
Миграция незаметно перенаправила генерацию сид-фраз с собственного аппаратного генератора случайных чисел Coldcard на программный запасной вариант MicroPython — небольшой алгоритм под названием Yasmarang, который существует для устройств, вообще не имеющих чипа случайности.
🚨ПОТЕРИ ОТ ВЗЛОМА COLDCARD ПРЕВЫШАЮТ 100 МЛН ДОЛЛАРОВ
С высокой уверенностью 1 596 BTC было украдено с ~7300 адресов в трёх подтверждённых волнах + ещё 14 мелких инцидентов.
Если добавить предполагаемые (но неподтверждённые), общая сумма вырастает до 130 млн долларов (2 тыс. BTC).
Подробнее в ветке ниже 👇 pic.twitter.com/RAl3ib67qa
— Galaxy Research (@glxyresearch) 3 августа 2026 г.
У Coldcard есть чип случайности. Просто его перестали спрашивать.
Причина почти слишком мала, чтобы в нее поверить. Охранник сборки использовал #ifndef, который проверяет, существует ли настройка, а не включена ли она. Coinkite определил эту настройку как ноль, что означает «выключено». Поскольку ноль все равно считается определенным, проверка безопасности прошла, и сборка завершилась. Обе версии функции имели одинаковые сигнатуры, поэтому ничего не выглядело подозрительным.
«Основная часть случайности в COLDCARD исходила от PRNG, о котором я не знал, что он на самом деле в исходном коде», — написал Coinkite, имея в виду генератор псевдослучайных чисел — программное обеспечение, которое производит числа, выглядящие случайными, но следующие фиксированному рецепту из начального значения.
Подайте в рецепт то же начальное значение — и получите тот же результат. Каждый раз.
На устройствах Mk2 и Mk3 с прошивкой 4.0.1–4.1.9 это начальное значение исходило из серийного номера чипа и его часов. Coinkite оценивает результирующее пространство поиска примерно в 40 бит. Более новые модели добавляли немного энтропии от защищенного элемента, поднимая их примерно до 72 бит.
Ни одно из них не равно 128 — целевому значению.
Разрыв значит больше, чем кажется. Биты — это показатели степени. Пространство поиска в 128 бит содержит больше комбинаций, чем атомов в наблюдаемой вселенной, и никто его не ищет. Сорок бит — это около триллиона — число, которое приличный ноутбук может перебрать. Каждый потерянный бит вдвое сокращает работу.
Инженерная команда Block, опубликовавшая свой собственный анализ, оценила эффективное пространство поиска защищенного элемента для новых устройств в 2^32 кандидатов, в среднем около 2^31 попыток. Их оценка для старых плат более прямолинейна: для известного идентификатора устройства, состояния таймера и истории вызовов генерация кошелька детерминирована.
А детерминированность противоположна случайности, которая необходима для криптографии.
Не «слабый». Предсказуемый.
Coinkite подозревает, что это было найдено машиной. «Мы должны предположить, что кто-то использовал ИИ для просмотра предыдущих версий нашей прошивки и наткнулся на эту проблему», — написала компания, добавив, что недавно прогнала одну из лучших доступных моделей ИИ по тому же коду, и она ничего не нашла. «И у атакующих, и у защитников одни и те же инструменты ИИ, но сегодня он не помог нам, а помог только плохим парням».
Исправленная прошивка выпущена для всех затронутых моделей. Она не восстанавливает существующие сиды; эти кошельки необходимо перегенерировать и перевести средства. Decrypt рассказывал, как хранение с воздушным зазором меняется после такого эксплойта, и отслеживал потери, превысившие 114 миллионов долларов.
Что такое энтропия на самом деле
Энтропия — это мера того, чего злоумышленник не знает.
Другими словами, это, по сути, неопределённость, измеряемая в битах. Один бит — это одно подбрасывание монеты: два исхода, и угадывающий угадывает правильно в половине случаев. Десять бит — это 1024 исхода. Каждый бит удваивает нагрузку на угадывающего.
Биткоин-кошелёк — это очень большое число, хранящееся в секрете. Адрес, на который люди отправляют монеты, математически выводится из него, и вывод работает только в одну сторону — вы можете перейти от ключа к адресу, но никогда обратно.
Таким образом, безопасность каждого кошелька зависит от одного вопроса: сколько чисел злоумышленнику придётся перепробовать?
Если число было выбрано со 128 битами энтропии, ответ: «больше, чем позволяют законы физики». Если оно было выбрано с 40, ответ: «дайте мне немного времени».
Это же свойство делает угрозу квантовых вычислений достойной обсуждения — квантовая машина атаковала бы математику, связывающую ключ с адресом. Багу Coldcard это никогда не требовалось. Он сделал ключи угадываемыми до того, как в дело вступила эта математика.
Здесь словарный запас становится скользким. Псевдослучайный генератор выдаёт результат, проходящий статистические тесты на случайность, так что в основном ничто, что пометила бы электронная таблица. Этот результат всё равно полностью определяется его начальным значением. Он выглядит случайным, но не является таковым.
Статистическая случайность и криптографическая непредсказуемость — разные свойства, и вывод Coldcard прошёл бы первый тест, полностью провалив второй.
Истинная случайность должна исходить из физического шума: электрического дрожания в цепи, тепловых флуктуаций, радиоактивного распада. Именно для этого и был аппаратный чип в Coldcard. Именно этот чип отключил флаг сборки.
Затем Люк Дашджр упомянул игральные кости
Пока пользователи в спешке пересоздавали сиды, многие обратились к очевидному низкотехнологичному решению. Coldcard позволяют бросать физические игральные кости и вводить результаты как энтропию. Собственные рекомендации Coinkite считают сиды, созданные как минимум с 50 независимыми и приватными бросками костей, не подверженными риску из-за бага.
Это может звучать глупо, но компания на самом деле продаёт мешочек со «100 милыми крошечными игральными костями», чтобы облегчить вам весь процесс.
31 июля разработчик Bitcoin Core Люк Дашджр опубликовал предупреждение: «Довольно много людей предлагают/используют игральные кости для снижения уязвимости Coldcard. Обратите внимание, что обычные кости не предназначены для криптографической безопасности. Если вы собираетесь это делать, вам, вероятно, следует купить точные казино-кости. И даже тогда имейте другой источник энтропии».
Биткоин-Твиттер воспринял это не спокойно.
«Лол, теперь даже кости бросить нельзя», — написал один пользователь. «С самостоятельным хранением покончено...» Другой спросил, не стоит ли ему нанять человека с болезнью Паркинсона, чтобы тот бросал их. (Нехорошо.)
Стоит ли мне нанять человека с болезнью Паркинсона, чтобы бросать кости?
— Murern (@Bitcoin_Murern) 31 июля 2026 г.
Вероятно, самый полезный ответ пришёл с арифметикой. Разработчик Джастин Шарп подсчитал, сколько именно вам стоит плохая кость:
«Излишне. Идеальная d6 даёт 2,585 бита на бросок. Заметно смещённая кость, например, с одной гранью, выпадающей в 20% случаев вместо 16,7%, всё ещё даёт около 2,55 бита. За 99 бросков это разница между ~256 битами и ~252 битами энтропии».
Четыре бита из 256. Вот и вся цена за явно нечестную кость.
Дашджр не ошибается в том, что дешёвые кости имеют измеримое смещение — литые под давлением точки удаляют немного разное количество пластика с каждой грани, именно поэтому в казино используют прецизионные кости с заполненными точками. Он прав в физике и неправ в ставках. Потеря четырёх бит из 256 оставляет вас на 252. Ошибка Coldcard оставила пользователей на 40.
Однако в его совете скрыт более резкий аргумент, и он не о производственных допусках. Он о том, чтобы не доверять ни одному источнику. Ошибка Coldcard заключалась не в том, что его энтропия была слегка смещена, а в том, что один компонент молча перестал вносить вклад, и никто этого не заметил.
Что с этим делать
Если вы сгенерировали сид на затронутом Coldcard без бросков костей (серьёзно) или без надёжной BIP-39 парольной фразы, этот сид скомпрометирован.
Обновите прошивку, сгенерируйте новый сид, проверьте отпечаток, отправьте тестовую транзакцию, затем переведите всё. Рекомендации Coinkite описывают это пошагово для каждой модели. Экспортированные сиды несут с собой дефект — перенос плохого сида в другое приложение-кошелёк ничего не решает.
Для всех остальных вывод не в том, что аппаратные кошельки сломаны или что игральные кости — это ловушка.
Дело в том, что «случайность» — это утверждение, и утверждения нужно проверять. Исходный код Coldcard всё время был публичным. Предполагаемый аппаратный ГСЧ находился прямо в бинарном файле. Рецензенты подтвердили, что он существует, но никогда не подтверждали, что генератор сид-кодов действительно его вызывает.
Восемь лет аудитов смотрели на правильный код. Никто не проверил, выполняется ли он.







