594 BTC за 25 минут: как один баг мог превратить «непробиваемые» Coldcard в лотерею
Зиберов
Около594 BTC стоимостью свыше $38 млн были выведены из сотен Bitcoin-адресов в течение примерно 25 минут. Аналитики насчитали 1 324 потраченных UTXO и около 500 транзакций в окне всего из трёх блоков. Большая часть монет затем была собрана на одном адресе.
Масштаб и синхронность движения похожи на автоматизированную зачистку заранее найденных кошельков.
Почти одновременно производитель Coldcard выпустил экстренное предупреждение: seed-фразы, созданные на ряде версий прошивки, могли получить значительно меньше случайности, чем предполагалось.
Связь между уязвимостью и выводом всех 594 BTC пока окончательно не доказана — расследование продолжается. Но совпадение выглядит крайне тревожно.
К устройствам никто не прикасался
Для такой атаки не нужно красть аппаратный кошелёк, подключать его к интернету или устанавливать вирус.
Если seed-фраза изначально создана из недостаточно случайного числа, злоумышленник может заранее перебрать ограниченный набор возможных вариантов, вычислить связанные адреса и наблюдать за ними в блокчейне.
Как только на найденных адресах появляются монеты, остаётся подписать транзакции уже известными приватными ключами.
**Air gap защищает секрет от передачи наружу. Но он бесполезен, если секрет оказался предсказуемым ещё в момент создания.**
Что сломалось
При создании Bitcoin-кошелька устройство должно получить криптографически стойкую случайность — энтропию. Из неё формируется seed-фраза, а затем все приватные ключи и адреса.
В уязвимых прошивках Coldcard безопасный аппаратный генератор случайных чисел мог фактически не участвовать в нужном процессе. Вместо ожидаемой случайности использовались более предсказуемые программные данные, включая внутренние состояния и временные значения.
В результате пространство возможных seed-фраз могло оказаться намного меньше ожидаемого.
Для пользователя 24 слова выглядели абсолютно случайными. Для подготовленного атакующего они могли быть частью заранее вычислимого списка кандидатов.
Разница критическая:
— нормальный seed практически невозможно перебрать; — слабый seed можно искать среди ограниченного набора вариантов; — известный адрес позволяет быстро проверить, найден ли правильный ключ.
Пять лет тишины могли быть частью атаки
Проблемный код появился в прошивке Mk3 версии **4.0.1**, выпущенной в марте 2021 года. Уязвимые кошельки могли годами получать Bitcoin и выглядеть полностью безопасными.
Возможный сценарий особенно неприятен:
1. Атакующий обнаруживает слабую генерацию seed. 2. Заранее рассчитывает возможные приватные ключи. 3. Следит за связанными адресами в блокчейне. 4. Не трогает небольшие суммы, чтобы не раскрывать атаку. 5. Ждёт, пока общий баланс станет достаточно крупным. 6. Одновременно опустошает найденные кошельки.
Поэтому несколько лет без происшествий ничего не доказывают. Если приватный ключ уже известен кому-то ещё, отсутствие кражи означает лишь то, что он пока решил не действовать.
Затронут мог быть не один Mk3
Первоначально внимание было сосредоточено на Coldcard Mk3. Однако обновлённое предупреждение Coinkite расширило список устройств и прошивок, которые необходимо проверить:
— **Mk3** с прошивкой от `4.0.1` до `4.1.9`; — **Mk4 и Mk5** до стандартной прошивки `5.6.0`; — **Coldcard Q** до версии `1.5.0Q`; — Edge-ветки Mk4/Mk5 до `6.6.0X`; — Edge-ветки Q до `6.6.0QX`.
По оценке производителя, у новых моделей воздействие могло быть менее тяжёлым, но всё равно серьёзным: seed мог иметь около **72 бит энтропии вместо ожидаемых 128**.
Критически важно, **где и на какой прошивке seed был создан**, а не в каком устройстве он находится сейчас.
Перенос старой фразы в новый Coldcard, Ledger, Trezor или программный кошелёк не создаёт новый приватный ключ и не исправляет исходную слабость.
Обновление прошивки не спасает старую seed-фразу
Исправленная прошивка обеспечивает корректное создание новых seed-фраз. Но она не может добавить случайность в уже существующую фразу.
Поэтому недостаточно обновить устройство и продолжить использовать прежний кошелёк.
Нужно:
1. Установить исправленную прошивку. 2. Создать полностью новый seed. 3. Надёжно сохранить резервную копию. 4. Проверить адрес на экране аппаратного кошелька. 5. Отправить небольшую тестовую транзакцию. 6. После подтверждения перевести оставшиеся средства.
Спешка тоже опасна: ошибка при записи новой фразы или проверке адреса способна привести к потере средств быстрее самой уязвимости.
Спасают ли passphrase и кубики
Сильная уникальная **BIP-39 passphrase** создаёт дополнительный независимый барьер. Одного знания слабого seed атакующему уже недостаточно — потребуется угадать ещё и дополнительную фразу.
Но обычное слово, имя, цитата или повторно используемый пароль могут быть перебраны.
Важно: речь идёт именно о **BIP-39 passphrase**, а не о PIN-коде устройства.
Даже пользователям с сильной passphrase производитель рекомендует перейти на новый корректно созданный seed. Passphrase снижает срочность риска, но не исправляет источник проблемы.
Отдельная ситуация — пользователи, которые при создании seed добавили минимум **50 честных, независимых и секретных бросков кубика**. По оценке производителя, такой ввод сам по себе добавлял не менее 128 бит энтропии.
Если бросков было меньше или точное число неизвестно, seed разумно считать потенциально уязвимым.
Open source не означает «кто-то точно проверил»
Код Coldcard был доступен для изучения. Однако уязвимость, затрагивающая сам фундамент кошелька, могла оставаться в релизах годами.
Публикация исходников даёт возможность провести аудит, но не гарантирует, что его действительно провели достаточно внимательно.
Для безопасности нужны:
— независимые аудиты; — тестирование генераторов случайных чисел; — воспроизводимые сборки; — проверка изменений прошивки; — анализ реального потока энтропии; — прозрачное раскрытие найденных проблем.
Фраза **«не доверяй — проверяй»** работает только тогда, когда кто-то действительно проверяет.
Урок гораздо шире одного производителя
Аппаратный кошелёк не хранит Bitcoin внутри корпуса. Он хранит ключ, позволяющий распоряжаться монетами в блокчейне.
Если ключ сгенерирован правильно, подобрать его на практике невозможно.
Если случайность сломана, Secure Element, PIN-код, металлическая пластина для seed и полная изоляция от сети защищают уже предсказуемый секрет.
История Coldcard показывает неприятную правду: безопасность кошелька определяется не одним модным словом вроде `air-gapped`, `open source` или `secure element`.
Она начинается с первой случайной цифры, из которой был создан приватный ключ.
**594 BTC могли исчезнуть не потому, что злоумышленник взломал устройства. Возможно, ему вообще не пришлось ничего взламывать — устройства сами создали ключи, которые можно было вычислить.**
Источники:
— https://blog.coinkite.com/coldcard-mk3-seed-generation-warning/ — https://www.finanzen.net/nachricht/devisen/coldcard-issues-mk3-warning-as-experts-examine-38m-bitcoin-wallet-drain-15836011 — https://www.blocktrainer.de/blog/schwachstelle-bei-cold-card-hunderte-bitcoin-von-wallets-gestohlen