The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

JavaScript-приложения криптовалют, использующие SecureRandom(), могли генерировать уязвимые ключи

16.04.2018 18:55

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

Проблема затрагивает только ключи, сгенерированные при помощи JavaScript-приложений, в которых применяется старая версия библиотеки jsbn, выпущенная до 2013 года. Например, проблема зафиксирована в выпусках приложения BitAddress до 2013 года и bitcoinjs до 2014 года. Важно отметить, что в сети в JavaScript-реализациях криптовалют и в web-сервисах до сих пор встречается уязвимый старый код, например, при запросе jsbn на первом месте в выдаче Google выдаётся ссылка на форк репозитория jsbn на GitHub, который был ответвлён 7 лет назад (автор данного форка несколько дней назад удалил его).

Суть проблемы в том, что до появления Web Crypto API класс SecureRandom() пытался собрать энтропию при помощи API window.crypto (nsIDOMCrypto), предоставляющего доступ к CSPRNG, но из-за опечатки в функции сравнения версии браузера создавалась ситуация, при которой библиотека пыталась обратиться к window.crypto.random в браузере без его поддержки и без вывода ошибки откатывалась на использование ненадёжного математического генератора псевдослучайных чисел math.Random, который способен обеспечить всего 48 бит энтропии (в реальных конфигурациях выдаёт заметно меньше).

Трудоёмкость воссоздания закрытого ключа методом прямого перебора (brute force) для уязвимых ключей, созданных при уровне энтропии 48 бит, оценивается при наличии достаточно большой вычислительной мощности примерно в одну неделю работы. Поэтому всем пользователям, использующим подверженные уязвимости адреса криптовалют, рекомендуется перенести с них средства на новые адреса, созданные с использованием качественного генератора случайных чисел. Кроме того, ключ, созданный в программах на базе jsbn, даже при использовании CSPRNG не может считаться надёжным, так как SecureRandom() прогоняет выход через ненадёжный алгоритм RC4, который приводит к появлению коррелирующих смещений (biases).

  1. Главная ссылка к новости (https://davidgerard.co.uk/bloc...)
  2. OpenNews: Криптовалюта Monero не настолько защищена от отслеживания, как предполагалось
  3. OpenNews: Выявлена лёгкая в реализации атака на P2P-сеть криптовалюты Ethereum
  4. OpenNews: Ошибка в реализации криптовалюты Zcoin позволяла повторно тратить средства
  5. OpenNews: Опубликован прототип бэкдора в генераторе псевдослучайных чисел Dual_EC_DRBG
  6. OpenNews: Критическая уязвимость в генераторе случайных чисел GnuPG и Libgcrypt
Лицензия: CC-BY
Тип: Проблемы безопасности
Ключевые слова: bitcoin, crypt, javascript
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (32) Ajax | 1 уровень | Линейный | Раскрыть всё | RSS
  • 1.2, Аноним (-), 20:01, 16/04/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Надо было собирать энтропию с событий ввода как GnuPG
     
  • 1.3, Аноним (-), 20:14, 16/04/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Ой, какие бомбы замедленного действия.. Похоже криптой не следует пользоваться еще лет 15 , пока не отладят ..
     
     
  • 2.4, A.Stahl (ok), 20:34, 16/04/2018 [^] [^^] [^^^] [ответить]  
  • +12 +/
    А ЯваСкриптом нужно было начинать не пользоваться ещё 15 лет назад.
     
     
  • 3.13, Аноним (-), 22:00, 16/04/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А слабо предоставить замену? Ну хотя бы частично компенсирующую жс, не надо всех возможностей сразу.
     
     
  • 4.14, Аноним (-), 22:58, 16/04/2018 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Assembler, C, Lisp. В принципе, при грамотном отношении этих трёх было бы достаточно

    Но тут вопрос, какие из "возможностей" вам нужны. Если для вас критично, чтобы софт разрабатывали именно низкоквалифицированные сотрудники, то с JavaScript, конечно, мало что сравнится.

     
     
  • 5.16, A.Stahl (ok), 23:37, 16/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Ты злой. Нет, хуже. Ты во власти стереотипов. На ЯваСкрипте не пишут дураки. Вовсе нет. На этом языке пишут многие умные люди. Беда в том, что пишут они дурацкие, вредные вещи. А сам язык неплох. Наверное.
     
     
  • 6.31, Аноним (-), 00:13, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > На этом языке пишут многие умные люди. Беда в том, что пишут они дурацкие, вредные вещи.

    - А если хороший человек сделает гадость, он так и останется хорошим?
    - Хороший человек гадость не сделает.

    > А сам язык неплох. Наверное.

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

    Вместо всяких[code]object
    .method1(someArgument)
    .then(function(){
            return doSomething();
    })
    .then(function(){
            return doSomethingOther();
    });[/code]было бы что-то типа[code](then (method1 object someArgument)
      (doSomething)
      (doSomethingOther))
    [/code] (я не достаточно хорошо разбираюсь в лиспе, но думается, что, скорее всего, в лиспе УЖЕ есть необходимые возможности).

    Да, сейчас уже реализуют (возможно, даже реализовали) async/await. Да, избавились от рябящих в глазах "function". Но взяли бы лисп и ничего этого можно было бы не делать. У лиспа вообще нет синтаксиса - в него (насколько я вижу) можно вообще любые возможности вкрутить. А яваскриптовый пример выше - лишь попытка натянуть ужа на ежа.

     
  • 5.19, Аноним (-), 07:58, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Т.е. блобы во все щели?
    Про квалификацию тыжпограммистов на С и Lisp можно сказать тоже самое
     
     
  • 6.20, Crazy Alex (ok), 09:11, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Слышал про такую штуку, как свободный софт? Хотя выбор языков забавный, конечно.
     
     
  • 7.25, Аноним (-), 11:28, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    M$ или Гугель сделают браузер в котором работать будет только код написанный под их браузеры, для безопасности, а потом пропихнут это в стандарты. Мало DRM, хочется больше и толще?
     
  • 6.21, commiethebeastie (ok), 09:17, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Когда на них тыжпрограммисты писали? Они же фокспро, дельфи и сишарпик используют.
     
     
  • 7.27, Аноним (-), 11:33, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Как раз тыжпограмисты используют C, т.к. это даёт +100500 к крутости.
     
  • 6.33, Аноним (-), 00:45, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Т.е. блобы во все щели?

    Какие ещё блобы?[code]<script type="text/lisp">

    ($ (onload
        #'(lambda (this)
            ($ (find "p.to-apply") (html "HelloWorld"))
            (alert "Done!")))

    </script>[/code]

     
     
  • 7.36, Аноним (-), 08:01, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Для ускорения работы и повышения безопасности это надо поместить в специальную сборку, а то мало ли перехватят и изменят или ещё что нибудь.
     
  • 5.30, rvs2016 (ok), 16:01, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Assembler, C, Lisp. В принципе, при грамотном отношении этих трёх было бы
    > достаточно

    Остаётся ответить только на вопрос:
    Как имеющиеся браузеры заставить выполнять программы на этих языках?
    И к каким ресурсам браузера из этих языков можно получить доступ? Это каким-то образом удастся дать ответ на первый вопрос. :-)

     
     
  • 6.32, Аноним (-), 00:44, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    А что, понятие API только для js изобрели и для других языков принципиально нельзя программный интерфейс к возможностям браузера?
     
     
  • 7.37, rvs2016 (ok), 14:12, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > А что, понятие API только для js изобрели и для других языков
    > принципиально нельзя программный интерфейс к возможностям браузера?

    Ну конечно же изобрести можно любые программы, подпрограммы да алгоритмы. Но в браузерах сейчас это есть? Если этого нет, то не будут же вебмастеры ждать снисхождения благодатного АПИ на браузеры вместо того, чтобы ваять программы на каком-никаком, но зато на уже имеющемся, JS?

     
     
  • 8.38, Аноним (-), 23:32, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Изначально вопрос стоял предложите альтернативы яваскрипту Если одним из крит... текст свёрнут, показать
     
  • 6.34, Аноним (-), 00:47, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Как имеющиеся браузеры заставить выполнять программы на этих языках?

    Первые два - в виде устанавливаемых из репозитория пакетного менеджера (или скачиваемых с левых сайтов, в зависимости от ОС) расширений,
    третий - прямо в исходниках страниц в форме <script type="text/lisp">

    Разумеется, "само" это не заработает, кто-то должен сделать поддержку в браузерах.

     
     
  • 7.39, rvs2016 (ok), 10:05, 19/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    >> Как имеющиеся браузеры заставить выполнять программы на этих языках?
    > Первые два - в виде устанавливаемых из репозитория пакетного менеджера

    Это слова для кого? Для программистов и сисадминов? Или для пользователей? Программисты и сами напишут себе что угодно. А пользователи не знают даже что такое браузер. Они его называют - вот та штука, как её там... интернет короче... А менеджер для них - это такой человек, который ходит по магазину и пристаёт с вопросами типа "вам что-нибудь подсказать"? Соответственно, если вебмастеры вместо наваяния скриптов на JS будут пользователям сайтов писать что-то типа - да установите такую-то приблдуду из репозитория, то такие вебмастеры быстро лишатся работы и заказов.

    (или скачиваемых
    > с левых сайтов, в зависимости от ОС) расширений,
    > третий - прямо в исходниках страниц в форме <script type="text/lisp">
    > Разумеется, "само" это не заработает, кто-то должен сделать поддержку в браузерах.

     
  • 4.23, АНГЫВНАГЫНВАШЩ (?), 09:36, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    для анимации кнопочек JS более чем достаточно
     
  • 2.5, Аноним (-), 20:41, 16/04/2018 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Похоже криптой не следует пользоваться еще лет 15

    Да эта пирамида дай Б-г год ещё протянет.

     
     
  • 3.24, Аноним (-), 10:40, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Что еще по "телевизеру" сказали?
     

  • 1.10, Аноним (-), 21:33, 16/04/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • –6 +/
    https://ru.wikipedia.org/wiki/%D0%91%D0%BB%D0%BE
     
  • 1.12, Аноним (-), 21:59, 16/04/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >в которых для получения случайных чисел использовался класс SecureRandom() из библиотеки jsbn.

    Сами виноваты. Я никогда не пользовался этим дерьмом. Зачем пользоваться всяким промежуточным дерьмом, если в браузере ВСЁ НУЖНОЕ ЕСТЬ? Вся суть фреймворкомакак.

     
     
  • 2.17, KonstantinB (ok), 03:21, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Суть проблемы как раз в том, что в некоторых браузерах нужного нет, а в комбинации с ошибкой проверки версии (что, кстати, тоже не шибко умное решение, проверять намного лучше по наличию API) получилось то, что получилось.

    Надо было вместо фолбэка на Math.random() кидать new Error("your browser sucks").

     
     
  • 3.22, Аноним (-), 09:35, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • –3 +/
    >Суть проблемы как раз в том, что в некоторых браузерах нужного нет

    Значит эти браузеры - гoвно и их пользователей надо послать на хер, раз они не могут себе поставить браузер. А не юзать всякие сраные библиотеки-прокладки вроде jquery, как это модно у фреймворкомакак.

     
     
  • 4.28, KonstantinB (ok), 14:51, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    От проекта зависит. Я б с удовольствием слал, но некоторые заказчики хотят, чтобы у всех работало, и даже готовы это оплачивать. И я их прекрасно понимаю - сто баксов одинаковые и у пользователя Хрома, и у пользователя MSIE.

    Впрочем, совсем древность уже никто не требует, а для MSIE 9+ вполне можно без всяких jquery обойтись, да.

     
     
  • 5.29, KonstantinB (ok), 14:58, 17/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    Впрочем, Math.random() голый я бы все равно не брал. Сходил бы на сервер за рандомом, если в браузере все плохо.
     
     
  • 6.40, qwe (??), 02:41, 21/04/2018 [^] [^^] [^^^] [ответить]  
  • +/
    > Сходил бы на сервер за рандомом, если в браузере все плохо.

    Ага, отличная идея - формировать приватные ключи пользователя на сервере.

     

  • 1.18, Аноним (-), 07:46, 17/04/2018 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >но из-за опечатки в функции сравнения версии браузера создавалась ситуация, при которой библиотека пыталась обратиться к window.crypto.random в браузере без его поддержки и без вывода ошибки откатывалась на использование ненадёжного математического генератора псевдослучайных чисел math.Random

    JavaScript во все поля и минимум юнит-тестов - что ты с хипстеров возьмёшь.

     
     
  • 2.35, Аноним (-), 01:41, 18/04/2018 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > минимум юнит-тестов - что ты с хипстеров возьмёшь.

    У хипстеров как раз TDD вместо мозга. Написали тест - написали реализацию. Не написали тест - не написали реализацию.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру