Чотири рядки коду.
Понад 1 596 BTC зникли.
Два файли, чотири рядки, п'ять років непомітності. Це детальний покроковий розбір збою ентропії COLDCARD: у чому полягав дефект, як зловмисники знайшли гаманці, що робити постраждалим власникам, а також чотири перевірки, які проводить OneKey, аби подібне не могло непомітно повторитися тут.
Перевірка безпеки, яка була і нічого не зробила
Шість кроків без складних термінів. Пояснення до кожного з них — це точна технічна версія для тих, хто хоче перевірити роботу.
Увесь захист тримається на одному числі, яке неможливо вгадати
Апаратний гаманець виконує кілька завдань. Він показує вам те, що ви насправді підписуєте, позбавляючи від необхідності довіряти екрану зараженого комп'ютера, і зберігає ваш ключ усередині чіпа, розробленого для захисту від розкриття. Кожен із цих захистів базується на одному й тому ж припущенні: число, з якого виведено ваш ключ, неможливо було вгадати. Якби це було можливо, зловмиснику не довелося б обходити жоден із них. Пул, із якого має обиратися 24-слівна фраза, містить приблизно одне число на кожну тисячу атомів у спостережуваному Всесвіті. Суть полягала зовсім не в тому, що ваша фраза прихована. Суть у тому, що цей пул неможливо перебрати.
12 слів містять 128 бітів ентропії, 24 — 256 бітів, плюс контрольна сума на основі SHA-256 від цієї ентропії. BIP-39 перетворює результат на головний ключ BIP-32.
12 слів містять 128 бітів ентропії, 24 — 256 бітів, плюс контрольна сума на основі SHA-256 від цієї ентропії. BIP-39 перетворює результат на головний ключ BIP-32.
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
Оскільки програмне забезпечення не може бути випадковим
Подумайте, що робить кидок монети непередбачуваним: сила кидка, гравітація, потік повітря від кондиціонера, ледь помітні коливання ґрунту. Десятки факторів, які ви можете назвати, і десятки тих, які не можете. Ніхто не в змозі обчислити траєкторію, тому ніхто не може назвати результат. Програмне забезпечення позбавлене всього цього. Воно виконує фіксовану формулу над кількома початковими значеннями та видає фіксовану відповідь — і тут початковими значеннями були серійний номер чипа та час роботи пристрою після ввімкнення. Зловмисник, якому відомі рецепт і складники, не вгадує результат. Він його перераховує.
Після вимкнення апаратного 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
А перевірка, яка мала це зупинити, ставила не те запитання
Це момент, над яким варто замислитися. У процесі збірки існував захисний елемент, створений спеціально для того, щоб зупинити випуск прошивки без апаратного генератора. Він перевіряв наявність налаштування. Він не запитував, чи ввімкнено це налаштування. Налаштування існувало, і воно було вимкнене. Тому захист мовчав, збірка не повідомляла про помилки, і прошивка була випущена.
#ifndef перевіряє лише факт визначення. Конфігурація плати визначала MICROPY_HW_ENABLE_RNG як 0 — визначене та вимкнене значення — тому помилка #error ніколи не спрацьовувала, а компонувальник пов'язував rng_get() із програмним резервним варіантом.3
#ifndef перевіряє лише факт визначення. Конфігурація плати визначала MICROPY_HW_ENABLE_RNG як 0 — визначене та вимкнене значення — тому помилка #error ніколи не спрацьовувала, а компонувальник пов'язував rng_get() із програмним резервним варіантом.3
Дефект, цитований із вихідного коду. Два файли, чотири рядки, п'ять років.3
Протягом п'яти років нічого не вказувало на проблеми
Слабка фраза відновлення виглядає точнісінько як надійна. Двадцять чотири звичайні слова, правильна контрольна сума, нормальна поведінка пристрою. Жодних попереджень на екрані, жодних помилок під час збірки, жодних ознак для занепокоєння. Вихідний код був публічним увесь цей час. Будь-хто міг його прочитати. Можливість читати код не означає, що хтось справді прочитав саме цю його частину.
Довжина вихідних даних, відсутність нулів та відсутність повторів успішно проходять перевірку на слабкому PRNG, тому звичайні базові тести теж не могли цього виявити.
Довжина вихідних даних, відсутність нулів та відсутність повторів успішно проходять перевірку на слабкому PRNG, тому звичайні базові тести теж не могли цього виявити.
А потім хтось виконав розрахунки
Вони ніколи не торкалися жодного пристрою. Вони згенерували ймовірні фрази на власних комп'ютерах, вирахували відповідні біткоїн-адреси для кожної з них і перевірили ці адреси за публічним блокчейном. Кожна адреса з балансом була спорожнена. Гаманець, який лежав у шухляді без підключення з 2022 року, був настільки ж уразливим, як і той, що використовувався щодня.
Кандидати виводяться в офлайні через BIP-39/BIP-32; мережі торкається лише фінальна перевірка балансу, тому з боку жертви заздалегідь немає жодних ознак активності.3
Кандидати виводяться в офлайні через BIP-39/BIP-32; мережі торкається лише фінальна перевірка балансу, тому з боку жертви заздалегідь немає жодних ознак активності.3
Застереження щодо оцінок: вони описують обсяг підбору, з яким стикається зловмисник за поточних припущень, а не час виконання за секундоміром. Ніхто не може сказати, скільки часу знадобиться для зламу конкретного гаманця.2
Ця сторінка — не привід для злорадства.
Coinkite публічно повідомила про це, опублікувала повний технічний звіт та випустила належне виправлення. Відкритий вихідний код 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?
Жоден пристрій OneKey не постраждав
Жодної моделі з тих, що ми коли-небудь випускали. Наша прошивка не має жодних залежностей від libngu, Coinkite, COLDCARD чи CKCC — шлях коду, який дав збій, тут відсутній, і ви можете перевірити це самостійно в наших репозиторіях. На нашому поточному обладнанні ключ генерується справжнім генератором випадкових чисел всередині сертифікованого захищеного елемента, а не програмним забезпеченням на головному процесорі, і саме така підміна призвела до цього збою.
Ми й це не сприймали на віру. Коли з'явилася ця новина, Anzen Lab відстежила нашу ентропію від початку до кінця: звідки вона береться, що саме її викликає та які налаштування збірки визначають, яка саме версія потрапляє на ваш пристрій, — і опублікувала точні файли, які перевіряла.12
Читати повторну перевірку Anzen LabЧи могло це статися з OneKey?
Цей збій вимагав одночасного виконання трьох окремих умов. На OneKey жодна з них неможлива — і кожну з них ви можете самостійно перевірити, не вірячи нам на слово.
То звідки ж береться випадковість у OneKey?
Створено всередині чіпа з сертифікацією EAL 6+
Ваші ключі створюються та зберігаються в спеціалізованому захищеному від зламу чіпі, а не в універсальному процесорі, який керує всім іншим. EAL 6+ — це рівень гарантії, який використовується для платіжних та ідентифікаційних карток.
Генератор випадкових чисел, який контролює себе
Цей чип створює випадкові дані на основі реального фізичного шуму та безперервно перевіряє власні результати: якщо генерація починає працювати з відхиленнями, чип помічає це, замість того щоб мовчки продовжувати роботу.
Ми здійснили повторну перевірку власних систем
Після новин про COLDCARD лабораторія Anzen Lab повністю простежила власний процес генерації випадкових чисел: звідки він береться, що його фактично викликає та які параметри збірки визначають, яка саме версія потрапить на ваш пристрій, та опублікувала точні файли, що підлягали перевірці.11


Чотири рівні перевірки кожного OneKey, і жоден із них не довіряє трьом іншим
Будь-який із них може пропустити помилку. Суть у тому, що всі чотири мають пропустити одну й ту саму. У COLDCARD не було такого запобіжника: було достатньо одного неперевіреного параметра збірки.
Відкритий код, який дійсно можна перевірити
Наша прошивка та додатки є публічними на GitHub, а наші збірки відтворювані, що означає можливість самостійно перезібрати код і переконатися, що він створює саме те програмне забезпечення, яке працює на вашому пристрої. Це крок, який виявляє проблему «правильний код, не та версія».
OneKey на GitHub
Сторонні аудитори перевіряють нас офіційно
Аудит нашої безпеки проводить і публікує звіти компанія SlowMist — окремі оцінки охоплюють OneKey Pro, Classic 1S і наш SDK. Наші практики безпеки сертифіковані за стандартом ISO/IEC 27001, а лінійки Pro та Classic 1S сертифіковані на відповідність стандарту EN 18031 призначеним ЄС органом. Усе це опубліковано, а не оцінено самостійно.13
Читати зведення аудиту SlowMistКоманда, якій платять за злам власних продуктів
Anzen Lab — наша внутрішня команда безпеки, що складається з інженерів із захисту обладнання, прошивок та програмного забезпечення, які працюють разом із залученими зовнішніми дослідниками. Їхнє завдання — ламати апаратні гаманці, зокрема наші власні, до того, як вони потраплять у продаж. Коли розгорнулася ця історія, вони повторно перевірили всю систему генерації випадкових чисел OneKey від початку до кінця й опублікували точний перелік перевірених файлів.11
Читати аналіз Anzen LabМи платимо стороннім фахівцям за пошук наших помилок
Будь-хто може повідомити нам про вразливість конфіденційно через нашу публічну програму на BugRap або напряму на [email protected] та отримати за це винагороду. Сума виплати залежить від рівня критичності за шкалою CVSS. Головна мета — зробити повідомлення нам вигіднішим за продаж вразливості.15
OneKey на BugRapНе вірте нам на слово. Перевірте гаманець у своїй руці.
entro.tools — це безкоштовний інструмент із відкритим вихідним кодом, який зчитує справжні випадкові числа з апаратного гаманця та виконує над ними стандартні статистичні тести — у вашому браузері через WebUSB, без завантаження будь-яких даних та без потреби оновлення прошивки.
Виконує локальні тести FIPS 140-2, NIST SP 800-22 та SP 800-90B через WebUSB (у десктопних версіях Chrome або Edge). Пристрій запитує дозвіл на експорт ентропії — пакету випадкових чисел, які він щойно згенерував, але ніколи не вашої фрази відновлення.16
Універсальний тест Маурера потребує щонайменше 387 840 біт; за меншого обсягу звіт прямо позначає його як пропущений, а не прибирає мовчки.16
Які гаманці можна перевірити
Чи може сторонній спостерігач взагалі зчитати необроблені випадкові числа пристрою. Це лише один вузький аспект — дивіться примітку нижче.
Питання, які це викликає для всіх інших
Чи зачепив збій ентропії COLDCARD гаманці OneKey?
Які апаратні гаманці зазнали впливу збою ентропії COLDCARD?
Чи можу я перевірити випадковість генерації власного гаманця?
Як оцінити, чи можна довіряти апаратному гаманцю?
Пояснювати складне — наша робота
Безпека, яку можна перевірити, а не та, у яку просять повірити.
Відкритий і вихідний код, який можна відтворити самостійно. Перевірено сторонніми аудиторами. Протестовано на стійкість нашою власною лабораторією. Із виплатою винагороди за знайдені вразливості. Це наша позиція; ось пристрої, про які йдеться.
Джерела
Усе на цій сторінці ґрунтується на наведених нижче джерелах, отриманих станом на 6 серпня 2026 року: спочатку офіційні попередження та технічний звіт виробника, а потім незалежний аналіз коду та ончейн-аудит. Цифри збитків продовжують переглядатись у бік збільшення: підтверджений підрахунок Galaxy Research на 4 серпня становив 1 596 BTC, а ймовірні втрати — близько 2 055 BTC.
- 1. Coinkite — COLDCARD Mk3 Seed Generation Security Advisory
- 2. Coinkite — Technical Deep Dive into the Entropy Issue
- 3. Block Engineering — Predictable RNG Fallback and 32-Bit Reseed in COLDCARD Firmware
- 4. CoinDesk — Bitcoin cold-wallet attack spreads to 4,500 addresses as losses near $89 million
- 5. CoinDesk — Major bitcoin wallet flaw drains 594 BTC in 25-minute sweep
- 6. Crypto Briefing (Galaxy Research) — Galaxy Research identifies 1,367 BTC drained in attacks on Coldcard addresses
- 7. The Crypto Times (Galaxy Research) — Coldcard hack losses hit $100M with 1,596 BTC stolen in ongoing attack
- 8. The Crypto Times (Galaxy Research) — 15 attackers exploit ongoing Coldcard hack as losses approach $130M
- 9. The Hacker News — Coldcard Hardware Wallet Flaw Linked to $70 Million Bitcoin Theft in 41 Minutes
- 10. Bitcoin Magazine — Coinkite Releases Fixed Firmware After Coldcard Bug
- 11. OneKey Anzen Lab — The COLDCARD Entropy Failure: How a Silent RNG Fallback Cost Users $38 Million
- 12. OneKey — Statement: OneKey devices are not affected by this issue
- 13. OneKey — OneKey has passed a security audit by SlowMist — separate reports cover the Pro, the Classic 1S and the SDK
- 14. SlowMist — SlowMist Audit Report — OneKey Pro
- 15. BugRap — OneKey Bug Bounty Program
- 16. entro.tools — Entropy Check — verify your hardware wallet's randomness (device support matrix)








