Полный отчет об инциденте · 16 источников · Anzen Lab

Четыре строки кода.
Более 1596 BTC украдено.

В марте 2021 года одна из сборок прошивки COLDCARD перестала запрашивать случайные числа у аппаратного чипа и вместо этого поручила их генерацию обычному программному обеспечению. Никто не замечал этого пять лет. В июле 2026 года злоумышленники произвели расчеты и начали опустошать кошельки.

Во сколько обошлась эта настройка
5 лет
уязвимость находилась в полностью открытом коде и оставалась незамеченной1
1596+ BTC
подтвержденная кража примерно с 7300 адресов, и цифра продолжает расти7
41 мин
крупнейшая единовременная кража: 1083 BTC, около 70 миллионов долларов на тот момент9
1 из триллиона
вероятность, которую злоумышленникам пришлось преодолеть на Mk3. По проекту требовалось угадать вариант из числа с 78 знаками1
Что пошло не так

Проверка безопасности, которая была и ничего не делала

01

Вся защита держится на одном числе, которое невозможно угадать

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

Технические детали

12 слов несут 128 бит энтропии, 24 слова — 256 бит, дополненные контрольной суммой SHA-256 от этой энтропии. Стандарт BIP-39 преобразует результат в мастер-ключ BIP-32.

Технические детали

12 слов несут 128 бит энтропии, 24 слова — 256 бит, дополненные контрольной суммой SHA-256 от этой энтропии. Стандарт BIP-39 преобразует результат в мастер-ключ BIP-32.

02

COLDCARD перестала использовать этот диапазон

В обновлении прошивки 2021 года кошелек незаметно перестал запрашивать случайное число у выделенного чипа генерации случайных чисел, переложив эту задачу на обычный программный код. Наглядно суть инцидента сводится к следующему:

Это безопасность, сокращенная не на две трети. Каждый бит удваивает объем работы, поэтому 88 недостающих битов уменьшают задачу в 2⁸⁸ раз. Триллион — большое число для человека и маленькое для того, кто арендует высокопроизводительные машины для перебора.

Технические детали

Генерация сид-фразы была перенесена с ckcc.rng_bytes() на ngu.random.bytes(). Компания Coinkite оценивает оставшееся пространство поиска примерно в 40 битов на Mk3 и примерно в 72 бита на Mk4/Mk5/Q при целевом показателе в 128 битов. Независимый анализ, проведенный Block, приходит к аналогичным порядкам значений (менее 2⁴⁰·⁷ и менее 2⁷३·³) и выявляет более узкие условия, при которых остается еще меньше вариантов.2

Технические детали

Генерация сид-фразы была перенесена с ckcc.rng_bytes() на ngu.random.bytes(). Компания Coinkite оценивает оставшееся пространство поиска примерно в 40 битов на Mk3 и примерно в 72 бита на Mk4/Mk5/Q при целевом показателе в 128 битов. Независимый анализ, проведенный Block, приходит к аналогичным порядкам значений (менее 2⁴⁰·⁷ и менее 2⁷३·³) и выявляет более узкие условия, при которых остается еще меньше вариантов.2

Диапазон значений для 24 слов по проекту
115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,936
Фактический диапазон значений COLDCARD
1,099,511,627,776
03

Программный код не способен генерировать случайность

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

Технические детали

При отключенном аппаратном генераторе случайных чисел функция rng_get() была привязана к программному генератору Yasmarang PRNG из MicroPython, который инициализировался из незащищенных состояний (UID, SysTick, RTC) и после этого не собирал новую энтропию, что позволяет выполнять перебор вариантов в автономном режиме. Coinkite не считает сид-фразы, смешанные с 50 или более честными и закрытыми бросками, уязвимыми только в силу этой проблемы: 50 × log₂6 ≈ 129 бит.3

Технические детали

При отключенном аппаратном генераторе случайных чисел функция rng_get() была привязана к программному генератору Yasmarang PRNG из MicroPython, который инициализировался из незащищенных состояний (UID, SysTick, RTC) и после этого не собирал новую энтропию, что позволяет выполнять перебор вариантов в автономном режиме. Coinkite не считает сид-фразы, смешанные с 50 или более честными и закрытыми бросками, уязвимыми только в силу этой проблемы: 50 × log₂6 ≈ 129 бит.3

04

А проверка, призванная это остановить, задала неверный вопрос

В сборке была проверка, написанная специально для того, чтобы предотвратить выпуск прошивки без аппаратного генератора. Она проверяла существование настройки, а не то, включена ли она. Настройка существовала, и она была выключена. Проверка промолчала, сборка не сообщила об ошибках, и прошивка ушла в релиз.

Технические детали

Директива #ifndef проверяет только факт определения макроса. В конфигурации платы MICROPY_HW_ENABLE_RNG была задана со значением 0 — то есть была объявлена и отключена, поэтому ошибка #error никогда не срабатывала, а компоновщик привязал rng_get() к программному резервному варианту.3

Технические детали

Директива #ifndef проверяет только факт определения макроса. В конфигурации платы MICROPY_HW_ENABLE_RNG была задана со значением 0 — то есть была объявлена и отключена, поэтому ошибка #error никогда не срабатывала, а компоновщик привязал rng_get() к программному резервному варианту.3

Фрагмент дефектного кода из исходных материалов.3

05

В течение пяти лет все выглядело абсолютно нормально

Слабая фраза восстановления выглядит точно так же, как сильная. Двадцать четыре обычных слова, правильная контрольная сумма, устройство ведет себя нормально. Никаких предупреждений на экране и никаких ошибок при сборке. Исходный код все это время был публичным. Чтобы заметить проблему, кому-то все равно требовалось открыть тот конкретный файл.

Технические детали

Слабый PRNG успешно проходит стандартные тесты на длину вывода, отсутствие нулевых значений и отсутствие повторов, поэтому поверхностные тесты не смогли бы его выявить.

Технические детали

Слабый PRNG успешно проходит стандартные тесты на длину вывода, отсутствие нулевых значений и отсутствие повторов, поэтому поверхностные тесты не смогли бы его выявить.

06

А затем кто-то произвел расчеты

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

Технические детали

Кандидаты выводятся в автономном режиме по стандартам BIP-39/BIP-32; сеть затрагивает только финальная проверка баланса, поэтому со стороны жертвы не поступает никаких предварительных сигналов.3

Технические детали

Кандидаты выводятся в автономном режиме по стандартам BIP-39/BIP-32; сеть затрагивает только финальная проверка баланса, поэтому со стороны жертвы не поступает никаких предварительных сигналов.3

Эта страница — не повод для триумфа.

Команда Coinkite раскрыла уязвимость, опубликовала технический отчет и выпустила исправление. Сторонние исследователи смогли восстановить ход событий, потому что COLDCARD имеет открытый исходный код.

Одно предостережение относительно оценок: они описывают объем работы по подбору, с которым сталкивается злоумышленник при текущих предположениях, а не данные секундомера. Никто не может сказать, сколько времени потребуется на взлом какого-то конкретного кошелька.2

Если у вас COLDCARD

Прочтите это в первую очередь

Необходимые действия зависят от того, какое устройство вы использовали при первичном создании фразы восстановления, а не от того, чем вы владеете сегодня.

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

Mk2 и Mk3: переведите ваши монеты прямо сейчас

Затронутый диапазон версий прошивки — с 4.0.1 по 4.1.9. Версия 4.2.0 исправляет процесс создания новых фраз, но ни одно обновление не может вернуть и добавить случайность в уже существующую фразу. Создайте новый кошелек на устройстве, которому вы доверяете, и переведите на него свои средства.1

Mk4 и Mk5: проверьте версию прошивки

Если фраза была создана на прошивке старше версии 5.6.0 (или 6.6.0X для сборок Edge), обновите устройство, создайте абсолютно новый кошелек на обновленной прошивке, а затем переведите средства. Само по себе обновление не исправляет старую фразу.1

Q: аналогично, пороговая версия — 1.5.0Q

Обновитесь до версии 1.5.0Q или новее (либо до 6.6.0QX для сборок Edge), создайте новый кошелек, запишите и проверьте резервную копию, отправьте одну небольшую тестовую транзакцию, а затем переведите остаток.1

Исправляет ли обновление прошивки COLDCARD уже созданную резервную фразу?

Как узнать, какая версия прошивки использовалась при создании моей резервной фразы COLDCARD?

Как проверить, не затронул ли этот сбой мой адрес?

Защищают ли броски костей или кодовая фраза фразу восстановления COLDCARD?

Охватывает ли официальное предупреждение Coinkite все уязвимые устройства COLDCARD?

Официальное техническое уведомление CoinkiteПерейдите на новый кошелек на устройстве, которому вы уже доверяете, и отправьте одну небольшую тестовую транзакцию перед миграцией всех средств. Сохраняйте публичные доказательства (идентификаторы транзакций, адреса, метки времени) и никогда не сохраняйте секреты. Любой, кто предлагает восстановить ваши средства, является организатором второй кражи, и подобных услуг не существует. Выбор нового аппаратного кошелька может подождать, пока ваши монеты в безопасности.
А если у вас OneKey

Устройства OneKey не затронуты

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

Не затронуты
OneKey Pro
OneKey Classic 1S
OneKey Classic 1S Pure
OneKey Touch
OneKey Classic
OneKey Mini

Мы не стали принимать это на веру. Когда появились новости, Anzen Lab отследила работу нашей системы генерации случайных чисел от начала и до конца (откуда она берется, что ее вызывает и какие настройки сборки определяют, какая именно версия попадет на ваше устройство) и опубликовала точные файлы, которые они проверяли.12

Читать повторную проверку Anzen Lab
Главный вопрос, который вас беспокоит

Могло ли это произойти с OneKey?

Для возникновения этого сбоя должны были одновременно совпасти три независимых фактора. В OneKey ни один из них невозможен, и вы можете самостоятельно проверить все три пункта.

Откуда берется наша энтропия

Откуда же берется случайность в устройствах OneKey?

Создается внутри чипа с сертификацией EAL 6+

Ваши ключи создаются и хранятся внутри специализированного защищенного от вскрытия чипа, а не универсального процессора, который управляет всем остальным. EAL 6+ — это уровень доверия, используемый для платежных и идентификационных карт.

Случайность под собственным контролем

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

Мы провели повторную проверку собственного кода

После новостей о COLDCARD специалисты Anzen Lab полностью проследили работу нашей собственной генерации случайных чисел (источники, прямые вызовы функции и настройки сборки, определяющие попадание кода на устройство) и опубликовали список проверенных файлов.11

OneKey Pro's EAL 6+ certified secure element
EAL 6+ Badge
Каждая транзакция, защищена чипами, сертифицированными по стандарту EAL 6+
Параметры генератора случайных чисел
Защищенный элемент
THD89
Уровень надежности
Сертификация EAL 6+
Источник энтропии
Аппаратный TRNG с самотестированием
Сертификация вывода по
BSI AIS 20 / 31
Повторный аудит после инцидента
Anzen Lab, исходный код опубликован
Как устроен OneKey и кто его проверяет

Четырехуровневая проверка каждого OneKey, где ни один компонент не доверяет остальным трем

Любой из них может что-то пропустить. Суть в том, что всем четырем пришлось бы пропустить одно и то же. У COLDCARD не было такой подстраховки: было достаточно одной не проверенной настройки сборки.

01

Открытый код, который действительно можно проверить

Наш исходный код прошивок и приложений опубликован на GitHub, а сборки воспроизводимы. Это значит, что вы можете самостоятельно пересобрать код и убедиться, что он в точности соответствует ПО на вашем устройстве. Именно этот шаг позволяет предотвратить проблему «правильный код, но не та версия».

OneKey на GitHub
02
SlowMist

Независимый аудит с официальным подтверждением

Аудиторская компания SlowMist проверяет нас и публикует отчеты. Отдельные проверки охватывают OneKey Pro, Classic 1S и наш SDK. Наша практика безопасности сертифицирована по стандарту ISO/IEC 27001, а линейки Pro и Classic 1S прошли сертификацию на соответствие EN 18031 уполномоченным органом ЕС. Все документы опубликованы, и ничто не основано на внутренних оценках.13

Читать сводку аудита SlowMist
03

Собственная команда тестировщиков на проникновение

Anzen Lab — это наша собственная команда безопасности, состоящая из инженеров по защите аппаратного обеспечения, прошивок и приложений, которые работают в сотрудничестве с привлеченными исследователями. Их задача — взламывать аппаратные кошельки, включая наши собственные, до того, как они поступят в продажу. Когда разразилась эта история, они заново проверили систему генерации случайных чисел OneKey от начала до конца и опубликовали точный список проверенных ими файлов.11

Читать анализ Anzen Lab
04

Мы платим сторонним специалистам за поиск наших ошибок

Любой желающий может конфиденциально сообщить нам об уязвимости через нашу публичную программу на BugRap или напрямую на [email protected] и получить вознаграждение. Размер выплаты зависит от степени критичности по шкале CVSS. Главная цель — сделать сообщение нам выгоднее, чем продажа уязвимости.15

OneKey на BugRap
entro.tools · Разработано нашим основателем

Проверьте кошелек в своей руке

entro.tools — это бесплатный инструмент с открытым исходным кодом, который считывает реальные случайные числа, поступающие из аппаратного кошелька, и запускает для них стандартные статистические тесты работоспособности прямо в вашем браузере через USB, без загрузки данных куда-либо и без необходимости обновления прошивки.

Инструмент работает как с устройствами Trezor и KeepKey, так и с нашими собственными изделиями, позволяя сопоставить их результаты, а не полагаться на утверждения какого-то одного производителя.
Способ выполнения
В браузере через WebUSB
Применяемые тесты
FIPS 140-2, NIST SP 800-22 / 90B
Ваши данные
Не покидают пределы страницы
Обновление прошивки
Не требуется
Проверка энтропии

Локально запускает тесты работоспособности FIPS 140-2, NIST SP 800-22 и SP 800-90B через WebUSB (в настольных браузерах Chrome или Edge). Устройство запрашивает экспорт энтропии — пакета только что сгенерированных случайных чисел, но никогда не запрашивает вашу фразу восстановления.16

Универсальный тест Маурера требует не менее 387 840 бит; при меньшем объёме отчёт прямо помечает его как пропущенный, а не убирает молча.16

Поддерживаемые модели кошельков для проверки

Возможность для постороннего лица прочитать исходные случайные числа устройства. Это лишь один узкий аспект. См. примечание ниже.

OneKey
Доступна проверка своими силами
Все модели, стандартная прошивка16
Trezor
Доступна проверка своими силами
Все модели, общий протокол передачи данных16
KeepKey
Доступна проверка своими силами
Семейство устройств с протоколом Trezor16
Ledger
Доверие производителю
Закрытый защищенный элемент; хост-команды для чтения сырых случайных чисел отсутствуют16
BitBox02
Доверие производителю
Запрос случайных чисел на уровне протокола был удален производителем16
Blockstream Jade
Доверие производителю
Хост может только добавлять энтропию; считать источник обратно невозможно16
COLDCARD
Доверие производителю
Имеет USB-порт, но протокол полностью лишен команды запроса энтропии16
Keystone
Доверие производителю
Изолированное устройство (Air-gapped); через USB передаются только сведения об устройстве и обновления прошивки16
Утверждения «нельзя протестировать» и «небезопасно» означают разные вещи. Закрытые защищенные элементы проходят собственную процедуру сертификации. Успешный результат доказывает лишь то, что сегодня статистических дефектов не обнаружено. Он не может доказать криптографическую непредсказуемость и ничего не говорит о случайных числах, которые использовались в день создания вашего кошелька.
Остались вопросы

Вопросы, которые это вызывает у всех остальных

Затронут ли сбой генерации энтропии в COLDCARD устройства OneKey?

Каких аппаратных кошельков касается сбой генерации энтропии в COLDCARD?

Могу ли я проверить случайность генерации в своем собственном кошельке?

Как определить, можно ли доверять аппаратному кошельку?

Безопасность, которую можно проверить, а не та, в которую просят верить.

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

Cold Storage Weeks
До $50 в биткоинах с каждым устройством до 17 августа.

Источники

Источники ниже получены по состоянию на 6 августа 2026 года. Сначала идут официальное уведомление и технический отчет Coinkite, затем независимый анализ исходного кода и ончейн-расследование. Показатели ущерба продолжают пересчитываться в сторону увеличения: компания Galaxy Research подтвердила кражу 1,596 BTC на 4 августа и оценивает предполагаемый ущерб ближе к 2,055 BTC.