Повний звіт про інцидент · 16 джерел · Anzen Lab

Чотири рядки коду.
Понад 1 596 BTC зникли.

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

У скільки обійшлося це налаштування
5 років
вразливість перебувала у повністю публічному коді непоміченою1
1 596+ 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 функція rng_get() зв'язалася з Yasmarang PRNG MicroPython, отримавши початкове значення з незасекреченого стану (UID, SysTick, RTC), і після цього не збирала нову ентропію, тому кандидати перебираються офлайн. Coinkite не вважає сіди, змішані з 50 або більше чесними приватними кидками, такими, що піддаються ризику лише через цю проблему: 50 × log₂6 ≈ 129 бітів.3

Технічні деталі

При відключеному апаратному RNG функція 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?

Створено всередині чіпа з сертифікацією 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
Довіра виробнику
Повністю ізольований за дизайном; USB передає лише інформацію про пристрій та оновлення прошивки16
"Неможливо перевірити" та "небезпечно" — це різні твердження. Закриті захищені елементи проходять власний шлях сертифікації. Позитивний результат доводить лише те, що сьогодні не виявляється жодних статистичних дефектів. Він не може довести криптографічну непередбачуваність і нічого не говорить про випадковість, яка використовувалася в день створення вашого гаманця.
Усе ще є запитання

Питання, які це викликає для всіх інших

Чи зачепив збій ентропії COLDCARD гаманці OneKey?

Які апаратні гаманці зазнали впливу збою ентропії COLDCARD?

Чи можу я перевірити випадковість генерації власного гаманця?

Як оцінити, чи можна довіряти апаратному гаманцю?

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

Відкритий код із можливістю відтворення, перевірений сторонніми фахівцями, атакований нашою власною лабораторією та оплачуваний у разі знаходження прогалини. Це пристрої, про які йдеться в цій дискусії.

Cold Storage Weeks
До $50 у Bitcoin з кожним пристроєм до 17 серпня.

Джерела

Джерела нижче, отримані 6 серпня 2026 року. Власний бюлетень та технічний звіт Coinkite йдуть першими, за ними слідують незалежний аналіз на рівні вихідного коду та блокчейн-аудит. Показники втрат усе ще переглядаються в бік збільшення: Galaxy Research підтвердила 1596 BTC 4 серпня і оцінила підозрювані втрати ближче до 2055 BTC.