
Когда отказывает случайность: ошибка энтропии Coldcard и что меняют два устройства
В конце июля 2026 года злоумышленники начали выводить биткоины из тысяч аппаратных кошельков, которые не сделали ничего плохого. Их владельцы следовали советам. Купили отдельное устройство для подписи, держали сид офлайн, никогда не вводили его на сайте. Ничего из этого не помогло, потому что сид, который эти устройства порождали, никогда не был настолько случайным, каким выглядел.
Около 1816 BTC покинули более 5200 адресов четырьмя волнами. Это стало крупнейшим эксплойтом аппаратных кошельков за год.
Эта статья — не круг почёта. Ошибка, о которой идёт речь, из тех, что могли случиться почти с любым кошельком, включая наш, и интересный вопрос не в том, кто её выпустил, а в том, что делает архитектура кошелька, когда она случается.
Что именно пошло не так
Один коммит, в марте 2021 года.
Замысел Coldcard предполагал порождение сидов аппаратным генератором случайных чисел — отдельным чипом, извлекающим энтропию из физических процессов. Это правильный путь. Но изменение в прошивке 4.0.1 направило порождение сидов через программный псевдослучайный генератор, засеянный публичными, жёстко зашитыми константами.
ГПСЧ детерминирован по определению. При одном и том же начальном значении он всегда выдаёт одну и ту же последовательность. Значит, сид, порождённый так, — не число, которое никто не может угадать: это число из множества, достаточно малого, чтобы его перебрать, полученное с константами, всё это время лежавшими в опубликованной прошивке.
Устройства продолжали вести себя нормально. Показывали двадцать четыре слова, их записывали, они выводили верные адреса и подписывали действительные транзакции. Ни в одном кошельке нет экрана, который показал бы вам, сколько энтропии вошло в ваш сид. У каждого пострадавшего было устройство, которое выглядело и вело себя ровно как исправное — вплоть до пяти лет.
Окно тянется от прошивки 4.0.1 в марте 2021-го до 4.1.9 в июле 2026-го. Обновление прошивки чинило порождение с этого момента и не делало ровным счётом ничего для уже созданных сидов: те ключи уже были слабы, и никакое обновление не добавит задним числом случайности числу, давно записанному на карточке в чьём-то сейфе. Пострадавшим пришлось породить новый сид и перевести монеты.
Почему слабая случайность — это тихая полная потеря
Стоит быть точным в том, почему этот класс ошибок так тяжёл, потому что это не интуитивно.
Сид BIP-39 из 24 слов представляет 256 бит энтропии. Угадать его не просто трудно — это невообразимо: нет компьютера, нынешнего или будущего, который перебрал бы это пространство. Это фундамент, на котором стоит вся модель самостоятельного хранения: ваш ключ в безопасности, потому что он один из непостижимо большого числа возможностей.
Эта гарантия — не свойство слов. Это свойство процесса, который их выбрал. Двадцать четыре слова из слабого генератора выглядят так же, как двадцать четыре из сильного. Они проходят любую контрольную сумму, дают верные адреса и безупречно восстанавливаются в любом кошельке. Единственная разница в том, что кто-то другой тоже может к ним прийти.
Так что отказ невидим изнутри, и он полон. Не «злоумышленник мог бы вас обокрасть, если вы ошибётесь» — нет ошибки, которой надо избежать, нет фишинговой ссылки, которую надо отклонить, нет диалога подтверждения, который надо внимательно прочесть. Деньги можно забрать, когда злоумышленнику удобно, и первый признак, что что-то было не так, — что их нет.
Что меняют два устройства

Вот часть, важная архитектурно, и я хочу изложить её точно, а не в маркетинговых выражениях.
SSP — это мультиподпись 2 из 2. Средства лежат по адресу, который контролируют два независимых ключа, порождённых на двух независимых устройствах: один в браузерном расширении, другой в мобильном приложении SSP Key, — и транзакция требует обеих подписей. Схема два-из-двух — это вся основа кошелька.
Теперь примерьте сценарий Coldcard к этой структуре. Допустим, порождение сида в расширении имело тот же дефект и злоумышленник способен полностью вывести ваш браузерный ключ.
Потратить он всё равно ничего не может. У него одна из двух требуемых подписей. Адрес не отпускает средства по одному ключу, чей бы он ни был и как бы ни был получен. Чтобы сдвинуть ваши монеты, ему пришлось бы вдобавок, независимо и одновременно, взломать ключ на вашем телефоне — другое приложение, другая операционная система, другой источник энтропии, порождённый в другой момент.
В этом структурная разница. В однокейном кошельке слабый сид — полная потеря. В 2 из 2 слабый сид — серьёзная проблема, которая сама по себе потерей не является.
Оговорка, сказанная прямо
Легко было бы остановиться здесь и позволить вам заключить, что SSP к этому невосприимчив. Это не так, и притворяться иначе во время чужого инцидента — ровно неподходящий момент.
Оба приложения SSP используют одну и ту же реализацию BIP-39 — @scure/bip39, закреплённую в обоих на одной версии. Дефект в самой этой библиотеке затронул бы оба ключа. Независимость, которую даёт SSP, реальна, но конкретна: два отдельных сида, порождённых в разное время на разных устройствах, черпающих энтропию из разных системных источников — Web Crypto браузера с одной стороны, CSPRNG мобильной платформы с другой. Это не независимость двух совершенно несвязанных кодовых баз.
Что это покупает — защиту от того режима отказа, который в Coldcard действительно произошёл: специфичной для устройства ошибки реализации в том, как один продукт порождал свои сиды. От дефекта в общем криптографическом примитиве под обоими это не защитит.
Это заметно более слабое утверждение, чем «с нами такого случиться не может», и оно истинное. Тот, кто говорит вам, что его кошелёк категорически невосприимчив к отказу энтропии, рассказывает о своём маркетинге, а не об архитектуре.
Что отсюда взять
Если у вас Coldcard из этого окна прошивок, единственное безопасное допущение — что сид скомпрометирован, двигались средства или нет. Породите новый на исправленной прошивке и переезжайте. Устройство, которое ещё не опустошили, — не безопасное устройство.
Если вы пользуетесь любым однокейным кошельком, это риск, который вы несёте, и его стоит осознавать, а не тревожиться о нём. Аппаратные кошельки остаются несравнимо лучше альтернатив для большинства людей. Урок не в том, что они плохи; урок в том, что один ключ — это одна точка отказа, и каждая часть истории этого ключа, включая момент его рождения годы назад в прошивке, которую вы не читали, входит в вашу модель угроз.
И в целом предпочитайте архитектуры, где одной поломки недостаточно. Этот принцип — причина, по которой SSP требует двух устройств, по которой некоторые операции требуют повторной подписи, даже когда вы уже аутентифицированы, и по которой что на самом деле останавливает транзакцию — вопрос, который стоит задать любому кошельку, которому вы доверяете. Ответ никогда не должен звучать как «один секрет и надежда, что он был порождён как следует».
Более широкое сравнение вариантов и того, от чего каждый действительно защищает, разбирает сравнение вариантов самостоятельного хранения.


