Эксплойт Coldcard: детерминированный ГПСЧ опустошил $88 млн в BTC

1 августа 2026 года около 1196 биткоин-адресов были опустошены в ходе скоординированной операции. Никакого фишинга. Никаких подписанных вредоносных PSBT. Никаких ошибок пользователя в традиционном смысле. Эксплойт Coldcard, слившший примерно $88 миллионов в BTC, так и не коснулся ни одного устройства в момент кражи, по данным репортажа CoinDesk об этом инциденте.
Первопричина хуже, чем любые интерпретации, которые я видел в первые 24 часа. Это была уязвимость прошивки аппаратного кошелька, выпущенная в 2021 году, которая незаметно заменила аппаратный генератор истинных случайных чисел программной псевдослучайной процедурой. Каждый сид, сгенерированный в рамках этой сборки, был детерминированным. Каждый адрес, производный от этих сидов, был в принципе заранее вычислим любым, кто произвёл бы обратный анализ ошибки.
Это не взлом. Это пятилетний разрыв между коммитом и последствием.
Что на самом деле делал баг в прошивке Coinkite
Дефектная сборка, как подробно описывает The Hacker News, направляла вызовы энтропии через программный ГПСЧ, засеянный из небольшого, легко угадываемого состояния, вместо аппаратного ГСЧ SE-чипа. Пользователи не имели возможности обнаружить подмену. Устройство загружалось, отображало ожидаемые экраны настройки, генерировало 24-словный сид и выглядело идентично корректно сгенерированному кошельку.
Производимые им сиды существовали в пространстве перебора объёмом, пожалуй, в несколько миллиардов вариантов. Это не кошелёк. Это лотерейный билет.
Когда злоумышленник (или, скорее всего, исследователь, обнаруживший уязвимость и не выполнивший ответственное раскрытие) начал перебирать это пространство по набору UTXO 1 августа, слив занял часы, а не месяцы.
Почему важна цифра в 1196 опустошённых биткоин-адресов
1 196 — это малое число в абсолютном выражении и огромное в информационном. Оно определяет границы популяции пользователей, которые сгенерировали сид именно в том окне прошивки и так и не выполнили ротацию. Это проверяемое, опровергаемое утверждение о масштабе ущерба, и разбор TechSpot подтверждает: затронутые устройства восходят к узкому периоду поставок.
Если вы сгенерировали сид на другой прошивке или выполнили ротацию после обновления, скорее всего, всё в порядке. Если же вы сгенерировали на той самой сборке и ничего не трогали, ваши средства уже были потрачены, вы просто ещё не знали об этом.
Незаметная деталь: часть опустошённых UTXO пролежала нетронутой с 2021 года. Пять лет принципа «мои ключи, мои монеты» -- а ключи на самом деле никогда не были вашими.
Проблема детерминированного ГПСЧ в биткоине стара и повторяется снова и снова
Этот класс ошибок имеет долгую и позорную историю. Android SecureRandom в 2013 году уже уносил BTC точно таким же образом. Баг ГПСЧ в Debian OpenSSL в 2008 году калечил SSH-ключи два года, прежде чем кто-то это заметил. Каждое поколение заново узнаёт, что энтропия -- это единственное, что нельзя проверить, глядя на выходные данные.
Нормально сформированное случайное 256-битное число и детерминированное 256-битное число при осмотре выглядят одинаково. Нужно проверять источник, а не выборку. В этом и состоит вся игра.
Аппаратные кошельки продают идею о том, что защищённый элемент берёт это на себя. Когда прошивка обходит SE, вы получаете всё неудобство холодного хранения без каких-либо гарантий. Худшее из обоих миров.
Дискуссия о самостоятельном хранении и ETF -- не то, чем кажется
Моё мнение, и я готов его отстаивать: разговор о самостоятельном хранении против ETF был представлен как вопрос идеологии, хотя на самом деле это вопрос цепочки поставок.
Спотовый ETF на BTC имеет одну поверхность атаки, которая меня беспокоит: операционная безопасность кастодиана. Эта поверхность поддаётся аудиту со стороны регуляторов, страхуется и обслуживается людьми, чья единственная работа — не потерять монеты. Если что-то идёт не так, кто-то выписывает чек.
Самостоятельное хранение предполагает более длинную цепочку: производитель чипов, конвейер сборки прошивки, подписание релизов, цепочка поставок, операционная безопасность конечного пользователя, резервные копии. Достаточно одного слабого звена — и никакого чека не будет. Взлом Coldcard для этого тезиса — то же самое, что Terra для своего: не потому, что самостоятельное хранение умерло, а потому, что максималистский нарратив «просто держи свои ключи сам» обязан повзрослеть.
Обе модели несут реальные риски. Делать вид, что одна из них безопасна, — вот что привело к опустошению 1 196 адресов.
Что реально изменится после эксплойта Coldcard
Несколько вещей, которые, на мой взгляд, произойдут и должны произойти:
- Воспроизводимые сборки прошивки станут обязательным минимумом. Если вы не можете пересобрать бинарник из исходников и сверить его побайтово, вы доверяете подписи, а не кодовой базе.
- Аттестация энтропии после генерации. Устройство должно подписывать доказательство того, что конкретный сид был получен из защищённого элемента, а не из программного обеспечения. Это не сложно. Coinkite может выпустить это за квартал.
- Независимые проверки корректности сида. Инструменты сторонних разработчиков, которые — не видя самого сида — могут проверить, что его путь деривации соответствует распределению, характерному для настоящей случайности.
- Страховые продукты для самостоятельного хранения. Не пародия. Настоящий андеррайтинг, требующий аттестованной прошивки и обновляющий покрытие по мере устаревания сборок.
Всё это не делает аппаратные кошельки устаревшими. Это переводит их в корпоративный класс — именно тот, на который они всегда претендовали.
Неудобный вывод для всех нас
В LCX мы тратим непропорционально много инженерного времени на вещи, которые пользователям невидимы: ключевые церемонии на HSM, детерминированные конвейеры сборки, аудит энтропии на любом участке кода, который касается приватного ключа. Это скучная работа. Она же и есть разница между заголовком в новостях и обычным вторником.
Инцидент с Coldcard воспринимается так же, как комментарии генерального директора OpenZeppelin об аудитах DeFi в начале этого года. Инструментарий аудита, который мы унаследовали, создавался для мира, где код, который вы выпускали, был тем же кодом, который вы запускали. Это больше не так, если вообще когда-либо было.
Холодное хранение должно было быть скучным, правильным ответом. Оказывается, скучному нужно куда больше подпорок, чем мы готовы были признать.