Аппаратный кошелёк, которым годами пользовались для «холодного» хранения биткоинов, оказался ненадёжным укрытием. За пять дней с предположительно уязвимых адресов вывели, по более поздней оценке, до 1816 биткоинов примерно на 114 миллионов долларов. Скрытая ошибка в прошивке снизила случайность при создании ключей, поэтому злоумышленники смогли подбирать их удалённо, не получая доступа к самим устройствам

30 июля компания Coinkite, выпускающая кошельки Coldcard, опубликовала предупреждение и призвала владельцев срочно перевести средства на новые адреса. Первоначально компания сообщила о риске для моделей Mk2 и Mk3 с прошивками от 4.0.1 до 4.1.9, а затем расширила список на Mk4, Mk5 и Q с более ранними версиями программного обеспечения.

Причина связана с тем, как формировались сид-фразы — наборы слов, из которых восстанавливаются приватные ключи кошелька. Начиная с версии прошивки 4.0.1, выпущенной в марте 2021 года, генерацию ключей перевели на библиотеку libNgU. Из-за ошибки вызов генератора случайных чисел попадал в программный механизм MicroPython вместо аппаратного генератора, который должен был обеспечивать нужный уровень случайности.

По оценке Coinkite, фактическая энтропия сид-фраз составляла около 40 бит на Mk2 и Mk3 и около 72 бит на Mk4, Mk5 и Q вместо предусмотренных стандартом BIP-39 128 бит. Такое сокращение пространства вариантов существенно упрощает перебор ключей. Особенно уязвимыми оказались кошельки с одной подписью, созданные без как минимум 50 независимых бросков игральной кости и без сильной уникальной парольной фразы BIP-39.

К 3 августа аналитики Galaxy Research выделили четыре волны вывода средств. В первой волне, начавшейся примерно за сутки до публичного предупреждения Coinkite, злоумышленники за 41 минуту вывели 1082,65 биткоина примерно на 70 миллионов долларов с 1196 адресов. Через 27 часов последовала вторая волна: за 3 часа 42 минуты с 1478 адресов ушли ещё 76,16 биткоина. С 31 июля по 1 августа атакующий вывел 207,73 биткоина с 1912 адресов, а 3 августа — ещё 388,9 биткоина с 462 адресов.

Четыре перечисленные волны в сумме дают 1755,44 биткоина. Более поздняя общая оценка выросла до 1816 биткоинов примерно на 114 миллионов долларов, однако дополнительные 60,56 биткоина в приведённой разбивке не отнесены к конкретной волне. Характер второй серии транзакций указывает, что атакующий мог вернуться за кошельками с небольшими остатками после предварительной сортировки адресов по размеру баланса.

Galaxy Research подчёркивает, что расчёты основаны на сходных ончейн-паттернах. Аналитики пока не подтвердили, что каждый попавший в выборку адрес создали с недостаточной энтропией. Выведенные биткоины на момент последней оценки также не перемещались дальше, поэтому окончательный масштаб и принадлежность всех транзакций ещё предстоит установить.

Coinkite не подтвердила напрямую, что четыре волны вывода средств связаны именно с ошибкой генерации сид-фраз, но признала саму уязвимость. Несколько серий транзакций после первой атаки показывают, что вывод биткоинов продолжался и после публикации предупреждения.

Исправленные прошивки устраняют ошибку только при создании новых ключей. Обновление устройства не увеличивает энтропию уже существующей сид-фразы и не делает старые адреса безопасными. Пользователь также не может задним числом проверить, насколько случайным получился ключ при первоначальной настройке кошелька, хотя от качества этого единственного этапа зависит вся последующая защита средств.

Владельцам Coldcard советуют установить исправленную прошивку, создать совершенно новую сид-фразу и перевести средства на связанный с ней адрес. Сначала Coinkite рекомендует отправить небольшую тестовую транзакцию и только после проверки перемещать оставшийся баланс.

Владельцы, использовавшие не менее 50 независимых и конфиденциальных бросков игральной кости, не считаются уязвимыми только из-за этой ошибки. Сильная уникальная парольная фраза BIP-39 снижает непосредственный риск, но не исправляет слабую сид-фразу, поэтому таким пользователям также рекомендуют сменить ключи.

https://www.securitylab.ru/news/5