Уязвимость Coldcard для Bitcoin: как ошибка прошивки снизила энтропию ключей и привела к краже на 130 миллионов долларов
Ключевые выводы
- •Ошибка конфигурации сборки привела к тому, что кошельки Coldcard использовали программный генератор псевдослучайных чисел вместо предусмотренного аппаратного чипа случайности, снизив энтропию со 128 бит примерно до 40 бит на устройствах Mk2 и Mk3.
- •Galaxy Research подтвердила кражу не менее 1 596 BTC в ходе трёх волн атак, причём подозреваемая четвёртая волна может увеличить общие потери примерно до 2 055 BTC, или около 130 миллионов долларов.
- •Уязвимость оставалась незамеченной примерно восемь лет, несмотря на то что исходный код Coldcard был публично доступен для проверки сообществом.
- •Coinkite выпустила исправленную прошивку для всех затронутых моделей, однако обновление не может восстановить существующие сид-фразы — пользователям необходимо создать новые кошельки и вручную перевести все средства.
- •Coinkite предполагает, что злоумышленники обнаружили уязвимость с помощью анализа кода на базе ИИ, отметив, что собственный недавний ИИ-анализ того же кода не выявил проблемы.

Ошибка прошивки привела к тому, что аппаратные кошельки Coldcard генерировали сид-фразы с использованием программного генератора псевдослучайных чисел вместо выделенного аппаратного чипа случайности, предназначенного для этой задачи. Данная уязвимость фактически сократила пространство перебора со 128 бит примерно до 40 бит на старых моделях устройств, что позволило злоумышленникам вычислять приватные ключи и опустошать кошельки, которые никогда не должны были быть доступны.
Монеты хранились на устройствах Coldcard — аппаратных кошельках производства канадской компании Coinkite, разработанных для работы в автономном режиме. Coldcard широко рекомендовались в кругах безопасности Bitcoin именно за свою изолированную архитектуру и прозрачность, что делает этот сбой особенно значимым для пользователей, выбравших устройство именно из-за его репутации в области безопасности. Никаких фишинговых ссылок, вредоносного ПО или кражи устройств не было. Злоумышленники просто вычислили приватные ключи.
Galaxy Research отследила кражу более 1 596 BTC в ходе трёх подтверждённых волн, при этом подозреваемая четвёртая волна может увеличить общую сумму примерно до 2 055 BTC — около 130 миллионов долларов по текущим ценам. Одна операция вывела средства на 70 миллионов долларов за 41 минуту. По словам Coinkite, в атаках приняли участие как минимум 15 отдельных злоумышленников. Подавляющее большинство крупномасштабных краж криптовалют основывалось на социальной инженерии, взломах бирж или эксплойтах смарт-контрактов; уязвимость, позволившая злоумышленникам вычислять ключи исключительно на основе метаданных устройства, представляет собой принципиально иную поверхность угроз.
Компания опубликовала технический обзор 1 августа, разъясняющий, что пошло не так. Это необычно откровенный документ; если кратко, кошелёк фактически бросал краплёные кости в течение восьми лет, и никто этого не замечал.
Ноль — это тоже значение
В 2021 году Coinkite перенесла криптографию Coldcard на libsecp256k1 — ту же библиотеку, которую использует Bitcoin Core. Именно в процессе интеграции и возникла проблема.
Миграция незаметно перенаправила генерацию сид-фраз с собственного аппаратного генератора случайных чисел Coldcard на программный резерв MicroPython — небольшой алгоритм под названием Yasmarang, предназначенный для устройств, вообще не имеющих чипа случайности.
🚨LOSSES FROM COLDCARD HACK EXCEED $100M
High confidence 1,596 BTC has been stolen from ~7300 addresses across 3 confirmed waves + more 14 smaller incidents.
If we add suspected (but unconfirmed), the total balloons to $130m (2k BTC).
More in the thread below 👇 pic.twitter.com/RAl3ib67qa
— Galaxy Research (@glxyresearch) August 3, 2026
В Coldcard есть чип случайности. Он просто перестал вызываться.
Причина почти слишком незначительна, чтобы в неё поверить. Защита сборки использовала #ifndef, который проверяет, существует ли настройка, а не включена ли она. Coinkite определила эту настройку как ноль, что означает «выключено». Поскольку ноль также считается определённым значением, проверка безопасности прошла успешно, и сборка завершилась. Обе версии функции имели идентичные сигнатуры, поэтому ничего не казалось неправильным. Ошибки конфигурации сборки такого типа — когда директива препроцессора незаметно выбирает неверный путь выполнения кода — представляют собой известный класс дефектов в разработке на C и C++, однако их крайне сложно обнаружить с помощью тестирования, поскольку скомпилированный бинарный файл ведёт себя нормально во всех наблюдаемых аспектах.
«Основная часть случайности в COLDCARD поступала от PRNG, о наличии которого в исходном коде я даже не знал», — написала Coinkite, имея в виду генератор псевдослучайных чисел — программное обеспечение, которое выдаёт числа, выглядящие случайными, но следующие фиксированному алгоритму от начального значения. Подайте алгоритму то же начальное значение — и результат будет идентичным. Каждый раз.
На устройствах Mk2 и Mk3 под управлением прошивки версий с 4.0.1 по 4.1.9 это начальное значение формировалось на основе серийного номера чипа и его часов. Coinkite оценивает результирующее пространство перебора примерно в 40 бит. Более новые модели подмешивали небольшое количество энтропии из защищённого элемента, увеличивая пространство перебора примерно до 72 бит.
Ни одно из значений не достигает 128 — целевого показателя.
Разрыв имеет большее значение, чем кажется. Биты — это экспоненты. 128-битное пространство перебора содержит больше комбинаций, чем атомов в наблюдаемой Вселенной, что делает полный перебор практически невозможным. Сорок бит — это примерно триллион вариантов, число, с которым справится обычный ноутбук. Каждый потерянный бит вдвое сокращает объём работы злоумышленника.
Инженерная команда Block, опубликовавшая собственный анализ, оценила эффективное пространство перебора защищённого элемента новых устройств в 2^32 кандидатов, в среднем около 2^31 попыток. Их оценка для старых плат ещё прямолинейнее: при известном идентификаторе устройства, состоянии таймера и истории вызовов генерация кошелька является детерминированной. А детерминированность — это противоположность случайности, свойства, необходимого для криптографии.
Не «слабая». Предсказуемая.
Coinkite полагает, что уязвимость была обнаружена с помощью автоматизированного анализа кода. «Мы должны исходить из того, что кто-то использовал ИИ для анализа предыдущих версий нашей прошивки и наткнулся на эту проблему», — написала компания, добавив, что недавно прогнала одну из лучших доступных моделей ИИ по тому же коду и ничего не обнаружило. «И у злоумышленников, и у защитников есть одни и те же ИИ-инструменты, но сегодня они не помогли нам, а помогли только плохим парням».
Исправленная прошивка выпущена для всех затронутых моделей. Она не восстанавливает существующие сид-фразы; эти кошельки должны быть пересозданы, а средства перемещены. Decrypt освещал изменения в практике изолированного хранения после подобного эксплойта и отслеживал рост потерь, превысивших 114 миллионов долларов.
Что такое энтропия на самом деле
Энтропия измеряет, насколько много злоумышленник не знает — иными словами, неопределённость, измеряемую в битах. Один бит равен одному подбрасыванию монеты: два исхода, и угадывающий получает правильный результат в половине случаев. Десять бит — это 1 024 исхода. Каждый дополнительный бит удваивает нагрузку угадывающего.
Bitcoin-кошелёк по своей сути — это очень большое число, хранящееся в секрете. Адрес, на который люди отправляют монеты, математически выводится из него, и этот вывод работает только в одном направлении — можно перейти от ключа к адресу, но никогда обратно.
Безопасность каждого кошелька, таким образом, зависит от ответа на один вопрос: сколько чисел пришлось бы перебрать злоумышленнику? Если число выбрано с энтропией 128 бит, ответ — «больше, чем допускает физика». Если оно выбрано с энтропией 40 бит, ответ — «дайте мне немного времени».
Именно это свойство делает угрозу квантовых вычислений предметом дискуссий — квантовая машина атаковала бы математическую связь между ключом и адресом. Ошибка Coldcard не требовала ничего столь сложного. Она сделала ключи угадываемыми до того, как эта математика вообще вступала в дело.
Здесь терминология становится скользкой. Генератор псевдослучайных чисел выдаёт результат, который проходит статистические тесты на случайность — ничего такого, что обнаружила бы электронная таблица. Однако этот результат по-прежнему полностью определяется начальным значением. Он выглядит случайным, но не является таковым.
Статистическая случайность и криптографическая непредсказуемость — разные свойства. Результат Coldcard прошёл бы первый тест с лёгкостью, но полностью провалил второй.
Истинная случайность должна поступать от физического шума: электрических колебаний в цепи, тепловых флуктуаций, радиоактивного распада. Именно для этого и был предназначен аппаратный чип в Coldcard. Это тот самый чип, который отключил флаг сборки.
Тут вмешался Люк Дашр с кубиками
Когда пользователи бросились пересоздавать сид-фразы, многие обратились к очевидному низкотехнологичному решению. Coldcard позволяет бросать физические кубики и вводить результаты в качестве энтропии. Руководство самой Coinkite считает сид-фразы, созданные по меньшей мере из 50 независимых приватных бросков кубиков, не подверженными уязвимости. Компания даже продаёт пакет из «100 милых маленьких кубиков» для облегчения процесса.
31 июля разработчик Bitcoin Core Люк Дашр опубликовал предупреждение: «Довольно много людей предлагают/используют кубики для смягчения уязвимости Coldcard. Обратите внимание, что обычные кубики не предназначены для криптографической надёжности. Если вы собираетесь это делать, вам, вероятно, следует купить точные казино-кубики. И даже в этом случае используйте дополнительный источник энтропии».
Bitcoin-Твиттер отреагировал неспокойно.
«ха-ха, теперь нельзя даже бросить кубики,» — написал один пользователь. «Самохранение больше не работает...» Другой спросил, не стоит ли нанять человека с болезнью Паркинсона, чтобы бросать их.
should I hire someone with parkinsons to throw the dice? — Murern (@Bitcoin_Murern) July 31, 2026
Самый полезный с технической точки зрения ответ был снабжён расчётами. Разработчик Джастин Шарп подсчитал, сколько именно энтропии стоит смещённый кубик:
«Избыточно. Идеальный d6 даёт 2.585 бита за бросок. Заметно смещённый кубик, например, с одной гранью, выпадающей в 20% случаев вместо 16.7%, всё равно даёт около 2.55 бита. За 99 бросков разница составляет ~256 бит против ~252 бит энтропии.»
Четыре бита из 256. Вот и вся цена явно нечестного кубика.
Дашр не ошибается в том, что дешёвые кубики имеют измеримое смещение — литые точки удаляют немного разное количество пластика с каждой грани, и именно поэтому казино используют кубики с заподлицо вставленными точками. Он прав в физике и неправ в оценке значимости. Потеря четырёх бит из 256 оставляет 252. Ошибка Coldcard оставила пользователей на 40.
В его совете скрыт более серьёзный аргумент, и он не касается допусков при производстве. Он касается недоверия к любому одиночному источнику энтропии. Сбой Coldcard заключался не в том, что его случайность была слегка смещённой — а в том, что один компонент незаметно перестал вносить свой вклад, и ничего этого не обнаружило.
Что с этим делать
Если вы сгенерировали сид-фразу на затронутом Coldcard без бросков кубиков или без надёжной BIP-39 парольной фразы, эту сид-фразу следует считать скомпрометированной.
Рекомендуемые шаги: обновить прошивку, сгенерировать новую сид-фразу, проверить отпечаток, отправить тестовую транзакцию, затем переместить все средства. Руководство Coinkite описывает процесс для каждой модели. Экспортированные сид-фразы переносят уязвимость с собой — импорт скомпрометированной сид-фразы в другое приложение кошелька ничего не решает.
Для всех остальных вывод состоит не в том, что аппаратные кошельки сломаны или что кубики — ловушка. Он в том, что «случайность» — это утверждение, а утверждения требуют проверки. Исходный код Coldcard был публичным всё это время. Предусмотренный аппаратный RNG присутствовал в бинарном файле. Рецензенты подтвердили его наличие, но никогда не проверяли, действительно ли генератор сид-фраз его вызывает. Модель open-source, которую поддерживает Coldcard, основана именно на том, что такого рода проверка сообществом будет выявлять ошибки до того, как их обнаружат злоумышленники. Восемь лет аудита смотрели на правильный код. Никто не проверил, выполнялся ли он.