Инцидент COLDCARD RNG: как слабая энтропия проявилась в блокчейне
Отчёт для разработчиков, который связывает публичную причину в прошивке с проверяемыми ончейн-данными, не публикуя инструменты восстановления seed, адреса пострадавших или секретные материалы.

Краткий ответ
Причина связана с веткой прошивки, где аппаратный RNG был задан как отключённый, но условие препроцессора всё равно выбирало детерминированный резервный генератор. В более новых устройствах добавлялся аппаратный материал, однако в reseed поступало только 32-битное производное значение. Обновление исправляет будущую генерацию, но не усиливает ранее созданные seed.
публичных кластера первой волны
связанных исходных входов первой волны
связанных входов последующих наблюдений
первичных технических источника
Технический метод по шагам
Описание достаточно подробно для аудита класса ошибки разработчиками прошивок и кошельков, но останавливается до операционного восстановления ключей.

Конфигурация обозначала «отключено»
В конфигурации платы функция RNG определялась значением 0. По смыслу это отключение, но для препроцессора символ всё равно остаётся определённым.
Проверялось наличие символа, а не его значение
Условная компиляция выбирала резервную ветку. Связанный rng_get разрешался в детерминированный программный генератор вместо аппаратного источника энтропии.
Резервный генератор инициализировался наблюдаемым состоянием
В начальное состояние смешивались идентификаторы и таймеры. Они меняются, но не являются независимой криптографической энтропией и могут ограничиваться поведением устройства и порядком вызовов.
Хеширование не создаёт отсутствующую энтропию
Хеши и контрольная сумма BIP-39 распределяют уже имеющуюся неопределённость, но не создают новую энтропию, которой не было во внутреннем состоянии.
На новых устройствах reseed был усечён
Аппаратные чтения хешировались, но только четыре байта дайджеста распаковывались в значение reseed. Прямой вклад ограничивался 32 битами с учётом более широкого контекста выполнения.
Публичный адрес становится проверочным оракулом
Если возможные состояния можно перебрать, из них выводятся публичные ключи или адреса и сравниваются с блокчейном. Это модель риска, а не сквозной бенчмарк и не утверждение об одинаковой восстанавливаемости всех seed.
Несоответствие потока управления в четырёх безопасных фрагментах
Фрагменты объясняют причину, но не содержат цикл восстановления кошелька.
#define MICROPY_HW_ENABLE_RNG (0)#ifndef MICROPY_HW_ENABLE_RNGpad = UID_low32 ^ SysTick->VALreseed = SHA256d(rng1 || rng2)[0:4]
Затронутые прошивки и граница исправления
Матрица следует публичному уведомлению Coinkite. Перед действиями нужно проверить актуальные инструкции производителя: каналы релизов могут измениться.
| Семейство | Затронутый диапазон | Исправленный релиз | Что означает исправление |
|---|---|---|---|
| Mk2 / Mk3 | 4.0.1–4.1.9 | 4.2.0 и новее | Новые seed создаются исправленным путём; старые не усиливаются. |
| Mk4 / Mk5 | Стандартные релизы до 5.6.0 | 5.6.0 и новее | Исправленный релиз предотвращает будущую генерацию по проблемному пути. |
| COLDCARD Q | Стандартные релизы до 1.5.0Q | 1.5.0Q и новее | Сначала обновление, затем новый seed и миграция. |
| Канал Edge | До 6.6.0X / 6.6.0QX | 6.6.0X / 6.6.0QX и новее | Используйте исправленный релиз канала для своего устройства. |
Обновление не добавляет энтропию в уже существующий seed. Защитный путь — новый seed на исправленном ПО, проверка резервной копии и миграция.
Что показывает публичный блокчейн
Мы воспроизвели ограниченный снимок по опубликованным меткам консолидаторов и публичным API адресов и транзакций Blockstream. Таблица показывает поток, но не доказывает личность оператора и не является окончательным числом жертв или потерь.

Связанный объём исходных входов первой волны
1 082,58680432 BTC
Воспроизводимый снимок графа; публичные метки не являются атрибуцией личности.
Связанный объём исходных входов последующей волны
76,09142381 BTC
Воспроизводимый снимок графа; публичные метки не являются атрибуцией личности.
Публично указанные адреса-консолидаторы
| Волна | Первое наблюдение | Адрес | Получено на дату снимка | Транзакций адреса |
|---|---|---|---|---|
| Волна 1 | 2026-07-30 | bc1qnk4zh9qcnap2mycp56qjrgza3cc8ylrh8fecp0 | 594.47727254 BTC | 506 |
| Волна 1 | 2026-07-30 | bc1qc779m8gec84k3t0ffvu0pps94zheht7lr7ueyn | 398.48587857 BTC | 492 |
| Волна 1 | 2026-07-30 | bc1qdaarag7729c2n4l2wnyt3hkhfpcs66n98z7uuh | 88.85045709 BTC | 101 |
| Волна 1 | 2026-07-30 | bc1qh0l7q0mca3ln7wsl9luwns0jc9jhgrtft025l4 | 0.77324382 BTC | 105 |
| Волна 2 | 2026-07-31 | bc1qsjrf5ze5tmulz7y2x4pc7qaex2a35sanp3rqlx | 45.90666052 BTC | 1217 |
| Волна 2 | 2026-08-07 | bc1qmd5m5ktv7m5ffujxv4248fxv36myvdx79n8jp6 | 30.18478329 BTC | 96 |
«Получено» — статистика адреса на 12 августа 2026 года. Нельзя складывать её с последующими выходами консолидации или называть сумму подтверждённым ущербом.
Репрезентативные транзакции консолидации
| Время | Входы | Единственный выход | Транзакция |
|---|---|---|---|
| 2026-07-30 01:43 UTC | 491 | 398.47573857 BTC | 14edd9ee8445… |
| 2026-07-30 01:43 UTC | 204 | 89.62327890 BTC | 4b50d61a3d6e… |
| 2026-07-30 01:51 UTC | 341 | 562.01962301 BTC | 0c6bf853a645… |
| 2026-07-31 09:22 UTC | 1212 | 45.90251994 BTC | ba119968ec4b… |
| 2026-08-07 03:35 UTC | 93 | 30.18461329 BTC | 93df0d26e08c… |
Воспроизводимая ончейн-методика
- 01Начинать только с меток консолидаторов, уже опубликованных в материалах об инциденте; не включать публично адреса, сообщённые пострадавшими.
- 02Запрашивать публичные API адресов и транзакций, сохраняя txid, время подтверждения, число входов, значения выходов и дату проверки.
- 03Пересчитывать BTC из целых сатоши, а не из скриншотов или оценок в долларах.
- 04Удалять дубликаты по txid и классифицировать исходные, первые и вторые этапы до агрегации.
- 05Не складывать выход консолидации с входами, которые его профинансировали: это один поток на разных этапах.
- 06Считать метки графа наблюдаемыми связями. Путь в блокчейне не доказывает владельца, намерение, модель устройства или юридическую ответственность.
Защитное воспроизведение без реальных кошельков
Отдельный локальный стенд использовал 1 000 детерминированных синтетических кошельков для проверки контрольной суммы BIP-39, повторной деривации ожидаемых адресов и уникальности тест-векторов. Все 1 000 векторов были повторно выведены, а пять ограниченных smoke-тестов восстановления прошли. Реальных данных кошельков нет; набор не публикуется, потому что цель — инженерная проверка, а не операционное восстановление.
Существенные ограничения
- Ни официальный источник, ни этот отчёт не заявляют универсальное время полного перебора.
- 32-битный reseed не означает автоматически ровно 32 бита полной безопасности seed: история вызовов и состояние fallback также важны.
- Консолидаторы могут получать посторонние или более поздние средства, поэтому текущие суммы адресов не являются фиксированным реестром потерь.
- Публичный граф не устанавливает личность и не доказывает, что каждый исходный вход связан с одним дефектом прошивки.
- FRB Agent не является аппаратным Bitcoin-кошельком; отчёт не утверждает, что FRB предотвращает этот класс инцидентов.
Защитные действия для потенциально затронутых владельцев
Прочитать актуальное уведомление Coinkite и подтвердить модель устройства и канал прошивки.
Обновиться до исправленного релиза до создания нового материала.
Создать новый seed исправленным способом; при ручной энтропии следовать инструкции производителя по броскам кубика.
После проверки новой резервной копии перенести активы из всех кошельков затронутого seed, включая варианты с passphrase.
Не публиковать seed-слова, xprv, приватные ключи или предполагаемые адреса жертв в поддержке и публичных проверках.
Почему это важно разработчикам систем исполнения
Инцидент показывает: «локальный» и «некастодиальный» — архитектурные границы, а не автоматическое доказательство безопасности. Энтропия, прошивка подписанта, жизненный цикл ключей, происхождение обновлений, симуляция и проверка оператором остаются отдельными контролями. Страницы безопасности FRB описывают собственную границу локальной подписи, но не заменяют аудит прошивки кошелька.
Первичные источники и проверяемые данные
Источники проверены 12 августа 2026 года. Состояние в обозревателе меняется при новых поступлениях и расходах.
Частые вопросы
Исправляет ли обновление старый seed?
Нет. Обновление корректирует будущую генерацию. Seed, созданный затронутым путём, нужно заменить и перенести средства на адреса из нового материала.
Это удалённый взлом устройства?
Документированная слабость находится в генерации seed. Публичная модель атаки использует ограниченные состояния-кандидаты и блокчейн как проверочный оракул; последующий удалённый контроль устройства не требуется.
Означает ли 32-битный reseed мгновенное восстановление любого seed?
Нет. Он ограничивает один вклад, но практическая реализуемость зависит от fallback-состояния, порядка вызовов, наблюдений, целей деривации и деталей реализации. Универсальной оценки времени здесь нет.
Почему опубликованы консолидаторы, но не адреса пострадавших?
Консолидаторы уже являются публичными метками инцидента и позволяют независимо проверить потоки. Адреса пострадавших создают риск приватности и не нужны для технического объяснения.
Почему нет кода восстановления?
Цель — помочь разработчикам проверить энтропию, а владельцам безопасно мигрировать. Исполняемый конвейер восстановления увеличил бы риск злоупотребления, не улучшая доказательство причины.