Большинство людей не осознают, что изолированный от интернета (air-gapped) Bitcoin-кошелек может годами хранить приватный ключ в офлайне и при этом оставаться уязвимым с момента создания его сида.
Недавно раскрытая ошибка генератора случайных чисел Coldcard наглядно демонстрирует эту ловушку. Затронутый кошелек мог выдать вам совершенно обычную фразу для восстановления из 12 или 24 слов, после чего вы могли запереть ее в сейфе и подписывать транзакции офлайн. Однако под капотом генератор работал с гораздо меньшей колодой. Злоумышленник мог перебрать эту колоду на другой машине и восстановить вероятные сиды. Публичный реестр Bitcoin показал бы, какие догадки совпали с реальными адресами.
Для меня судьба кошелька решается в момент его создания. Прежде чем PIN-код, стальной резервный носитель, защищенная от вскрытия упаковка или воздушный зазор смогут помочь, сид должен быть основан на настоящей случайности.
Качественный современный генератор случайных чисел способен обеспечить достаточную энтропию. Однако если недобросовестный участник знает процесс, с помощью которого был создан ГСЧ, существует возможность обратной разработки этого процесса.
Физический бросок игральной кости дает владельцу источник случайности, который можно увидеть, контролировать и хранить отдельно от кода производителя.
Сид был слабым еще до того, как кошелек ушел в офлайн
В первом отчете CryptoSlate об ошибке Coldcard объяснялся недавний путь атаки. Кандидаты в сиды могут быть сгенерированы вне устройства, преобразованы в публичные адреса и проверены на активность в публичном реестре Bitcoin.
Техническая причина была почти до боли незначительной. Изменение кода от 1 марта 2021 года перенесло генерацию сида Coldcard в новую библиотеку. В производственной прошивке параметр MICROPY_HW_ENABLE_RNG был определен как ноль, то есть отключен, в то время как интеграция проверяла только наличие параметра. Его наличие направляло генерацию на детерминированный резервный алгоритм Yasmarang MicroPython вместо предназначенного аппаратного генератора случайных чисел. Затронутый путь был включен в прошивку версии 4.0.0 17 марта, согласно совместному анализу Block.
Внешне обычный вывод кошелька скрывал резко сокращенное пространство поиска. Предварительная оценка Coinkite определяет эффективное пространство поиска для затронутых сиодов Mk2 и Mk3 примерно в 40 бит, а для затронутых сидов Mk4, Mk5 и Q — примерно в 72 бита.
Block выявила отдельное ограничение для более поздних устройств: не более 2^32 надежно различимых потоков, когда состояние резервного механизма и история вызовов были фиксированы. Данные Coinkite показывают оценку эффективного пространства, которое может искать злоумышленник.
Оба анализа помещают более поздние устройства до выхода исправления в зону поражения. В уведомлении о безопасности Coinkite перечислены прошивки Mk4 и Mk5 до стандартной версии 5.6.0 или Edge 6.6.0X, а также прошивки Q до стандартной версии 1.5.0Q или Edge 6.6.0QX. Для Mk2 и Mk3 Coinkite указывает версии с 4.0.1 по 4.1.9, в то время как Block утверждает, что проблема началась в версии 4.0.0. Я бы относился к этой спорной границе консервативно.
Обновление до исправленного релиза защищает будущую генерацию сидов. Однако все существующие сиды сохраняют энтропию, полученную при рождении, и каждый адрес, производный от него, использует тот же корневой секрет.
Любой, кто использовал затронутую версию, должен изучить уведомление и создать совершенно новый сид с помощью исправленного программного обеспечения и надежного источника энтропии, если не может быть установлено исключение для использования личных игральных костей. Затем средства необходимо перевести на новый кошелек. Новый адрес от старой мнемонической фразы сохраняет уязвимость.
Bitcoin Optech сообщил о растущей оценке, превышающей 1000 BTC, по состоянию на 31 июля. По состоянию на 2 августа Galaxy Research оценивал подозрительную сумму в 1367 BTC на 4585 адресах. Пользователь X, публикующийся под ником Graham_Quantum, также сообщил, что 18,25245043 BTC покинули кошельки 29 июля.
Косвенный эффект также привел к гораздо большей цифре из-за защитных перемещений. Во втором отчете CryptoSlate о Coldcard было обнаружено, что 77 402 BTC были перемещены из старых диапазонов UTXO после раскрытия информации.
Общая сумма охватывает валовое перемещение старых монет, включая превентивную миграцию. Она измеряет волну самостоятельного спасения, в то время как меньшая цифра Galaxy является evolving оценкой предполагаемых потерь.
| Показатель | Классификация | Охват | Важное ограничение |
|---|---|---|---|
| 1367,05 BTC | Предполагаемые потери | Оценка Galaxy Research от 2 августа по 4585 адресам | Развивающаяся, атрибутированная оценка без окончательного итога инцидента |
| 77 402 BTC | Превентивное перемещение | Валовое перемещение из старых диапазонов UTXO после раскрытия информации | Включает защитную миграцию и отдельно от сумм краж или продаж |
Отказ безопасности вызвал два шока одновременно: кражу и гораздо более крупную волну рациональной миграции.
Что меняют личные игральные кости
Документация Coldcard по игральным костям рассчитывает примерно 2,585 бита энтропии на каждый независимый бросок честного шестигранного кубика. Пятьдесят бросков обеспечивают около 129,25 бит сырой энтропии бросков, что традиционно соответствует 128-битной безопасности. Девяносто девять бросков дают около 255,91 бит, что примерно соответствует цели для 256-битной безопасности, до применения документированной процедуры преобразования кошелька.
Эти цифры согласуются со стандартом BIP-39, широко используемым мнемоническим стандартом. Фраза из 12 слов кодирует 128 бит энтропии плюс 4-битную контрольную сумму. Фраза из 24 слов кодирует 256 бит плюс 8-битную контрольную сумму.

Контрольная сумма ловит опечатки. Случайность исходит из лежащего в основе материала. Хеширование и аккуратное форматирование могут замаскировать слабый ввод, в то время как пул возможных секретов остается таким же маленьким. Эти двенадцать обнадеживающих слов могли быть взяты из очень мелкого колодца.
Физические броски помогают только тогда, когда документированная процедура кошелька правильно их включает. Кость должна подходить для задачи, каждый бросок должен быть подлинным и независимым, а последовательность должна оставаться приватной. Повторно используемые шаблоны, фотографии, заметки в облаке и ввод на обычном подключенном к сети компьютере могут подорвать независимость или секретность бросков.
В связи с этим инцидентом с Coldcard, Coinkite заявляет, что миграция может быть необязательной только в том случае, если пользователь может установить, что окончательный сид включал как минимум 50 честных, независимых и приватных бросков игральных костей. В случае неопределенности рекомендуется миграция.
Для меня игральные кости важны, потому что случайность, генерируемая устройством, требует от владельца доверять аппаратному обеспечению, прошивке, процессу сборки и интеграционному коду как единой цепочке.
Документированный процесс ввода с помощью костей добавляет энтропию, контролируемую владельцем, извне этой цепочки. Примерно 50 честных бросков нацелены на 128 бит, а 99 — примерно на 256 бит, но пользователи должны следовать точной процедуре устройства, а не импровизировать с преобразованием.
Надежные, уникальные BIP-39 passphrase также могут изменить атаку другим способом. Они добавляют независимый секрет, который злоумышленник должен обнаружить после нахождения мнемонической фразы. Исходная энтропия мнемоники остается неизменной. Каждый passphrase, включая опечатку, создает на вид валидный кошелек, поэтому потеря точного passphrase может заблокировать целевые средства. PIN-код устройства служит другой цели.
Passphrase создает настоящий компромисс. Он может стать мощным вторым барьером, если владелец способен воспроизвести и защитить его. Плохое резервное копирование превращает ту же функцию в способ заблокировать самого себя.
Слабая случайность возвращается снова и снова
Инцидент с Coldcard — это текущая история, но тот же коренной отказ проявлялся в совершенно разных кошельках.
В 2023 году Ledger Donjon раскрыла, что определенные версии браузерного расширения Trust Wallet использовали путь WebAssembly, основанный на 32-битном значении в генераторе Mersenne Twister. Внешне нормальные мнемонические фразы происходили примерно из четырех миллиардов возможных начальных значений. Затронутый диапазон был конкретным: версии браузерного расширения с 0.0.172 по 0.0.182, использующие Trust Wallet Core до версии 3.1.1. Национальная база данных уязвимостей фиксирует эксплуатацию в декабре 2022 года и марте 2023 года.
В раскрытии Milk Sad была показана более интуитивная версия той же опасности в Libbitcoin Explorer 3.x. Его команда bx seed использовала 32-битный Mersenne Twister, основанный на времени, и могла генерировать одну и ту же мнемоническую фразу при одинаковых временных условиях. Знание приблизительного времени создания давало злоумышленнику гораздо меньший диапазон для поиска, чем предполагали слова восстановления.
Исследователи обнаружили более 2600 активно используемых Bitcoin-кошельков в затронутых диапазонах и оценили связанные кражи на сумму более 900 000 долларов по нескольким цепочкам в ценах августа 2023 года. Более 2550 из этих кошельков демонстрировали автоматизированный шаблон и, возможно, принадлежали одному владельцу, а исследователи отметили, что некоторые выводы средств могли быть связаны с другими уязвимостями.
Ошибка проявлялась каждый раз в другой маскировке. Coldcard проскочил в резервный механизм прошивки. В других случаях слабая случайность пробиралась через браузерное расширение и инструмент командной строки, который доверял системным часам. Полученные секреты кошельков выглядели надежными на поверхности, хотя их реальный пул возможностей был опасно мал.
Советы по хранению Bitcoin часто начинаются после того, как сид уже существует: хранить его офлайн, использовать надежные резервные копии, разделять обязанности и тестировать восстановление. Все это по-прежнему важно. Ошибка Coldcard напоминает нам, что нужно отодвинуть стартовую линию на один шаг назад.
Воздушный зазор защищает тот секрет, который вы ему передаете. Случайность должна быть на первом месте.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Liam 'Akiba' Wright




