October 15, 2020

Почему они опасны: взлом BrainWallet

"Кошелёк в голове" — это старая концепция создания и управления приватным ключом, дающим доступ к Биткоинам. Его смысл в генерации необходимой информации из легко запоминаемого пароля или парольной фразы. BrainWallet не имеет ничего общего с правильным способом создания приватных ключей из случайного числа и с опциональным кодированием этого числа в 12 или 24 отдельных слова (seed-фраза), которые позволяют затем "собрать" исходное случайное число. Эти 12 или 24 слова называются мнемонической фразой, с которой любой пользователь Биткоина должен быть уже знаком. В этой статье мы покажем, почему использование BrainWallet является очень опасным действием и требует полного понимания деталей создания приватных ключей Биткоина. Также мы продемонстрируем как можно взломать BrainWallet.

Подбор seed-фразы онлайн

Правильно сгенерированный кошелёк Биткоин не так-то легко взломать даже обладая частичной информацией о seed-фразе. Весной Алистер Милн опубликовал интересный конкурс: желающий заполучить 1 биткоин должен был подобрать остаток сид-фразы из 12 слов. John Cantrell смог подобрать 4 слова примерно за 30 часов. История особенно хороша тем, что Джон подробно описал процесс подбора сид-фразы и выложил исходный код. Разработчик создал сначала простое локальное приложение, и очень быстро понял, что так решить задачу невозможно. Поэтому на следующем этапе он портировал приложение для вычислений на видеокартах и на последнем этапе создал клиент-серверную архитектуру для распределения работы по gpu кластеру. Цена вычислительной мощности для проведения атаки составила 350 долларов. История увлекательная — её нужно читать всю, поскольку Алистер публиковал по слову постепенно, увеличивая ставки, и снижая порог перебора. Разработчику приходилось делать реальный выбор на каждом из этапов, поскольку новое раскрытое слово могло привести к тому, что его неизвестный конкурент окажется быстрее. Задача не могла бы быть решена даже без пары слов из seed-фразы, сгенерированной в соответствии с BIP39.

"Call me Ishmael"

BitMex проделал важную работу: убедительно показал, что фраза, выбранная из художественной литературы, и хэшированная sha256, приведёт к утрате ваших биткоинов в доли секунд. Данная работа упрощала некоторые аспекты генерации кошелька, но в целом верно отражает опасности наивного использования BrainWallet. В случае keybase.io/warp парольная фраза пропускается через специальную хэш-функцию scrypt(password, salt), с использованием электронной-почты в качестве "соли", т.е. произвольного числа, затрудняющего подбор пароля и далее результат scrypt комбинируется исключающим "или" (XOR) с функцией вывода ключа на основе пароля PBKDF2(password, salt).

Подробнее о самостоятельной генерации BrainWallet можно прочесть здесь. Warp генерирует BrainWallet, которые должны быть достаточно безопасными в течение небольшого отрезка времени. В конечном итоге их всё равно могут взломать теми же методами, которые опишем мы, или целенаправленной атакой. По этой ссылке можно увидеть пример ОПАСНОГО генератора, который выполняет хэширование с использованием sha256 предположительно как раз в целях взлома сгенерированного кошелька, после того, как информация о нём появится в блокчейне. Другими словами, как только на адрес будет совершена транзакция, атакующий в любой точке мира может начать работу по взлому слабого BrainWallet.

Инструменты

Это не афишируется, но на самом деле любой кошелёк Ethereum, созданный в клиенте geth имеет много общего с BrainWallet в Биткоине. Фактически, для его создания также используется пароль пользователя, но geth может использовать функции генерации приватного ключа из пароля Scrypt или PBKDF2-HMAC-SHA256. Кошельки, созданные с не высокими параметрами Scrypt легко взломать и любопытный человек может легко найти статьи о взломе. В качестве инструмента в этих статьях будет демонстрироваться hashcat. Это утилита, специально созданная для подбора паролей по "утёкшим" базам. Последние версии содержат также достаточно много функций релевантных криптовалютным кошелькам. Hashcat также поддерживает эллиптическую кривую Биткоина secp256k1.

   1410 | sha256($pass.$salt)                              | Raw Hash, Salted and/or Iterated
   1420 | sha256($salt.$pass)                              | Raw Hash, Salted and/or Iterated
   1430 | sha256(utf16le($pass).$salt)                     | Raw Hash, Salted and/or Iterated
   1440 | sha256($salt.utf16le($pass))                     | Raw Hash, Salted and/or Iterated
   1710 | sha512($pass.$salt)                              | Raw Hash, Salted and/or Iterated
   1720 | sha512($salt.$pass)                              | Raw Hash, Salted and/or Iterated
   1730 | sha512(utf16le($pass).$salt)                     | Raw Hash, Salted and/or Iterated
   1740 | sha512($salt.utf16le($pass))                     | Raw Hash, Salted and/or Iterated
...
   11300 | Bitcoin/Litecoin wallet.dat                      | Password Managers
   12700 | Blockchain, My Wallet                            | Password Managers
   15200 | Blockchain, My Wallet, V2                        | Password Managers
   16600 | Electrum Wallet (Salt-Type 1-3)                  | Password Managers
   15600 | Ethereum Wallet, PBKDF2-HMAC-SHA256              | Password Managers
   15700 | Ethereum Wallet, SCRYPT                          | Password Managers
   16300 | Ethereum Pre-Sale Wallet, PBKDF2-HMAC-SHA256     | Password Managers

Мы бы использовали hashcat для подбора паролей к зашифрованным кошелькам и ключам Ethereum, если бы удалось "настроить" для жертвы Scrypt с более низкими параметрами. В нашем случае более подходяей будет специально разработанная программа brainflyer. По словарю BIP39 она находит один из паролей в примере репозитория за миллисекунды

21c81a7464652486531625108df9b5728fb10110:u:sha256:monkey
 rate:  61769.14 p/s found:     1/2048       elapsed:    0.033 s

Если мы скачаем MobyDick и немного упростим себе задачу, выделив Call me Ishmael в однй строку, то фраза BitMex будет найдена примерно за 0.1 секунд.

385b26329a3993e1b7475a95c98275127ba7c4b9:u:sha256:Call me Ishmael
0b20b50fd82888e8ac8c883ddf36486299366b3c:c:sha256:Call me Ishmael
 rate:  98089.62 p/s found:     2/15606      elapsed:    0.159 s

Описанные случаи на самом деле не так интересны, хоть и показывают реальную возможность очень быстро перебрать и хэшировать 15 тысяч строк. Поэтому более интересную задачу мы поставим чуть позже.

Здесь же в инструментах упомянем огромный массив утёкших баз данных паролей со всех мыслимых ресурсов. SecList позволяет задать на входе миллиарды паролей и если неискушённый пользователь BrainWallet хоть где-то задал такой же пароль, как и при создании кошелька, и он был во взломанном сервисе, то он больше не увидит своих биткоинов. Кроме того, кто-то другой мог создать "похожий" пароль, исследователи давно показали, что пользователи не уникальны в выборе паролей, они выбирают одинаковые пароли, и они иногда выбирают похожие правила изменения паролей для разных сайтов. Такие атаки, называемые атака по словарю на основании правила также возможны и реальны с помощью GPU. Мы будем делать демонстрацию с использованием ноутбука.

Стоит обратить внимание на репозиторий break-short. Это специальная программа для подбора слабых ключей. Другими словами, если ключи Биткоина были сгенерированы заведомо на более узком отрезке "случайных чисел", или генератор имел изъян, эта программа может быть использована для поиска приватных ключей.

XKCD или слова BIP39 для BrainWallet

В BIP39 мы имеем английских 2048 слов, которые должны кодировать случайное число. Формализуем задачу так, чтобы не рассматривать огромный произвольный корпус мировой художественной литературы. Это не является нереалистичной задачей, наоборот, интересная тема для написания программы, просто нам нужны простые численные оценки сложности для демонстрации. Положим, Алисе нужно пересечь границу государства без телефона или каких-либо устройств, которые могут досматривать. Она захотела "сэкономить" за запоминании слов мнемоники и воспользовалась рекомендациями XKCD по выбору пароля для создания BrainWallet. Таким же образом мы можем оценить безопасность выбора пароля на основе английского словаря BIP39, который Алиса могла бы использовать для какого-нибудь сайта.

Мы имеем в виду этот комикс
  • Для сочетания по 3 слова из множества 2048 мы имеем 1429559296 вариантов.
  • Для сочетания по 4 слова из множества 2048 мы имеем 730862190080 вариантов.

Комбинацию по 4 слова невозможно реализовать наивными методами, поскольку генерация словаря для такого подбора требует большого количества свободного места. Например последняя комбинация achieve erase evolve slim соответствует заполнению текстового файла в 600 Гб. Не форматированный "Моби Дик", который равен порядка 15 000 строк, вполне реалистично может быть переформатирован в произвольные словари, пусть это будет от 1 слова до полного предложения. В то время как исчерпывающие комбинации 2 из 2048 слов уже равны 2096128 строк, т.е. пользование публично доступным словарём уже может затруднить подбор пароля.

Сколько времени нужно brainflayer, чтобы перебрать все сочетания по 3 слова из 2048 слов? На обычном ноутбуке он способен подбирать порядка 90 000 паролей в секунду. Это даёт ориентировочно 265 минут на перебор всего словаря.

 rate:  89982.34 p/s found:     0/849346560  elapsed: 11509.151 s

Для реального теста мы приготовили случайным образом выбранные комбинации:

draw level reward
crucial curve senior
best essay thumb
Сформировали фильтры для сжатых и не сжатых ключей:

[*] Initializing bloom filter...
[*] Loading hash160s from 'test.hex'  100.0%
[*] Loaded 6 hashes, false positive rate: ~8.403e-152 (1 in ~1.190e+151)
[*] Writing bloom filter to 'test.blf'...
[+] Success!

Запустили перебор по всему словарю. Два пароля были найдены меньше чем за максимальное время перебора:

rate:  65305.65 p/s found:     2/402128896  elapsed: 8036.260 s

Три пароля потребовали ещё примерно такое же количество времени (в списке хэшей было 6 хэшей для трёх паролей, для ключей в сжатом и не сжатом виде).

59172ba774b7db8cee9d158d287d1ec2ce992a7e:u:sha256:best essay thumb
d6b02c78640ca0829090a625f95758f491517397:c:sha256:best essay thumb
0a34d1f884d5d58d269a6ef4a3a7c863eaa2569b:u:sha256:crucial curve senior
b8f2135bf91df3930eb38ad7b9ae8ee11a9253d1:c:sha256:crucial curve senior
d2eedb6b434256b7b0bd3c32390c72317e0c280f:u:sha256:draw level reward
a4fadbe2839b7e030fbd166eaeb0ef3f0be4574c:c:sha256:draw level reward
rate:  63875.25 p/s found:     6/988282880  elapsed: 19154.475 s

Заключение

Нельзя сказать, что использование BrainWallet является однозначно ошибочной практикой. Но можно уверенно заключить, что это один из самых опасных способов хранить биткоины. Любой из доступных кошельков либо имеет историю использования и разработки, и люди так или иначе доверяют разработчикам и магазинам приложений, либо требует особой подготовки. Ультраконсервативный путь состоит в настройке узла Биткоина и использовании кошелька Bitcoin Core, максимально удобный заключается в изучении обзоров и установке хороших кошельков на мобильный телефон. BrainWallet является чемпионом по простоте создания и использования, а также соответствует модели безопасности, когда дубликаты и бэкапы могут дискредитировать пользователя. Мы надеемся, что после прочтения этой статьи пользователи будут осведомлены о деталях создания BrainWallet и если у них возникнет необходимость в генерации такого кошелька, они смогут это сделать правильно.

Поддержите автора!

Шлите ваши сатоши, используя эту LNURL ссылку

LNURL1DP68GURN8GHJ7MRWW3UXYMM59E3XJEMNW4HZU7RE0GHKCMN4WFKZ7URP0YLH2UM9WFHXZMT9843NXUPSWFESSLK458

Используя страничку, либо просто пользователю @c3p0rs через @lntxbot.

Если вы ещё не знаете как использовать сатоши в Лайтнинг сети, прочитайте руководство для кошелька BLW или исследуйте Телеграм-бот @lntxbot.


C публикацией статьи мы закрываем контракт на https://features.etleneum.com/hypecoinnews . Спасибо всем, кто голосовал за тему своими сатоши!