01.08.2027 273 материалов

Баг в прошивке аппаратного кошелька Coldcard привёл к краже биткоинов на $70 млн за 41 минуту

Атакующий вывел 1 082 BTC с 1 196 адресов за 41 минуту, воспользовавшись ошибкой в генерации сид-фразы в прошивке Coldcard. Уязвимость оставалась незамеченной более пяти лет.

Баг в прошивке аппаратного кошелька Coldcard привёл к краже биткоинов на $70 млн за 41 минуту

Один дефект в коде прошивки — и $70 миллионов в биткоинах испарились из кошельков за 41 минуту. Это не фишинг, не взлом сервера и не социальная инженерия. Проблема оказалась в самом устройстве, которое должно было защищать средства лучше всего.

Что произошло

30 июля 2026 года анонимный злоумышленник опустошил 1 196 биткоин-адресов, забрав 1 082,65 BTC — около $70,2 миллиона по тогдашнему курсу. Вся операция заняла 41 минуту. Исследователи из Galaxy Research проследили транзакции и пришли к выводу, что все пострадавшие адреса были связаны с одним и тем же аппаратным кошельком — Coldcard производства канадской компании Coinkite.

Это один из крупнейших инцидентов, напрямую связанных с уязвимостью в «железном» криптокошельке. И, что самое неприятное, баг существовал в прошивке с марта 2021 года — больше пяти лет.

В чём именно была ошибка

Разберёмся по порядку. Когда вы создаёте аппаратный кошелёк, он генерирует так называемую сид-фразу (seed) — набор из 12 или 24 слов, который является корнем всех ваших адресов и ключей. Безопасность сид-фразы напрямую зависит от качества случайных чисел, которые использует устройство при её создании. Если случайные числа предсказуемы — злоумышленник может воспроизвести ту же самую сид-фразу и получить доступ к вашим средствам, даже не прикасаясь к устройству.

Вот тут и кроется ошибка. В марте 2021 года в конфигурацию прошивки Coldcard закралась интеграционная ошибка. Из-за неё генерация сид-фразы пошла не через аппаратный генератор случайных чисел (STM32 Hardware RNG), а через программный псевдослучайный генератор MicroPython — детерминированный, то есть полностью предсказуемый при известных начальных условиях.

Конкретнее: Coinkite использует собственную обёртку над аппаратным RNG и поэтому отключает стандартный модуль в конфигурации сборки (макрос MICROPY_HW_ENABLE_RNG выставлен в ноль). Но библиотека libngu проверяла не значение макроса, а его наличие. Макрос был объявлен — и сборка молча переключилась на программный fallback из MicroPython, который инициализировался только из уникального ID чипа и состояния таймера, без сбора новой энтропии.

Для обычного пользователя это выглядит так: ваш кошелёк думал, что генерирует криптографически стойкие случайные числа, а на деле использовал предсказуемый алгоритм.

Насколько это было предсказуемо

Coinkite оценивает эффективную энтропию сгенерированных таким образом сид-фраз примерно в 40 бит для модели Mk3 и около 72 бит для Mk4, Mk5 и Q. Для сравнения: полноценная 12-словная сид-фраза по стандарту BIP-39 содержит 128 бит энтропии. Разница колоссальная.

Исследователи из Block (бывший Square) подтвердили уязвимость и пояснили: атакующий, который может определить или достаточно сузить пространство возможных значений UID устройства, состояния таймера и истории предыдущих вызовов генератора, способен воспроизвести потенциальные сид-офлайн. После этого остаётся лишь вывести адреса из кандидатных сид и сверить их с публичными данными блокчейна.

Block не публиковал практических бенчмарков по брутфорсу, но установил верхние границы сложности — ниже 2^40,7 для Mk3 и ниже 2^73,3 для более новых моделей. Это не значит, что атака тривиальна, но при определённых условиях вполне осуществима.

Какие устройства пострадали

Важно понимать: уязвима не та прошивка, которая установлена на устройстве сейчас, а та, которая работала в момент создания сид-фразы. Если вы создали seed на уязвимой прошивке, а потом обновились — сид остаётся скомпрометированной.

Затронутые версии:

  • Mk2 и Mk3: прошивки 4.0.0–4.1.9 (исправлено в 4.2.0)
  • Mk4 и Mk5: всё до версии 5.6.0
  • Q: всё до версии 1.5.0Q
  • Экспериментальные сборки: до 6.6.0X для Mk4/Mk5 и до 6.6.0QX для Q

Кошельки TAPSIGNER, OPENDIME и SATSCARD от того же производителя используют другой код и не затронуты.

Что сделал производитель

Coinkite выпустил экстренное обновление прошивки 31 июля — на следующий день после кражи. Обновление доступно для всех затронутых моделей. Но вот нюанс: установка патча не восстанавливает уже скомпрометированную сид-фразу. Если ваш seed был создан на уязвимой прошивке, обновление не спасает.

Компания рекомендует владельцам с потенциально затронутыми сидами:

  1. Обновить прошивку до последней версии.
  2. Сгенерировать новую сид-фразу на уже исправленной прошивке.
  3. Перевести все средства на новые адреса.

Если сид-фраза была создана с помощью кубиков (dice rolls), и вы точно уверены, что использовали не менее 50 честных, независимых бросков с сохранением приватности — сид формально не уязвима для этой конкретной атаки. Но при малейших сомнениях Coinkite рекомендует перенос средств.

Отдельно компания отмечает: сильная уникальная BIP-39 пассфраза (passphrase) создаёт отдельный кошелёк, к которому сид-слова сами по себе доступа не дают. Но даже с пассфразой Coinkite советует заменить сид.

Насколько это серьёзно для обычного пользователя

Давайте начистоту: аппаратные кошельки покупают именно для того, чтобы защитить средства от удалённых атак. Сама идея Coldcard и подобных устройств — хранить приватные ключи в изоляции от интернета и компьютера. И вот оказывается, что на уровне прошивки могла сработать резервная программа, которая делает сид-фразу предсказуемой.

Это не значит, что все аппаратные кошельки бесполезны. Но инцидент напоминает несколько важных вещей:

  • Аппаратный кошелёк — не абсолютная гарантия. Он снижает риски, но не устраняет их. Ошибки в прошивке, так же как и в любом ПО, случаются.
  • Обновления прошивки нужно устанавливать. Злоумышленник воспользовался багом, который существовал пять лет. Многие пользователи просто не обновляют устройства после покупки.
  • Multi-signature (мультиподпись) действительно работает. Но только если кошельки в мультисиг-схеме используют разные модели или производителей. Если все ключи на скомпрометированных Coldcard — мультиподпись не спасает.
  • Сид-фраза, созданная на устройстве — это не то же самое, чем сид, вбитая вручную с кубиков. Второй вариант не зависит от качества генератора случайных чисел устройства.

Кто стоит за атакой

Имя злоумышленника неизвестно. Galaxy Research, которая картографировала все 1 196 адресов, отметила уникальную подпись операции: комиссия 30 сатоши за виртуальный байт, отсутствие сдачи (change). За предшествующие 30 дней в блокчейне не было других транзакций с таким же паттерном.

Но исследователи подчёркивают: этот паттерн идентифицирует оператора, а не факт кражи. Выглядит «заметание» кошельков так же, как если бы владелец сам решил перевести все монеты на другой адрес.

Контекст: слабые генераторы как тренд

Интересно, что инцидент с Coldcard — не единственный случай в последнее время. В начале июля исследователи из Coinspect опубликовали работу под названием Ill Bloom, где описали похожую проблему со слабым PRNG в старых программных кошельках. Там речь шла о более чем $5 миллионах, украденных с адресов в Bitcoin, Ethereum, Tron, Rootstock и Polygon с мая 2026 года.

Паттерн один и тот же: детерминированный или недостаточно энтропийный генератор случайных чисел делает сид-фразу угадываемой. И если раньше подобные проблемы казались теоретическими, теперь у них есть вполне конкретный ценник — $70 миллионов.

Что делать прямо сейчас

Если у вас есть Coldcard любой модели и вы не уверены, на какой прошивке создавалась сид-фраза — обновите устройство и перенесите средства. Это не паника, а разумная предосторожность. Процедура занимает от силы полчаса и потенциально может спасти все накопления.

Если вы только выбираете аппаратный кошелёк — инцидент не повод отказываться от идеи в целом. Но стоит обращать внимание на открытость кода, регулярность аудитор и скорость реакции производителя на инциденты. Coinkite, надо отдать должное, отреагировала за день. Но сам факт, что баг продержался пять лет, ставит вопросы к процессам внутреннего тестирования.