Randstorm / BitcoinJS
Randstorm: уязвимость браузера, стоящая за старыми биткоин-кошельками
Какое программное обеспечение задокументировано, какие версии имеют значение и как покинуть старый кошелёк, не перенося с собой его уязвимые ключи.
Содержание
Что именно пошло не так
Randstorm касается генерации ключей в старом браузерном ПО. SecureRandom() из JSBN мог объединять недостаточный источник энтропии с предсказуемым Math.random() браузера. Unciphered опубликовал проблему 14 ноября 2023 года и сообщил о уязвимых кошельках, созданных в 2011–2015 годах. Это наблюдаемый период, а не приговор для каждого кошелька из тех лет.
Название SecureRandom не является гарантией безопасности. В исходниках Coinpunk, которые были проверены, запасной вариант заполняет 256-байтовый пул с помощью Math.random(), смешивает с часами и питает генератор Arcfour. Большой пул не может обеспечить непредсказуемость, которой нет во входных данных. В том же исходном коде есть более надёжные пути Web Crypto и Node.js: важное отличие — достижение запасного варианта.
Это дефект в способе выбора приватного ключа. Это не нарушение проверки подписи Bitcoin. Открытие старой резервной копии в новом приложении сохраняет эти ключи; перевод средств на ключи, сгенерированные независимо, меняет авторизацию расходования.
Кошельки, версии и пределы доказательств
Версию библиотеки читайте отдельно от версии кошелька. Для размещённого сайта важнее код, обслуживаемый в день создания ключа, чем версия приложения сегодня. Таблица различает задокументированный инцидент и находки в исходном коде.
| Проект | Версия или период | Что это устанавливает |
|---|---|---|
| BitcoinJS / bitcoinjs-lib | 0.1.3 | Назван в качестве примера в раскрытии. JSBN использовался до марта 2014; это не устанавливает полный диапазон затронутых версий для всех производных. |
| Blockchain.info Blockchain.com | Исторический веб-кошелёк; не подтверждён нумерованный диапазон затронутых версий | Исходной точкой расследования Unciphered стал кошелёк клиента. Это не обвиняет каждый кошелёк Blockchain.com или текущее приложение. |
| bitaddress.org | 2.6.5 · 2.8.0 2013-12-01 · 2014-01-18 | 2.6.5 обновил JSBN до 1.4. 2.8.0 добавил инициализацию Web Crypto для всего пула и обязательную энтропию мыши/клавиатуры. Это задокументированные изменения, а не доказанная граница «все более ранние версии уязвимы / все более поздние безопасны». |
| Coinpunk | 0.2.1 63ca325be538 | Проверенный снимок репозитория маркирует себя как 0.2.1 и содержит запасной вариант Math.random()/Arcfour наряду с более сильными путями. Это находка в коде, а не доказательство, что каждое развертывание использовало запасной вариант. Разработка прекращена. |
Этот обзор охватывает проверенные здесь реализации; это не исчерпывающий список затронутых кошельков. Неуказанный продукт не является автоматически не затронутым. Старая дата создания или адрес, начинающийся с 1, недостаточны для идентификации генератора.
Подготовьте пункт назначения один раз
Три приведённых ниже маршрута используют новый Electrum Desktop кошелёк в качестве пункта назначения. Названия меню относятся к английскому интерфейсу версии 4.8.2 для настольных ПК, проверенному для этой статьи. Скачайте текущий релиз с официального сайта; 4.8.2 — это справочная версия для инструкций, а не постоянная минимальная версия.
Аппаратные кошельки, которые мы рекомендуем как новое место назначения →
Electrum — официальная загрузка и проверка подписи ↗
- На доверенном, обновлённом компьютере скачайте Electrum для вашей операционной системы. Следуйте официальным инструкциям по подписи и независимо проверьте отпечаток подписанта перед установкой.
- Выберите File → New/Restore, назовите кошелёк randstorm-new, затем выберите Standard wallet → Create a new seed. Запишите и подтвердите новые слова на бумаге и установите пароль для файла кошелька. Не импортируйте старый секрет.
- Перед внесением средств создайте recovery-check через File → New/Restore → Standard wallet → I already have a seed, используя только НОВУЮ бумажную резервную копию. Сравните первый адрес для приёма в обоих кошельках через View → Addresses и вкладку Addresses. Держите оба кошелька во время этой проверки.
- В randstorm-new используйте Receive → Request (Onchain, если включён Lightning). Скопируйте биткоин-адрес. Приведённый ниже маршрут для конкретного кошелька должен отправлять на этот адрес, с проверкой комиссии и полного пункта назначения перед подтверждением.
Blockchain.info: используйте кошелёк, содержащий старые адреса
Этот маршрут предназначен для исторического кошелька Blockchain.info, к которому вы всё ещё можете получить доступ через Blockchain.com. Текущие инструкции по отправке описывают сегодняшний веб-интерфейс, а не непроверенный экран 2012 года. Баланс торгового счёта — это другой продукт.
- Сохраните оригинальную зашифрованную резервную копию и записи входа. В веб-кошельке проверьте Settings → Wallets & Addresses → Bitcoin на наличие отдельно импортированных адресов. Сопоставьте известные старые публичные адреса с отображаемыми остатками; новую фразу восстановления нельзя считать покрывающей импортированные ключи.
- Откройте Send на панели кошелька, выберите Bitcoin и введите новый адрес Electrum как внешний пункт назначения. Начните с небольшой суммы, выберите Continue, проверьте адрес, сумму и комиссию, затем Send.
- Дождитесь подтверждения в History Electrum. Затем отправьте оставшийся доступный баланс с учётом комиссии. Проверьте каждый отдельно финансируемый импортированный адрес; успешный тест сам по себе не опустошает старый кошелёк. Прекратите использовать все устаревшие адреса для приёма.
bitaddress.org: перенос бумажного кошелька с помощью Sweep
Печатная версия bitaddress обычно представляет один ключ, а не современную фразу восстановления. Сохраните бумагу и любой оригинальный HTML-файл: имя файла или нижний колонтитул могут идентифицировать релиз. История версий помогает восстановить настройку; она не сертифицирует отдельный ключ.
- Определите приватный ключ, а не публичный адрес для приёма. WIF для основной сети обычно начинается с 5, K или L; зашифрованный BIP38 ключ начинается с 6P. Префикс — лишь подсказка формата. Сохраняйте исходную форму сжатия, так как она определяет соответствующий адрес.
- Для BIP38 сначала расшифруйте локально и офлайн с помощью проверенной копии из официального репозитория bitaddress: Wallet Details → введите зашифрованный ключ → View Details → введите пароль → Decrypt BIP38. Сравните полученный адрес с бумажным перед использованием соответствующего WIF. Никогда не вводите ключ на живом сайте и не создавайте заменяющий кошелёк с помощью этого старого инструмента.
- В НОВОМ кошельке Electrum откройте Wallet → Private keys → Sweep. Введите незашифрованный WIF только в этом локальном диалоге. Проверьте, что пункт назначения принадлежит randstorm-new, затем проверьте транзакцию и комиссию перед отправкой.
- Sweep переводит доступный баланс, контролируемый предоставленным ключом, одной транзакцией. Это не импорт и не небольшая тестовая последовательность выше. Повторите для других финансируемых ключей бумажного кошелька и сохраните оригиналы до подтверждения всех ожидаемых поступлений.
bitaddress.org — официальный репозиторий и подписанные файлы ↗
Coinpunk: обезопасьте резервную копию перед работой со старым сервером
Coinpunk был самостоятельным хостингом, поэтому нет универсального текущего сайта входа или сервиса восстановления. Эти метки взяты из снимка репозитория 63ca325be538, чей package.json объявляет версию 0.2.1. Модифицированное развертывание может отличаться.
- Если ваша оригинальная доверенная установка ещё работает, откройте Backup → Download и сохраните несколько копий зашифрованного кошелька. Сохраните также идентификатор входа, пароль и резервную копию сервера. Не обновляйте и не переустанавливайте единственный сохранившийся экземпляр сначала.
- Историческая форма Send Bitcoins содержит Bitcoin address to send to, Amount и отображаемую комиссию. Используйте её только если оригинальный экземпляр работает надёжно и поддерживает адрес назначения. Не заставляйте bc1-адрес работать в этом старом ПО; проверенный парсер адресов использует Base58Check.
- Для несовместимого пункта назначения или офлайн-сервера сохраните резервную копию и восстановите ключи локально с помощью специалистов, понимающих эту версию Coinpunk. Модель кошелька хранит keyPairs, включая ключи сдачи, внутри зашифрованной полезной нагрузки. Это не seed Electrum и не wallet.dat Bitcoin Core; переименование файла не конвертирует его.
- После сопоставления восстановленных ключей WIF с оригинальными адресами используйте процедуру Sweep Electrum выше для каждого финансируемого ключа. Проверьте полный набор, включая адреса сдачи. Храните зашифрованную резервную копию и пароль до тех пор, пока поступления на пункт назначения не совпадут с ожидаемым балансом.
Аппаратные кошельки, которые мы рекомендуем как новое место назначения
Для этой миграции мы рекомендуем Trezor Safe 3, если вы предпочитаете физические кнопки, или Trezor Safe 5, если для вас важен больший сенсорный экран для проверки адресов. Оба могут хранить новые ключи подписи на отдельном устройстве. Покупка не исправляет старый ключ: создайте полностью новый кошелёк на устройстве.
Ссылки Amazon открывают региональный поиск товара, а не проверенный список продавцов. Проверьте продавца через официальные магазины Trezor на Amazon или авторизованных реселлеров. Используйте проверки аутентичности устройства при настройке; никогда не используйте поставляемую заранее записанную резервную копию кошелька.
- Начните с trezor.io/start и установите Trezor Suite. Следуйте устройственно-специфической настройке и проверкам аутентичности, выберите Create a new wallet и завершите проверку резервной копии на устройстве. Храните резервную копию офлайн. Не восстанавливайте старый кошелёк или seed программного кошелька из приведённого выше примера на этом устройстве.
- Для обычной отправки выберите аккаунт Bitcoin в Trezor Suite, выберите Receive и проверьте полный адрес на подключённом устройстве. Используйте этот адрес вместо адреса программного кошелька в маршруте Blockchain.com. Проверяйте поступление перевода и его подтверждения в Trezor Suite, а не в History приложения Electrum.
- Для маршрута Sweep Electrum подключите недавно настроенный Trezor и создайте кошелёк Electrum через File → New/Restore → Standard wallet → Use a hardware device. Следуйте руководству Trezor для Electrum и используйте соответствующий аккаунт Bitcoin и тип адреса. Проверьте адрес для приёма на Trezor, затем используйте его как пункт назначения для Sweep. Введите только СТАРЫЙ ключ WIF в Sweep; никогда не вводите слова резервной копии Trezor в Electrum или на сайт.
Источники и область
Это исследование охватывает исторические браузерные реализации и их разные маршруты миграции. Для более широкой связи между энтропией, seed-фразами и аппаратными кошельками продолжайте с фоновым материалом.
Фон: как возникают слабые seed-фразы кошельков →
- Unciphered — раскрытие Randstorm, 14 ноября 2023
- bitaddress.org — подписанная история версий
- Coinpunk — проверенный генератор случайных чисел и снимок репозитория · package.json · README
- Electrum — FAQ по восстановлению, Sweeping и приватности
- Electrum 4.8.2 — мастер настольного кошелька · Desktop menus
- Blockchain.com — импортированные биткоин-адреса
- bitaddress.org — реализация BIP38 и Wallet Details
- Coinpunk — модель зашифрованного кошелька и ключи сдачи · Backup · Send
- Trezor Safe 3
- Trezor Safe 5
- Trezor Suite — trezor.io/start
- Trezor — официальные магазины и авторизованные реселлеры
- Trezor — миграция с другого кошелька
- Trezor Suite — приём и проверка адреса
Проверено 19 сентября 2026 года по первичной документации и исходному коду. В тестах не использовались реальные средства или приватные ключи. Таблица не является исчерпывающим списком или диагнозом вашего кошелька.
Часто задаваемые вопросы
Определяет ли BitcoinJS 0.1.3 мою версию кошелька?
Нет. Он идентифицирует пример библиотеки, упомянутый в раскрытии Randstorm. Кошелёк может включать или модифицировать эту библиотеку без раскрытия её версии пользователю. Оригинальная сборка кошелька и среда браузера всё ещё требуют идентификации.
Доказывает ли bitaddress.org 2.8.0, что мой бумажный кошелёк безопасен?
Журнал изменений документирует усиленный сбор энтропии в 2.8.0. Он не сертифицирует, как был сгенерирован отдельный ключ, какие функции браузера были доступны или был ли файл изменён. Поэтому статья рассматривает это как задокументированное изменение, а не универсальную границу безопасности.
Почему маршрут бумажного кошелька использует Sweep вместо Import?
Import сохраняет использование оригинального приватного ключа. Sweep создаёт транзакцию, которая переводит расходуемые средства на подготовленный кошелёк назначения. Новый кошелёк должен иметь ключи, сгенерированные независимо, а пункт назначения и комиссия должны быть проверены перед отправкой.
Может ли Electrum открыть резервную копию Coinpunk напрямую?
Проверенная версия Coinpunk хранит зашифрованную полезную нагрузку кошелька, а не seed Electrum. Сохраните резервную копию, идентификатор входа и пароль. Восстановите ключи локально с учётом версии, затем сопоставьте их с оригинальными адресами перед использованием маршрута Sweep.