- PVSM.RU - https://www.pvsm.ru -
Поговорим немного про кошельки в криптовалютах. Под “криптовалютой”, я, в первую очередь, буду иметь ввиду Bitcoin. В других криптовалютах дело обстоит похожим образом и если вас интересуют детали, то можете покопаться самостоятельно.
Несмотря на продолжающийся хайп вокруг криптовалют и блокчейн как технологии, на мой взгляд, очень мало кто говорит про безопасность этих решений. Все концентрируются на различных плюсах, которые дает технология блокчейн, обсуждают майнинг и скачки курсов криптовалют, в то время как именно безопасность является критически важной, особенно когда речь идет о деньгах или о распределенных реестрах собственности. Вся информация для статьи взята из открытых источников, таких как https://bitcoin.org [1], https://en.bitcoin.it/wiki [2], https://bitcointalk.org [3], https://github.com [4] и других.
Ниже будет неглубокий обзор кошельков криптовалют и их безопасности. Чем больше я погружался в эту тему при написании статьи, тем больше удивлялся тому, что в мире происходит так мало взломов и увода средств у пользователей того же Bitcoin. Но обо всем по порядку.
Разберемся немного с терминологией. Под кошельками в криптовалютах понимают одновременно:
Чтобы не путаться, когда будем говорить о наборе ключей, я буду использовать термин “закрытый ключ”. Хотя все мы понимаем, что в ключевой паре есть еще и открытый, а также то, что самих пар может быть несколько.
Будем говорить про кошелек именно как про средство управления, хранения и проведения транзакций. Без кошелька вы не можете получить, сохранить или потратить ваши биткоины или средства в другой криптовалюте. Кошелек — ваш персональный интерфейс к сети криптовалюты, похожий на банковский аккаунт для фиатной валюты.
На самом деле безопасность хранения ваших средств в криптовалюте очень сильно зависит от того кошелька, который вы используете. А безопасность самого кошелька во многом основана на безопасности операций с закрытыми ключами.
Все кошельки подразделяются на “горячие” и “холодные”. «Горячим» называют криптовалютный кошелек, средства с которого можно потратить в любое время. «Холодный» кошелек действует совершенно противоположным образом. Он не предназначен для регулярного отправления криптовалюты, но тем не менее, средства на него можно получить в любое время. Самым простым “холодным” кошельком является лист бумаги, на котором записан закрытый ключ от вашего кошелька.
“Горячий” кошелек Bitcoin — это приложение, веб-сайт или устройство, которое управляет вашими закрытыми ключами. Самые популярные — это, конечно, приложения, как мобильные, так и десктопные, а также веб-сайты. Давайте чуть подробнее остановимся на каждом из этих видов и посмотрим, какие угрозы таит использование того или другого кошелька.
Так как кошельков существует очень много, я решил изучать только те, которые представлены на сайте https://bitcoin.org/ [5]. В качестве программных кошельков для персонального компьютера там представлены:
Первое на что обратим внимание — это на рекомендации самого сайта bitcoin.org [1] относительно безопасности использования того или иного кошелька. При скачивании вам покажут 6 требований и информацию о том, какие требования каждым из этих кошельков соблюдаются, а какие нет. Большая часть этих требований прямо или косвенно связана с информационной безопасностью, а значит и с безопасностью ваших средств.
Вот эти требования, а также уровни соответствия этим требованиям.
Ещё раз отмечу, что эта информация не скрывается, а доступна для всех. Даже русский перевод есть, хотя и не совсем корректный в некоторых местах.
Так вот, не знаю, как вам, а мне совсем не нравится последние два уровня контроля. История про надежный пароль звучит вообще очень плохо. И дело тут даже не в том, что у пользователей большие проблемы с созданием, вводом и запоминанием по-настоящему надёжных паролей, а в том, что key-логгеры никуда не делись.
А уж если быть совсем реалистами, то вряд ли эти предупреждения кто-то читает. А если и читает, то далеко не каждый понимает, насколько здесь много проблем с безопасностью.
Использование полноценных узлов всеми участниками сети, на мой взгляд, является одновременно одним из столпов и, одновременно, одним из основных минусов технологии блокчейн. Так как количество транзакций как в относительных, так и в абсолютных величинах постоянно растет, то размер самого кошелька также будет постоянно расти. А хранить несколько Тб данных для проведения пары транзакций в день мало кому захочется.
Альтернативные решения имеют явные проблемы с безопасностью. Список серверов, в случае децентрализованной проверки, надо хорошо защищать. А то как бы очередной вирус не оставил в этом списке только один зараженный сервер.
А уж про стопроцентное доверие третьей стороне даже говорить не хочется.
Кстати, сторонники криптовалют любят в этом случае обращать внимание на то, что банковская система устроена похожим образом. Это конечно так. Вот только банки регулируются многочисленными стандартами, а уж если возникла новая проблема/уязвимость, то ваши средства защитит страховка. Поэтому криптовалютным сервисам еще есть куда расти.
Исходные коды — это вообще больной вопрос. Так как эта тема очень близка аудитории Хабра, то давайте на ней остановимся поподробнее.
Больше всего мне нравится фраза “Любой разработчик в мире может провести аудит кода”. Ага, как же. Во-первых, разработчик должен неплохо знать конкретный язык программирования, на котором написан конкретный кошелек. А это сразу отсекает большой кусок от “любой разработчик в мире”.
Во-вторых, далеко не любой разработчик является одновременно специалистом по информационной безопасности или имеет опыт написания безопасного кода. Приведу банальный пример:
memset(password, 0, sizeof(password))
Откройте статьи от разработчиков PVS-studio и вспомните о том, какие ошибки порой совершают разработчики. Причем даже те разработчики, которые хорошо разбираются в вопросах безопасности (например, Скучная статья про проверку OpenSSL [6]).
Поэтому полноценный аудит всего кода кошелька может сделать весьма ограниченное количество разработчиков. Большая часть которых и так имеет кучу интересных задач, помимо этого аудита. Даже если кто-то из них и заинтересуется этой задачей, то выполнена она будет только для определенного коммита в git. А значит, оценить безопасность кода в конкретный момент времени весьма непросто.
Что подразумевают ребята с сайта Bitcoin под фиксированной процедурой сборки точно понять не удалось. Со сборкой есть свои проблемы. Например, как понять, что полученная вами сборка или обновление собраны именно из правильных исходных кодов. Давайте будем реалистами – собирать кошелек из исходных кодов будут единицы. Лучшее, что вы можете сделать, это проверить хэш от свежескачанного инсталлятора с хэшем, который указан на официальном сайте. И надеется, что сайт не был скомпрометирован и там лежит именно корректный хэш, а также доверять разработчикам и сборщикам кошелька, а также администраторам сайта.
Чтобы уж совсем добить вопрос про исходные коды, я решил сам заглянуть в исходники Bitcoin Core, который по всем показателям, которые уже были описаны и тем, которые описаны дальше, занимает лидирующие позиции. Примеры кода и выводы, которые я сделал, бегло просмотрев исходники, смотрите ниже.
Есть еще один интересный аспект, который я обнаружил совершенно случайно. Допустим, вы решили использовать кошелек Bitcoin Armory, который скромно позиционирует себя как BEST BITCOIN WALLET. В описании вы найдете – “Armory is the most secure and full featured solution available for users and institutions to generate and store Bitcoin private keys”. Забив в Google название кошелька, вы обнаружите, что у кошелька есть 2 сайта. Первый https://www.bitcoinarmory.com [7] — коммерческий с красивыми словами, в топе выдачи. Второй https://btcarmory.com [8] — более технический, на него вас приведет ссылка с https://bitcoin.org/ [5].
Так вот, на техническом сайте, на главной странице в новостях, вы найдете предупреждение:
Коммерческий сайт такие глупости не пишет =) Вам же не надо переживать по таким глупым поводам.
Мне нравится, в каких терминах описаны эти требования. Похоже разработчики решили вам сразу намекнуть, что ваши средства точно украдут. Вопрос только в том, сколько усилий и времени это потребует =)
Давайте тут тоже остановимся чуть подробнее.
Использование надежной двухфакторной аутентификации действительно может помочь решить многие проблемы с информационной безопасностью.
Ключевое слово тут “надежной”. А еще и правильно реализованной. А с этим не всегда все хорошо получается. Например, blockchain.info [9] предложит вам старые добрые SMS в качестве второго фактора. Никому же не интересны те же рекомендации NIST в Special Publication 800-63B:
Подробнее про правильную двухфакторную аутентификацию мы поговорим в следующей статье, в которой будем подробнее рассматривать аппаратные кошельки для криптовалют.
На безопасности компьютеров и мобильных устройств останавливаться подробно не будем. Достаточно почитать любой из отчетов Лаборатории Касперского или других серьезных игроков на рынке безопасности, чтобы самостоятельно сделать выводы.
Следующие два пункта не связаны напрямую с безопасностью хранения ваших средств. Поэтому подробно останавливаться на них я не буду, но приведу их тут для полноты картины.
Даже если вы используете криптовалюту полностью легально (хотя, что такое легально в отношении криптовалюты — большой вопрос), то дополнительная приватность вам не помешает. А уж раскрывать свой баланс и траты, так вообще никому не захочется. Ваш КО.
Все предъявляемые требования звучат очень разумно. Более того, этот список можно было бы еще расширить, чтобы повысить уровень безопасности.
Внимательно изучив все эти требования, вы хотите найти такой кошелек, который удовлетворял бы им по максимум. И вот тут наступает самое интересное. На https://bitcoin.org [1] нет ни одного кошелька, который удовлетворял бы всем требованиям.
В лучшем случае, вы можете выбрать Bitcoin Core или Bitcoin Knots, для которых будет такая картина:
Или будете использовать Electrum, для которого такая картина:
Использование зеленого создает ложное впечатление полного удовлетворения требованиям. Полное соответствие —жирный зеленый цвет. Такое оформление было явно выбрано умышленно, а значит, создатели портала решили слегка поманипулировать обычным пользователем. Не хорошо это.
На этом можно было бы уже и закончить. Думаю, все уже представили насколько безопасно хранятся закрытые ключи в кошельках криптовалют. Но мы же на Хабре.
Пойдем чуть дальше и посмотрим, как происходит хранение и работа с закрытыми ключами на примере программных клиентов. Как мы уже выяснили, вредоносное ПО может получить доступ к закрытым ключам вашего кошелька. Вопрос в том, насколько легко или тяжело это сделать на самом деле.
Первым делом посмотрим, как это делает Bitcoin Core. Этот процесс неплохо описан в wiki самого Bitcoin. Как вы видели на скрине выше, этот клиент отмечен как один из самых продвинутых и удовлетворяющих большинству требований.
Закрытые ключи вашего кошелька хранятся вместе с другой информацией, в файле wallet.dat в формате “bitkeys”. Этот файл может быть зашифрован, а может и не быть =) По умолчанию, конечно, ничего не шифруется. Вы же грамотный пользователь и сами найдете нужную кнопку. Шифруется только информация о закрытых ключах с помощью алгоритма AES-256-CBC [10]. При этом в качестве ключа шифрования используется так называемый мастер ключ – случайное число. При это сам мастер ключ шифруется на ключе, полученном из кодовой фразы с помощью SHA-512 и функции OpenSSL — EVP_BytesToKey. Количество раундов шифрования определяется скоростью компьютера, на которой происходит первоначальное шифрование.
После того ваш кошелек используется клиентом в обычном режиме. Это состояние называется “locked”. Если в какой-то момент, вам необходимо получить доступ к закрытым ключам кошелька, то вам необходимо ввести кодовую фразу в GUI клиента или воспользоваться командой walletpassphrase
в RPC. В этом случае произойдет расшифрование закрытых ключей, и кошелек перейдет в состояние “unlocked”. В первом случае он будет находится в этом состоянии ровно столько, сколько необходимо для осуществления той или иной операции. Во втором случае, время через которое кошелек вернется в состояние locked определяется вторым параметром в RPC запросе!
Код выглядит так:
int64_t nSleepTime = request.params[1].get_int64();
pwallet->nRelockTime = GetTime() + nSleepTime;
RPCRunLater(strprintf("lockwallet(%s)", pwallet->GetName()), boost::bind(LockWallet, pwallet), nSleepTime);
Это выглядит очень мило. Обычный пользователь кошелька вряд ли запустит у себя сервер, если только не промахнется файлом. А вот злоумышленник…
С GUI и хранением той же passphrase в памяти тоже все не очень просто. Ребята реализовали специальный класс для хранения подобных данных – SecureString. Реализовали в общем-то неплохо, грабли с использованием memset успешно обошли. Но вот держат его в памяти дольше, чем следовало бы.
Например, так делает наш GUI (слегка подправил для наглядности, любопытным смотреть askpassphrasedialog.cpp:154):
case Unlock:
if(!model->setWalletLocked(false, passphrase))
{
QMessageBox::critical(this, tr("Wallet unlock failed"),
tr("The passphrase entered for the wallet decryption was incorrect."));
}
else
{
QDialog::accept(); // Success
}
break;
}
return;
В начале сделаем accept(), а только потом наш oldpass выйдет из области видимости и произойдет очистка. Понятно, что более безопасный код получится не такой красивый, как менее безопасный. Но мы же тут вроде с деньгами работаем?
На мой взгляд, это отлично подтверждает мое опасение на тему открытости исходников кошелька. Открытость исходных кодов не равно безопасность.
Постараюсь предвидеть первые комментарии и сразу ответить на них:
Цель статьи – обратить внимание сообщества на проблемы, которые требуют решения, а не настроить кого-то против новых технологий.
Я ничего не имею против криптовалют или технологии блокчейн. Наоборот, я всеми руками ЗА (это мое личное мнение, которое не в коей мере не является официальной позицией компании, в блоге которой размещена статья). Но раз уж мы начинаем работать с новой технологией, то надо делать это технически грамотно и не забывать об информационной безопасности.
Автор: Neraverin
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bezopasnost/267260
Ссылки в тексте:
[1] https://bitcoin.org: https://bitcoin.org
[2] https://en.bitcoin.it/wiki: https://en.bitcoin.it/wiki
[3] https://bitcointalk.org: https://bitcointalk.org
[4] https://github.com: https://github.com
[5] https://bitcoin.org/: https://bitcoin.org/
[6] Скучная статья про проверку OpenSSL: https://habrahabr.ru/company/pvs-studio/blog/219547/
[7] https://www.bitcoinarmory.com: https://www.bitcoinarmory.com
[8] https://btcarmory.com: https://btcarmory.com
[9] blockchain.info: https://blockchain.info/
[10] AES-256-CBC: https://en.wikipedia.org/wiki/AES-256
[11] Источник: https://habrahabr.ru/post/341338/
Нажмите здесь для печати.