Насколько сложно угадать вашу сид-фразу? И почему с ColdCard это стало просто

Ключевые выводы
• Сбойное обновление прошивки ColdCard незаметно переключилось с аппаратного генератора случайных чисел на программный псевдослучайный
• Это сократило пул возможных фраз восстановления с 2^256 примерно до 2^40 (около 1,1 триллиона) на моделях Mk2/Mk3 и примерно до 2^72 на Mk4/Mk5/Q
• Злоумышленники не взламывали устройство — они просто угадали фразы восстановления, которые перестали быть сложными для подбора
• Правильно сгенерированная 24-словная фраза BIP-39 примерно в 5×10^60 раз сложнее для совпадения, чем гамма-всплеск массового вымирания в следующую секунду
• Истинный генератор случайных чисел использует физический шум, поэтому знание модели устройства, серийного номера, времени загрузки и полного исходного кода все равно не поможет злоумышленнику
Эта статья написана простым языком. Для удобства понимания некоторые технические детали были упрощены или превращены в аналогии и могут отличаться от того, как всё устроено на самом деле. Если вам необходимо принимать решения по защите реальных активов, пожалуйста, руководствуйтесь официальными анонсами и проконсультируйтесь со специалистом.
30 июля 2026 года в блокчейне Bitcoin произошло нечто необычное: всего за 15 минут 500 адресов перевели примерно 594,48 BTC (около 38 миллионов долларов США) на один единственный адрес. Вскоре после этого около 562 BTC от этой суммы были переведены на другой адрес. Очевидно, что это была не обычная переводная активность, и позже подтвердилось, что хакер перемещал украденные средства. Ончейн-запись
500 исходных адресов → один адрес консолидации (~594,48 BTC / ~$38 млн) → второй адрес (~562 BTC)
По мере того как жертвы одна за другой выходили на связь, обнаружилась общая черта: все они пользовались аппаратным кошельком Coldcard. В тот же день производитель Coldcard, компания Coinkite, выпустила предупреждение о безопасности, и как их собственное официальное расследование, так и независимый технический анализ подтвердили: с кошельком ColdCard действительно что-то пошло не так. Проблема заключалась в том, как генерировались случайные числа, а это означало, что злоумышленникам вообще не нужно было взламывать сам Coldcard. Им нужно было лишь угадать фразу восстановления пользователя, чтобы опустошить счета.
Так что же на самом деле произошло?
Весь этот инцидент пошел не по плану на одном конкретном этапе: при генерации фразы восстановления.
Вот аналогия. Обычно, когда аппаратный кошелок генерирует фразу восстановления, это все равно что запустить руку в практически бесконечное хранилище ключей, случайно вытащить один и отдать его вам, и этот ключ открывает сейф, принадлежащий только вам. Но в программном обеспечении ColdCard была ошибка, и диапазон, из которого оно выбирало ключи, сузился со всего этого хранилища до одного маленького ящика стола. Все, что вам нужно сделать, — это перебрать ключи в этом ящике один за другим: каждый, который что-то открывает, вы опустошаете.
Конечно, эта аналогия не совсем точна, но принцип верен. Точнее говоря: из-за ошибочного обновления от команды разработчиков прошивки ColdCard при генерации фразы восстановления кошелек не смог обратиться к более безопасному аппаратному генератору случайных чисел и вместо этого использовал «псевдослучайный» программный генератор случайных чисел. Произведенный им «пароль», то есть фраза восстановления, просто оказался недостаточно безопасным, что и привело к этому инциденту.
На этом этапе вы, возможно, задаетесь вопросом: какое вообще отношение моя фраза восстановления имеет к случайным числам? Как хакер нашел пароль от сейфа? И что вообще такое генератор случайных чисел? Подождите, позвольте мне всё объяснить.
Что на самом деле скрывается за сид-фразой?
Почему сид-фраза доказывает, что активы принадлежат вам?
Прежде чем мы разберемся, откуда берется сид-фраза, нам нужно четко уяснить одну вещь: взаимосвязь между вашими активами, вашим кошельком и вашей сид-фразой.
Сид-фраза на самом деле не слишком похожа на ключ от сейфа. В базовой архитектуре блокчейна ваши активы все это время находились в открытом доступе в сети, как наличные деньги в банке. На самих купюрах не написано имя владельца, их видит каждый, и в теории любой имеет право с ними что-то сделать. Но очевидно, что далеко не каждый может снять неограниченные суммы. Все потому, что перед переводом чего-либо блокчейн просит вас предоставить «доказательство» того, что вы владеете этими активами и они принадлежат вам, и этим «доказательством» является ваша сид-фраза.
Другими словами, чью бы сид-фразу ни ввели в блокчейне, активы, на которые она указывает, принадлежат этому человеку, даже если за устройством сидите не вы, ведь блокчейн видит лишь то, что кто-то предоставил действительное доказательство владения.
Кто-то инициирует перевод → блокчейн запрашивает доказательство → подпись, полученная из сид-фразы → проверено, активы могут перемещаться
Блокчейн доверяет доказательствам, а не людям.
Таким образом, по своей природе сид-фраза ближе к свидетельству о праве собственности или официальной печати с «особым номером». Саму печать легко подделать; то, что действительно делает ее защищенной от подделок — это особый «номер», который она несет, и по задумке этот номер практически невозможно угадать кому-либо еще.
Так что весь вопрос сводится к этой цепочке «номеров». Откуда она берется? И как она защищает ваши активы?
Как сид-фраза превращается из чисел в слова?
Все мы знаем, что компьютеры работают на двоичном коде. Текст, изображения, пароли — оказавшись внутри компьютера, все они в конечном итоге превращаются в последовательность нулей и единиц. Сид-фразы не исключение.
Например, внутри компьютера это может выглядеть так:
010101000010
Но вы можете спросить: сид-фраза — это куча английских слов, а не цифр. Каким же образом она получается из этой строки нулей и единиц?
В этом нет ничего сложного. Сначала мы готовим «словарь», который определяет, какой кусок цифр какому слову соответствует. Чтобы было проще разобраться, давайте набросаем крошечный словарь всего из 16 слов:
Затем мы делим эту строку кода на три части:
0101 | 0100 | 0010
После этого мы берем эти три кусочка и ищем их в словаре:
0101 → squirrel
0100 → coffee
0010 → moon
И вот так строка двоичного кода, которую было почти невозможно прочитать, превращается в три слова, которые легко записать:
squirrel coffee moon
В этом и заключается основной принцип работы сид-фразы: это не набор слов, появившихся из ниоткуда. Это одно длинное число, разбитое на множество маленьких частей, причем каждая часть переводится в слово с помощью фиксированного списка слов.
Конечно, реальная сид-фраза немного сложнее этого примера: список слов больше, число длиннее, а также добавляется информация контрольной суммы. Но основная логика не меняется. Сид-фраза — это просто другой способ выражения той же строки чисел, который человеку проще записать, сохранить и восстановить.
Насколько сложно угадать 24 слова?
Разобравшись с этим, мы наконец можем перейти к настоящим сид-фразам. В настоящее время существует довольно много стандартов для их генерации, которые можно рассматривать как множество различных «словарей». Давайте возьмем самый распространенный из них — BIP-39 — и поговорим о том, откуда на самом деле берется безопасность сид-фразы.
Словарь BIP-39 содержит ровно 2 048 слов, что намного больше, чем в нашем примере, но работает он по сути точно так же. Он также создается на основе одной очень длинной строки двоичного кода. В частности, она получается из 264-битной строки, где каждые 11 бит представляют одно слово, а каждое слово имеет 2^11, то есть 2 048 вариантов, что точно соответствует 2 048 словам в словаре.
Но компьютеры работают в двоичной системе, и случайные числа, которые они генерируют, могут быть кратны только 2, поэтому вы не можете сгенерировать 264-битное случайное число напрямую. Что мы можем сделать, так это сначала сгенерировать 256-битное случайное число, а затем перенести первые 8 цифр в конец. Теперь у нас есть 264 бита, которых достаточно для 24-словной сид-фразы.
Помните, что мы только что обсуждали? Безопасность сид-фразы, нашей «официальной печати», обеспечивается одной особой строкой чисел, и этим числом является случайное число, стоящее за фразой. Мы также говорили, что печать безопасна именно потому, что никто не может угадать, какое на ней число. Вы, очевидно, не сможете претендовать на чьи-то активы, угадав неверное число. Так насколько сложно угадать это число? Все сводится к длине случайного числа: 256-битное случайное число имеет целых 2^256 вариантов, что означает 2^256 возможных сид-фраз или 2^256 возможных адресов кошелька.
Насколько велико это число? Количество элементарных частиц в наблюдаемой Вселенной обычно оценивается примерно в 10^80, в то время как 2^256 ≈ 10^77. Иными словами, мы могли бы выдать адрес кошелька практически каждой наблюдаемой частице во Вселенной. А все население Земли составляет всего около 2^33, так что каждый человек все равно смог бы получить примерно по 2^223 адресов, что представляет собой единицу с 67 нулями:
10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000
Итак, хакер, пытающийся угадать вашу фразу восстановления, все равно что пытается выбрать единственный адрес с балансом среди всех остальных. Это невероятно сложно.
Но на этом этапе кто-нибудь может спросить: может ли компьютер случайно сгенерировать два одинаковых адреса кошелька? Тогда тот, кто окажется вторым, сможет просто уйти с активами первого, верно? Хороший вопрос, и технически такая возможность существует. Однако в реальном мире этого не произойдет. Для двух независимо и корректно сгенерированных 24-словных фраз восстановления BIP-39 вероятность их совпадения составляет 1 / 2^256 ≈ 8.6 × 10^-78.
Для сравнения, по оценкам авторитетных научных работ, вероятность того, что Земля в следующее мгновение подвергнется удару гамма-всплеска, достаточного для вызывания массового вымирания, составляет примерно 4.4 × 10^-17. Это означает, что коллизия фраз восстановления примерно в 5 × 10^60 раз менее вероятна, чем событие массового вымирания.
Это дает вам некоторое представление о том, насколько сложно угадать фразу восстановления.
Так в чем же именно ошибся ColdCard?
От 2^256 до 2^40
Как только вы поймете, что на самом деле скрывается за фразой восстановления, вам станет легко понять, в чем ошибся ColdCard.
Одно ошибочное обновление от команды ColdCard привело к тому, что при генерации фраз восстановления вместо 2^256 возможных вариантов получалось всего 2^40 — ошеломляющая разница в масштабе. Вы вполне можете спросить, как 40-битное случайное число порождает 24 слова, но не зацикливайтесь на этом. Все, что вам нужно знать, — эта ошибка драматически повысила вероятность того, что адрес кошелька, сгенерированный ColdCard, может быть угадан.
Стоит внести ясность в отношении масштабов: разные модели пострадали в разной степени. Примерно 40 бит, о которых идет речь, относятся в основном к Mk2 и Mk3, в то время как оценка для Mk4, Mk5 и Q составляет около 72 бит.
Сопоставьте эти два числа друг с другом, и ответ бросится в глаза: всего из ColdCard могло появиться в общей сложности 1,099,511,627,776 возможных фраз восстановления. Хакеру достаточно запустить высокопроизводительную машину, которая будет перебирать их одну за другой, и появляется реальный шанс уйти с чужими средствами. Это по-прежнему тяжелая работа, но ее масштаб уже вполне по силам человечеству на данном этапе.
Даже в этот момент ситуация еще не была катастрофической. 1,099,511,627,776 — все еще довольно большое число, и с учетом сетевых задержек хакеру могли потребоваться годы попыток, прежде чем наткнуться на адрес с балансом.
К сожалению, ошибка ColdCard также означала, что даже метод генерации этих возможных значений поддавался отслеживанию, что колоссально снизило сложность.
Почему сгенерированные программным обеспечением случайные числа можно угадать?
Все потому, что случайные числа, которые ColdCard использовала для фраз восстановления, поступали из «программного генератора случайных чисел», и строго говоря, любой генератор такого рода является «псевдослучайным», а его алгоритм можно отследить. Почему я так говорю?
Сначала подумайте о том, что такое случайность на самом деле. Допустим, мы подбрасываем монету. Обычно мы говорим, что у орла и решки равные шансы 50% и они выпадают случайно. Это происходит потому, что пока монета летит по воздуху, ее траектория формируется самыми разными факторами: с какой силой мы ее подбросили, гравитацией Земли, силой и направлением работы кондиционера в комнате, эффектом Кориолиса и даже крошечными вибрациями от движения земной коры — факторами, о которых мы можем догадаться, и множеством тех, о которых нет. Сложившись вместе, они делают невозможным расчет траектории полета монеты, поэтому мы не можем вычислить результат и принимаем, что подбросить монету — это «случайно».
Но «программный генератор случайных чисел» работает по фиксированному алгоритму. Говоря в общем, он берет горстку начальных условий, прогоняет их через фиксированный алгоритм и выдает фиксированное случайное число. Иными словами: пока мы знаем эти немногие начальные условия, мы знаем, какое случайное число он выдаст, а значит, и какой будет фраза восстановления.
И как назло, начальные условия, которые люди обычно используют, — это такие вещи, как метка времени в момент генерации, метка времени загрузки устройства, серийный номер устройства и так далее. Это означает, что хакеру достаточно сделать разумные предположения об этих числах, а затем разработать алгоритм для взлома фраз восстановления, сгенерированных ColdCard. Иными словами, хакеру вообще не нужно гадать вслепую, поскольку способ генерации фразы изначально следует определенному шаблону.
Как аппаратный генератор случайных чисел на самом деле обеспечивает безопасность?
Корень всего этого заключается в том, что ColdCard не использовал «истинный генератор случайных чисел», то есть аппаратный генератор случайных чисел внутри чипа Secure Element. Как мы уже говорили выше, обычный программный PRNG представляет собой детерминированную формулу:
device ID + time + algorithm → random number
Если злоумышленник может перебрать идентификаторы устройств и время, он может заново вычислить каждый результат.
Истинный генератор случайных чисел, с другой стороны, опирается на физические явления, такие как:
- тепловой шум в цепях;
- джиттер генератора;
- метастабильность транзисторов;
- лавинный шум;
- квантовый шум в некоторых устройствах;
- случайные ошибки памяти, вызванные космическими лучами.
и так далее, чтобы сгенерировать фразу восстановления, во многом подобно подбрасыванию монетки, где множество мешающих факторов просто не поддаются человеческому предсказанию. Процесс превращается в:
unpredictable physical noise → sample and digitize → condition and hash → seed a cryptographically secure PRNG → generate the recovery phrase
Даже если злоумышленник знает модель устройства, серийный номер, время загрузки и весь исходный код, он все равно не сможет восстановить в обратном порядке точную форму волны шума схемы в тот самый момент. Вот как выглядит по-настоящему надежная случайность.
Энтропия — мера случайности
Что такое энтропия?
Слово «энтропия» звучит сложно, но на практике всё просто: сколько возможных вариантов исхода существует до того, как результат будет раскрыт?
У обычной монеты два возможных исхода: орёл или решка. Одно подбрасывание даёт 1 бит энтропии, поскольку 2^1 = 2. Подбросьте её дважды, и появится четыре варианта: орёл-орёл, орёл-решка, решка-орёл и решка-решка, что составляет 2 бита энтропии, так как 2^2 = 4. Продолжая в том же духе, вы получите от 256 подбрасываний 2^256 различных исходов, что эквивалентно 256 битам случайности.
Но суть энтропии заключается не только в том, что результаты выглядят хаотично. Гораздо важнее то, что никто не может узнать результат заранее. Если монета подстроена так, что всегда падает орлом вверх, то даже 256 подбрасываний дадут нулевую энтропию, поскольку исход был предсказуем с самого начала.
Что, если вы не доверяете даже генератору истинно случайных чисел?
Если вы не доверяете и встроенному в ваш аппаратный кошелек генератору истинно случайных чисел, существует более базовый вариант: подбросьте монету и создайте случайность своими руками.
Записывайте орла как 0, а решку как 1, подбросьте монету 256 раз и фиксируйте каждый результат. В результате получится 256-битное двоичное число. Затем в полностью изолированной от интернета среде вычислите контрольную сумму для этого числа в соответствии со стандартом BIP-39 и преобразуйте её в 24 английских слова. Это и будет полноценная фраза восстановления.
flip a coin 256 times → record heads and tails → a 256-bit binary number → compute the BIP-39 checksum → 24 recovery words → import into a hardware wallet
Важное примечание: подбрасывание монет заменяет только этап «генерации случайного числа». Оно не может заменить аппаратный кошелек. Хранение кошелька, генерация адресов и подписание транзакций по-прежнему должны происходить внутри изолированной среды аппаратного кошелька. Подключенные устройства должны лишь отслеживать баланс и транслировать транзакции, и они никогда не должны соприкасаться с вашей фразой восстановления.
Не вводите результаты реальных подбрасываний монеты на веб-страницах и не придумывайте последовательности нулей и единиц просто потому, что они кажутся случайными. Только когда каждый отдельный результат действительно получен в результате непредсказуемого броска, эта цепочка цифр обладает настоящей случайностью.
Часто задаваемые вопросы
Нет. Сами устройства не взламывали. Ошибка в прошивке привела к тому, что фразы восстановления генерировались из гораздо меньшего пула возможных значений, поэтому злоумышленники могли подобрать их методом брутфорса вместо атаки на аппаратное обеспечение.
Масштаб последствий отличался в зависимости от модели. Около 40 бит случайности применимы в основном к Mk2 и Mk3; оценка для Mk4, Mk5 и Q составляет примерно 72 бита. Точный охват смотрите в официальных объявлениях Coinkite.
Программный генератор — это фиксированный алгоритм, получающий несколько начальных условий, таких как метка времени или серийный номер, поэтому любой, кто может угадать эти входные данные, может пересчитать его результат. Аппаратный генератор считывает непредсказуемый физический шум, такой как тепловой шум схемы или джиттер генератора, который невозможно пересчитать на основе публичной информации.
24-словная фраза BIP-39 подкреплена 256-битным случайным числом, что дает 2^256 вариантов — примерно 10^77, что близко к количеству элементарных частиц в наблюдаемой Вселенной.
Да. Записывайте орел как 0, а решку как 1, подбросьте монету 256 раз, затем вычислите контрольную сумму BIP-39 офлайн и конвертируйте результат в 24 слова. Подброс монет заменяет только этап случайности — хранение кошелька и подписание транзакций по-прежнему должны происходить внутри аппаратного кошелька, а результаты никогда нельзя вводить на подключенной веб-странице.






