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

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


Многие криптокошельки, созданные ещё в 2011–2015 годах, оказались небезопасны. Исследователи обнаружили уязвимости в библиотеке BitcoinJS, через которую генерировались секретные ключи для их защиты. Подобрать их оказалось проще, чем рассчитывали разработчики — из-за этого криптокошельки стало легче взломать.   

Валерий Зубанов, управляющий директор «Лаборатории Касперского» в Казахстане, Центральной Азии и Монголии, рассказывает в блоге об уязвимостях в криптокошельках. 

Что выяснили исследователи: кратко

Специалисты из компании Unciphered (занимается восстановлением доступа к криптокошелькам) обнаружили несколько уязвимостей в JavaScript-библиотеке BitcoinJS. Они получили название Randstorm. Эту библиотеку использовали многие криптовалютные онлайн-сервисы, чтобы генерировать секретные ключи шифрования для кошельков. Среди них — популярная платформа Blockchain.com, ранее известная как Blockchain.info. 

В самой библиотеке эти уязвимости уже давно исправили — ещё в 2014 году. Однако криптокошельки, при создании которых использовались старые версии BitcoinJS, остались небезопасными. Под угрозой потенциально оказались несколько миллионов криптокошельков, на которых в сумме хранится около 1,4 миллиона биткойнов (курс биткойна на момент написания статьи — примерно $37 000). По оценке специалистов, из них уязвимы для реальных атак 3–5%. Причём риски совсем не теоретические: команде Unciphered удалось использовать найденные уязвимости, чтобы восстановить доступ (а по сути — взломать) несколько старых криптокошельков, созданных на платформе Blockchain.info.

В чём суть уязвимостей

Для безопасности Bitcoin-кошельков используются секретные ключи шифрования — длинные случайные числа, которые в идеале невозможно подобрать. Получить абсолютно непредсказуемую комбинацию сложно, поэтому в данном случае речь идёт скорее о псевдослучайных числах. 

Для генерации секретных ключей криптовалютные сервисы использовали библиотеку BitcoinJS. Она в свою очередь задействовала другую библиотеку — JavaScript Big Number (JSBN). А именно — функцию SecureRandom, которая как раз и отвечает за генерацию псевдослучайных чисел. Чтобы увеличить их энтропию, или степень непредсказуемости, она использует функцию браузера window.crypto.random. 

Проблема в том, что когда библиотекой BitcoinJS начали активно пользоваться (она появилась в 2011 году), в популярных на тот момент браузерах функция window.crypto.random ещё не была реализована. Это Internet Explorer, Google Chrome, Mozilla Firefox и Apple Safari. Разработчики JSBN этого не предусмотрели — проверки не было, и в случае ошибки не приходило никакого уведомления. В результате функция SecureRandom просто пропускала стадию увеличения энтропии. Для создания ключей, по сути, использовался стандартный генератор — Math.random, который не подходит для шифрования. Ситуацию осложняло то, что в браузерах были баги, из-за которых полученные числа были ещё менее случайными. В результате криптокошельки, для защиты которых они использовались, оказались уязвимыми. 

BitcoinJS использовала уязвимую библиотеку JSBN с момента своего появления в 2011 году и до 2014 года. При этом некоторые криптовалютные сервисы могли использовать старые версии ещё какое-то время. Баги, которые влияли на работу функции Math.random, были устранены к 2016 году. Поэтому под потенциальной угрозой оказались криптокошельки, созданные примерно с 2011 по 2015 год. Причём это касается не только кошельков для валюты Bitcoin, но и Litecoin, Zcash и Dogecoin: для них тоже существуют JavaScript-библиотеки, основанные на BitcoinJS. 

Как защититься

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

1.     С осторожностью пользоваться криптокошельками, созданными с 2011 по 2015 год — это может быть потенциально опасно. Под особой угрозой те из них, на которых записаны крупные суммы денег — они особенно привлекательны для злоумышленников. 

2.     Внимательно изучить материалы о рисках кибербезопасности, с которыми можно столкнуться в сфере криптоинвестиций. В частности, изучить, какие бывают типы кошельков (холодные и горячие), и какие методы атак для них характерны; 

3.     Если есть возможность, лучше завести новый, более безопасный криптокошелёк и перевести на него свои активы, чтобы снизить риски. 

4.     Не хранить секретный ключ или сид-фразу (позволяет восстановить доступ к криптокошельку, если утерян секретный ключ) на скриншотах или в заметках на телефоне, на бумаге или любом другом месте, к которому легко получить доступ; лучше всего использовать для этого специальные хранилища, в которых данные надёжно шифруются. 

5.     Использовать защитное решение, которое защитит от проникновения вредоносного ПО, в том числе троянов, которые умеют перехватывать секретные ключи и пароли.