Апокалипсис холодного кошелька: баг в прошивке Coldcard обрушил энтропию сидов до 40 бит и привёл к краже $75 млн
Кошелёк Coldcard Mk3, созданный компанией Coinkite, считался одним из самых безопасных аппаратных хранилищ биткоина. Одно изменение в коде от 1 марта 2021 года перевело генератор сид-фраз с аппаратного на программный — и эффективное пространство поиска рухнуло с 128 до 40 бит.
«Разница между 128 битами энтропии и 40 — это не вопрос степени. Это разница между замком, который невозможно вскрыть, и замком, который можно подобрать перебором с арендованных облачных серверов.»
Аппаратные крипто-кошельки считаются золотым стандартом хранения биткоина. Ключи никогда не покидают устройство, оно не подключается к интернету, и для кражи средств злоумышленнику теоретически нужно физически завладеть девайсом. Именно на этом строился весь маркетинг Coldcard от канадской компании Coinkite — кошелька, позиционировавшего себя как максимально параноидальный вариант для хранения BTC.
Ирония в том, что всё это время злоумышленнику не нужно было даже приближаться к устройству. Достаточно было знать, что сид-фраза, сгенерированная на уязвимой прошивке, получена из пространства в ~1 триллион вариантов вместо 2¹²⁸.
Что именно сломалось
1 марта 2021 года в коде прошивки Coldcard произошло одно изменение. Как установила инженерная команда Block (да, та самая, что стоит за Square и Cash App), этот коммит привёл к тому, что устройство на модели Mk3 молча переключилось с аппаратного генератора случайных чисел (hardware RNG) на программный (software RNG).
Разница критическая. Аппаратный генератор использует физические процессы — электронный шум, джиттер тактовой частоты, тепловые флуктуации — для получения по-настоящему непредсказуемых битов. Программный же генератор, если у него нет достаточного источника энтропии, выдаёт воспроизводимые последовательности.
На практике это означало следующее:
- Заявленная энтропия сид-фразы — 128 бит. Это пространство из ~3.4 × 10³⁸ вариантов, перебор которого невозможен при существующих вычислительных мощностях.
- Реальная энтропия на устройствах Mk3 — около 40 бит. Пространство в ~10¹² комбинаций, что вполне достижимо для атаки методом полного перебора (brute-force) с использованием облачных вычислительных ресурсов.
Coinkite подтвердила цифру в 40 бит, назвав её «предварительной».
Важный нюанс: кошельки Coldcard использовали одноразовую подпись (single-signature), то есть для доступа к средствам достаточно восстановить единственную сид-фразу. Мультисигнатурные конфигурации, где для транзакции требуется несколько ключей, не были затронуты в той же мере.
Хронология атаки
Масштаб эксплуатации уязвимости впечатляет по скорости и циничной эффективности.
Компания Chainalysis, специализирующаяся на блокчейн-аналитике, зафиксировала, что атакующий начал с кошельков с наибольшими балансами. В первые десять минут было выведено более $30 млн. В течение примерно 25 минут около 594 BTC переместилось из приблизительно 500 одноразовых кошельков.
К утру субботы, по данным Galaxy Research, общая сумма составила 1158.66 BTC — примерно $75,1 млн с 2673 адресов. Причём на момент публикации оригинальной новости атака всё ещё продолжалась.
Galaxy Research обратилась к федеральному следователям, комплаенс-компаниям и межотраслевым группам киберрасследований, передав информацию примерно о 600 адресах, предположительно принадлежащих хакеру.
Почему обнаружили так поздно
Пять лет — именно столько времени уязвимость оставалась незамеченной. Это один из самых неудобных вопросов для всей индустрии аппаратных кошельков.
Есть несколько объяснений, ни одно из которых не выглядит убедительно на 100%:
Отсутствие детерминизма при тестировании. Программный генератор случайных чисел, в отличие от аппаратного, может давать разные результаты в разных условиях запуска. В тестовой среде при дебаге поведение может отличаться от реального. Если разработчики не проводили специализированный аудит энтропии — а судя по всему, не проводили — проблема могла быть невидима при обычном юнит-тестировании.
Тихий фоллбэк. Переключение на программный генератор произошло без какого-либо предупреждения или логирования. Пользователь не получал уведомления о том, что устройство генерирует сид с пониженной энтропией. Это серьёзный архитектурный просчёт: система безопасности, которая молча откатывается к менее безопасному варианту — это по сути бэкдор, даже если он не был запланированным.
Отсутствие независимого аудита. Аппаратные кошельки — это не HSM (Hardware Security Module) уровня enterprise. Как отмечают эксперты в комментариях к оригинальной новости, HSM создаются компаниями с многолетним опытом и проходят масштабную оценку специалистами. Аппаратные крипто-кошельки нередко строятся на базе микроконтроллеров общего назначения (например, STM32) с включёнными битами безопасности. Это не делает их плохими, но уровень экспертизы и бюджеты на проверку, мягко говоря, сопоставимы.
Что делать пользователям
Coinkite выпустила исправленную прошивку. Но вот в чём проблема: обновление прошивки не восстанавливает уже сгенерированные сид-фразы.
Если сид был создан на уязвимой версии прошивки, он остаётся слабым навсегда. Сами разработчики Coldcard честно предупреждают об этом.
Алгоритм действий для владельцев Coldcard Mk3, использовавших одноразовую подпись:
- Немедленно перевести все средства на новый адрес, сгенерированный на обновлённой прошивке (или на кошельке другого производителя).
- Не пытаться «пересоздать» старый сид — он скомпрометирован.
- Проверить, не был ли кошелька создан с использованием мультисиг-конфигурации. Если да — риск ниже, но полной гарантии нет.
Кто виноват и что дальше
На данный момент нет доказательств, что баг был намеренно заложен. Но масштаб последствий и длительность эксплуатации поднимают ряд вопросов.
Во-первых, почему один коммит мог молча переключить критически важный компонент — генератор энтропии — без каких-либо проверок или защитных механизмов? В нормальной инженерной практике fallback-сценарии для генераторов случайных чисел должны быть явными, логируемыми и, желательно, фатальными (т.е. устройство должно отказаться работать, а не откатиться к худшему варианту).
Во-вторых, инцидент ставит под вопрос саму концепцию «холодного хранения» как абсолютной гарантии безопасности. Холодный кошелёк защищает от сетевых атак, но не от дефектов в прошивке. Если ваш сид можно перебрать за разумное время, наличие или отсутствие интернет-подключения становится несущественным.
В-третьих, $75 млн — это сумма, которую удалось отследить. Реальный ущерб может быть выше, если часть средств была перемещена через миксеры или другие инструменты обфускации.
Инцидент с Coldcard — напоминание о том, что в криптоиндустрии доверие к железу и коду не должно быть слепым. Пять лет молчащего бага в устройстве, продающемся под лозунгом максимальной безопасности — это провал не только одной компании, но и всей экосистемы проверки безопасности аппаратных кошельков.