Уязвимость Генератора Псевдослучайных Чисел Биткойн

Приватные биткойн-ключи представляют собой целое число от 1 до 115792089237316195423570985008687907852837564279074904382605163141518161494337 или в шестнадцатеричном формате от 1 до 0xfffffffffffffffffffffffffffebaaedce6af4. 8a03bbfd25e8cd0364141. В основной сети Биткойн есть адреса, начинающиеся с 1: сжатый, несжатый; адреса с 3: SigScript и обратно совместимые с SegWit, а также собственные адреса SegWit, начинающиеся с bc1. Кроме того, уже существует около семидесяти форков, имеющих разные префиксы, но те же корни, что и у основного Биткойна.

Биткойн-адреса рассчитываются с помощью функции криптографической подписи ECDSA ( ) на основе эллиптической кривой.

Итак, давайте рассмотрим создание биткойн-адреса из закрытого ключа.

Закрытый ключ d - номер Открытый ключ Q — это точка на эллиптической кривой, равная dG, где G — базовая точка кривой.

  • Для подписи выбирается случайное число k в диапазоне [1, n-1].

  • Точка кривой (x1,y1) = k*G рассчитывается
  • Вычислите r = x1 mod N, где N — порядок кривой.

  • Вычислите s = k-1(H(m)+rd) mod N, где k-1 — обратный mod N числа k.
  • H(m) — хэш подписываемого сообщения.



Уязвимость генератора псевдослучайных чисел Биткойн

Подпись представляет собой пару (r,s).

Переменная «k» является случайной и получается в алгоритме ECDSA из стандартных библиотек операционной системы.

Таким образом, во всей функции можно воздействовать только на эту переменную.

Что дает два вектора атаки:

  1. встроенная уязвимость в псевдослучайном числе
  2. и универсальная удача, в которой случайное число появляется дважды


Атака на генератор псевдослучайных чисел

Нильс Шнайдер первым исследовал и опубликовал эту проблему 28 января 2013 года на своей личной странице.

Но проблема сохранилась и, более того, приобрела новый масштаб.

Программные атаки на PRNG делятся на три типа: Прямая криптографическая атака, основанная на анализе выходных данных алгоритма.

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

Сюда же относятся закладки в программном обеспечении, в которых создатель алгоритма знает любое из хешированных псевдослучайных чисел и последующие в цепочке.

Такой алгоритм сложно определить снаружи, поскольку числа кажутся равномерно распределенными по всему диапазону.

К уязвимостям программного обеспечения также относится слабая генерация псевдослучайных чисел в некоторых библиотеках.

Такие как SSL, OpenSSL, некоторые Java-библиотеки, JavaScript и т.д. Подробные материалы неоднократно описывались в периодике по хакерству и со временем стали примерами в учебниках по криптографии.



Каков масштаб угрозы для Биткойна?

Имея полноценный биткойн-узел, вы можете сравнивать и группировать все транзакции в сети.

Достаточно сравнить переменную «k» во всех транзакциях для каждого адреса и найти дубликаты.

Первый раз сверку мы делали в конце 2016 года, тогда база насчитывала более 210 миллионов адресов, транзакций общим количеством более 170 миллионов адресов и 447 миллионов подписей.

Сканирование уязвимых адресов в десять потоков заняло неделю.

В результате было найдено 1327 уязвимых адресов с одинаковыми сигнатурами! Список адресов можно найти в конце статьи.

Это значит, что для этих адресов можно вычислить приватный ключ, а значит получить контроль над деньгами.

Самая крупная утечка произошла летом 2015 года.

JavaScript кошелька Blockchain.info в течение нескольких часов выдавал одно и то же значение переменной «k».

Что привело к краже около 200 биткойнов! Если убрать человеческий фактор из уязвимостей ПО, вероятность совпадения составляет примерно 0,000296868%.

Совсем немного, но мне бы очень не хотелось стать таким «счастливчиком» и потерять свои деньги.



Как с этим справиться?

Как мы описали выше, эта уязвимость работает только при отправке платежей и генерации одной и той же переменной «K» как минимум в двух транзакциях.

Поэтому если не создавать исходящие транзакции или сократить их количество до минимума, то угрозы нет. Эта идея уже давно реализована в протоколе Биткойн BIP 32 (Иерархические детерминированные кошельки, HD-кошелек).

Его идея заключается в том, что используется закрытый ключ, из которого можно получить бесконечную цепочку адресов Биткойн.

Одноразовый адрес может использоваться для принятия каждой отдельной транзакции.

В этом случае сумма баланса HD-кошелька представляет собой сумму всех балансов в цепочке адресов.

И во время исходящей транзакции монеты собираются с этих адресов, совершая одну исходящую транзакцию для каждого биткойн-адреса.

Изменение будет отправлено на новый биткойн-адрес из цепочки адресов.

Такая схема работы существенно повышает безопасность и анонимность кошелька.

Ссылки: [1] ECDSA — Ошибки применения и реализации, Маркус Шмид, Калифорнийский университет в САНТА-БАРБАРЕ, CS 290G, ОСЕНЬ 2015 г.

[2] Нильс Шнайдер: Восстановление закрытых ключей Биткойна с использованием слабых подписей из блокчейна, запись в блоге, 28 января 2013 г.

[3] Комбинированные атаки для восстановления закрытого ключа [4] Список уязвимых адресов и общий баланс Теги: #bitcoin #Криптовалюты #уязвимость #ECDSA #RNG #crypto #rng

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.