Исследователи обнаружили несколько уязвимостей в библиотеке BitcoinJS, из-за которых Bitcoin-кошельки, созданные с помощью онлайн-сервисов десятилетие назад, могут оказаться уязвимы к взлому. Суть найденных багов в том, что секретные ключи от этих криптокошельков генерировались с гораздо большей предсказуемостью, чем того ожидали разработчики библиотеки.
Уязвимости Randstorm и их последствия
Теперь обо всем по порядку. Исследователи из компании Unciphered, занимающейся восстановлением доступа к криптокошелькам, обнаружили и описали ряд уязвимостей в JavaScript-библиотеке BitcoinJS, которую использовали многие криптовалютные онлайн-сервисы. Среди этих сервисов есть и весьма популярные — в частности, Blockchain.info, ныне известный как Blockchain.com. Обнаруженный набор уязвимостей исследователи назвали Randstorm.
Несмотря на то что уязвимости в самой библиотеке BitcoinJS были устранены еще в 2014 году, проблема распространяется на результаты работы этой библиотеки: созданные с ее помощью в начале 2010-х годов криптокошельки могут быть небезопасны — в том смысле, что подобрать секретные ключи к ним куда проще, чем предполагает лежащая в основе Bitcoin криптография.
По оценкам исследователей, из-за Randstorm потенциально уязвимы несколько миллионов кошельков, в которых суммарно хранится около 1,4 миллиона биткойнов. Среди потенциально уязвимых, по оценке исследователей, действительно уязвимы для реальных атак 3–5% кошельков. Исходя из примерного курса биткойна в районе $36 500 на момент публикации поста, можно предположить суммарную добычу 1,5–2,5 миллиарда долларов для тех взломщиков, которые смогут разработать методику успешной эксплуатации Randstorm.
Исследователи утверждают, что уязвимости Randstorm на деле можно использовать для практической атаки на криптокошельки. Более того, они успешно воспользовались этими уязвимостями для восстановления доступа к нескольким криптокошелькам, созданным на сервисе Blockchain.info до марта 2012 года. Из этических соображений они не стали публиковать доказательство осуществимости атаки (proof-of-concept), поскольку это подвергло бы собственность десятков тысяч владельцев криптокошельков прямой угрозе кражи.
Исследователи уже связались с теми криптовалютными онлайн-сервисами, о которых известно, что они использовали уязвимые версии библиотеки BitcoinJS. В свою очередь, эти сервисы направили предупреждения тем своим клиентам, которые потенциально могут пострадать от Randstorm.
В чем суть уязвимостей Randstorm
Поговорим подробнее о том, как именно работают эти уязвимости. В основе безопасности Bitcoin-кошелька лежит секретный ключ. Как и любая современная криптографическая система, Bitcoin полагается на то, что этот ключ будет оставаться тайным и его будет невозможно подобрать. Для этого, опять-таки, как и в любой современной криптографической системе, используются очень длинные случайные числа.
При этом для безопасности любых данных, защищенных секретным ключом, крайне важно, чтобы он был как можно более случайным. Высокая предсказуемость числа, использованного в качестве ключа, позволяет быстрее и проще подобрать ключ на основе известной информации о процедуре его генерации.
При этом надо иметь в виду, что получение действительно случайных чисел — дело крайне непростое. И компьютеры, вообще говоря, крайне плохо для него пригодны — они по своей природе слишком предсказуемы. Поэтому речь обычно идет о псевдослучайных числах, а для увеличения энтропии генерации — так в криптографии называют меру непредсказуемости — полагаются на специальные функции.
Теперь вернемся к библиотеке BitcoinJS. Для получения «качественных» псевдослучайных чисел эта библиотека задействует другую JavaScript-библиотеку под названием JSBN (JavaScript Big Number) и, в частности, содержащуюся в ней функцию SecureRandom. Она как раз и предназначена для генерации псевдослучайных чисел, пригодных для использования в криптографии. А для увеличения их энтропии SecureRandom полагается на функцию браузера window.crypto.random.
Проблема в том, что, хотя функция window.crypto.random и существовала в браузерах линейки Netscape Navigator 4.x, эти браузеры ко времени начала активного использования веб-сервисами библиотеки BitcoinJS были уже не актуальны. А в популярных на тот момент браузерах — Internet Explorer, Google Chrome, Mozilla Firefox и Apple Safari — функция window.crypto.random просто не была реализована.
К сожалению, разработчики библиотеки JSBN забыли предусмотреть на такой случай какую-либо проверку и соответствующее сообщение об ошибке. В результате функция SecureRandom молча пропускала стадию увеличения энтропии, так что, по сути, для создания секретных ключей использовался стандартный генератор псевдослучайных чисел — Math.random.
Это плохо уже само по себе, поскольку Math.random непригоден для использования в криптографических целях. Но ситуацию дополнительно омрачает тот факт, что в реализации функции Math.random в популярных браузерах 2011–2015 годов — в особенности в Google Chrome — были баги, из-за которых они генерировали даже менее случайные числа, чем должны были.
В свою очередь, библиотека BitcoinJS унаследовала от JSBN все описанные выше проблемы. Поэтому использовавшие ее сервисы при генерации секретных ключей для криптокошельков получали от функции SecureRandom куда менее случайные числа, чем, очевидно, ожидали разработчики библиотеки. А поскольку эти ключи сгенерированы с большой предсказуемостью, их значительно проще подобрать, получив таким образом контроль над уязвимым криптокошельком.
Как уже было сказано выше, это не теоретическая опасность, а вполне практический риск — команде Unciphered удалось использовать описанные уязвимости для восстановления доступа (то есть, по сути, этичного взлома) к нескольким старым криптокошелькам, созданным на Blockchain.info.
Кому угрожают уязвимости Randstorm
BitcoinJS использовала уязвимую библиотеку JSBN с момента своего появления в 2011 году и до 2014 года. Однако следует иметь в виду, что те или иные криптовалютные проекты еще какое-то время могли использовать не самые свежие версии библиотеки. Что касается тех багов, которые влияли на качество работы функции Math.random в популярных браузерах, то к 2016 году они были устранены сменой алгоритмов генерации псевдослучайных чисел. Вместе это дает примерный временной промежуток создания потенциально уязвимых криптокошельков — с 2011 по 2015 год.
Исследователи подчеркивают, что BitcoinJS была крайне популярной библиотекой в начале 2010-х, и достаточно сложно установить полный список сервисов, которые могли использовать ее уязвимые версии. В своем отчете они делятся списком тех проектов, которые они смогли обнаружить:
- BitAddress — до сих пор работает.
- BitCore (проект BitPay) — до сих пор работает.
- Bitgo — до сих пор работает.
- Blockchain.info — до сих пор работает, теперь Blockchain.com.
- Blocktrail — перенаправляет на
https://btc.com
илиhttps://blockchair.com
. - BrainWallet — мертв.
- CoinKite — теперь продает аппаратные криптокошельки.
- CoinPunk — мертв.
- Dark Wallet — перенаправляет на
https://crypto-engine.org
. - DecentralBank — мертв.
- Dogechain.info (проект Block.io) — до сих пор работает.
- EI8HT — мертв.
- GreenAddress — перенаправляет на
https://blockstream.com/green/
. - QuickCon — мертв.
- Robocoin — мертв.
- Skyhook ATM — перенаправляет на
https://yuan-pay-group.net
.
Помимо Bitcoin-кошельков, под угрозой могут быть и кошельки Litecoin, Zcash и Dogecoin, поскольку для этих валют также существуют JavaScript-библиотеки, основанные на BitcoinJS. Легко предположить, что они также могли быть использованы для создания секретных ключей кошельков соответствующих криптовалют.
В отчете Unciphered описана еще целая масса нюансов, связанных с Randstorm. В целом все сводится к тому, что из-за различных обстоятельств разные кошельки, созданные в период с 2011 по 2015 год с использованием уязвимой библиотеки, могут быть в разной степени уязвимы.
Как защититься от Randstorm?
Как справедливо указывают сами исследователи, это тот случай, когда мало исправить уязвимость в программном обеспечении: невозможно «пропатчить» секретные ключи от криптокошельков пользователей, заменив их на безопасные. Поэтому, несмотря на то что баги давно устранены, они продолжают влиять на криптокошельки, созданные в тот период времени, когда в библиотеке BitcoinJS существовали описанные в этом посте ошибки. Защищаться в данном случае необходимо самим владельцам уязвимых кошельков.
Поскольку затруднительно установить полный список тех криптовалютных сервисов, которые использовали уязвимую библиотеку, разумно будет перестраховаться и считать все криптокошельки, созданные онлайн в период с 2011 по 2015 год, потенциально небезопасными (если доподлинно не известно обратное). В первую очередь под угрозой взлома, конечно же, те кошельки, в которых содержатся суммы, достаточно крупные, чтобы заинтересовать взломщиков.
Очевидное, оно же единственно возможное решение проблемы — создание новых криптокошельков и перевод в них всех средств из потенциально уязвимых кошельков.
Ну и раз уж все равно придется этим заниматься, есть смысл на этот раз подойти к вопросу с максимальной осторожностью. Защита крипты — процесс многоступенчатый, и мы собрали для вас исчерпывающий чек-лист с массой дополнительной информации по ссылкам:
- Подробно изучите основные угрозы и способы защиты криптоинвестиций.
- Разберитесь, чем отличаются горячие и холодные криптокошельки и какие методы атаки на них наиболее характерны.
- Используйте аппаратный (холодный) кошелек для долгосрочного хранения основных криптоактивов и горячий кошелек с минимумом средств для повседневных расчетов.
- Установите на все ваши устройства надежную защиту, которая не даст проникнуть на компьютер или смартфон трояну, ворующему пароли и секретные ключи, или клипперу, подменяющему адреса криптокошельков в буфере обмена, а также защитит ваш компьютер от мошеннических криптомайнеров и несанкционированного удаленного доступа.
- Ни в коем случае не храните в смартфоне фотографию вашей сид-фразы или ее скриншот, не выкладывайте сид-фразу в публичные «облака», не отправляйте через мессенджеры или по электронной почте, не вводите ее никуда и никогда, за исключением процедуры восстановления утраченного секретного (приватного) ключа.
- Обеспечьте надежное хранение секретного ключа и сид-фразы, которая позволяет восстановить ключ. Для этого подойдет защищенное хранилище «Личные документы» в Kaspersky Premium, шифрующее все хранящиеся данные с использованием AES-256. Пароль для доступа к хранилищу не хранится нигде, кроме вашей головы (если вы его, конечно, не приклеили на стикере к монитору), восстановить его невозможно, поэтому получить доступ к вашим личным документам сможете только вы.
- Еще один вариант — вообще не использовать сид-фразы для бэкапа приватного ключа. Так работает аппаратный кошелек Tangem. Кстати, сейчас при покупке подписки Kaspersky Premium вы получите промокод на дополнительную скидку на Tangem, и такой набор может стать прекрасным новогодним подарком для любого владельца крипты.