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

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

Два файли, чотири рядки, п'ять років непомітності. Це детальний покроковий розбір збою ентропії COLDCARD: у чому полягав дефект, як зловмисники знайшли гаманці, що робити постраждалим власникам, а також чотири перевірки, які проводить OneKey, аби подібне не могло непомітно повторитися тут.

Одна недоглянута настройка в цифрах
5 років
вразливість перебувала у повністю публічному коді непоміченою1
1 596+ BTC
підтверджено викрадено приблизно з 7 300 адрес — і сума далі зростає7
41 хв
найбільша одноразова крадіжка — 1 083 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 не вважає seed-фрази, змішані з 50 або більше чесними приватними кидками, вразливими лише через цю проблему: 50 × log₂6 ≈ 129 бітів.3

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

Після вимкнення апаратного RNG функція rng_get() підключалася до Yasmarang PRNG у MicroPython, ініціалізуючись із несекретних даних — UID, SysTick, RTC — і після цього не збирала свіжу ентропію, тому варіанти перебираються в офлайні. Coinkite не вважає seed-фрази, змішані з 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

Застереження щодо оцінок: вони описують обсяг підбору, з яким стикається зловмисник за поточних припущень, а не час виконання за секундоміром. Ніхто не може сказати, скільки часу знадобиться для зламу конкретного гаманця.2

Ця сторінка — не привід для злорадства.

Coinkite публічно повідомила про це, опублікувала повний технічний звіт та випустила належне виправлення. Відкритий вихідний код COLDCARD — це саме те, чому сторонні дослідники взагалі змогли відтворити всю картину. Ми описуємо це тому, що причину збою варто зрозуміти детально: дефект у коді, який ніхто не перевіряв, і відсутність перевірки на виході, яка могла б це виявити.

Якщо у вас 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 — це безкоштовний інструмент із відкритим вихідним кодом, який зчитує справжні випадкові числа з апаратного гаманця та виконує над ними стандартні статистичні тести — у вашому браузері через WebUSB, без завантаження будь-яких даних та без потреби оновлення прошивки.

Інструмент працює як з 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 року: спочатку офіційні попередження та технічний звіт виробника, а потім незалежний аналіз коду та ончейн-аудит. Цифри збитків продовжують переглядатись у бік збільшення: підтверджений підрахунок Galaxy Research на 4 серпня становив 1 596 BTC, а ймовірні втрати — близько 2 055 BTC.