В криптосообществе появился новый вид мошенничества: распространение кошельков с неслучайным алгоритмом создания закрытых ключей. Анонимный пользователь на сайте Pastebin представил доказательства того, что один из кошельков для Биткоина генерирует закрытые ключи, которые очень легко расшифровать и, следовательно, забрать находящиеся во взломанном кошельке биткоины. Названия кошелька в публикации не упоминается, не сообщается также, следует ли считать эти действия результатом вредоносной программы или просто ошибкой кода.

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

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

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

Вот так выглядит закрытый ключ:

6c951c460a4cfe5483863adacafad59e5de7e55876a21857733ca94049d7d10c 

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

«Расшифровка» закрытого ключа

Поскольку закрытым ключом может в буквальном смысле быть все, что угодно, технически мы можем взять любую фразу или цепочку букв и цифр и использовать их в качестве закрытого ключа (например, «satoshi nakamoto») . Другими словами, можно забросить в хэш-функцию любой набор символов и создать кошелек. После этого создается публичный ключ и – добро пожаловать в мир криптовалют! Однако так поступать настоятельно не рекомендуется, поскольку очевидно, что раз вы можете придумать закрытый ключ, то раскрыть его сможет и кто-то другой. Такой ключ уже не будет по-настоящему случайным, а ведь именно это свойство необходимо для создания безопасного кошелька.

К примеру, кошелек BrainWallet.io оснащен инструментом, позволяющим пользователям поместить в него все, что они пожелают, и получить из этого пару открытый/закрытый ключ. Поскольку блокчейн представляет собой открытый публичный реестр, в нем можно наблюдать множество адресов, созданных из обычных фраз. Использовать подобные словосочетания в качестве ключей, мягко скажем, неразумно, однако  иногда люди отправляют монеты просто для того, чтобы просто оставить след в блокчейне.

Проверка закрытых ключей для обнаружения биткоинов

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

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

Затем он использовал корни Меркла (Merkle roots) некоторых блоков на предмет существования раскрываемых ключей, и вновь ему удалось обнаружить адреса, на которые отправлялись монеты.  К сожалению, все балансы были нулевыми, но охота становилась все интереснее. Третий эксперимент проводился с использованием простых слов, несколько раз прошедших хэширование, таких как  “hello” или “sender”. Хэши этих слов затем хэшировались снова и снова, добавляя дополнительный слой защиты и уменьшая шансы на то, что ключ будет открыт. Если вы захэшируете слово один раз, впоследствии вы сможете повторить это еще и еще, и в конечном итоге вы получите закрытый ключ, который уже когда-то использовался. Таким образом было обнаружено несколько адресов, использовавших этот метод. Один из самых забавных было слово “password” (пароль), после хэширования которого 1 975 раз получался действующий закрытый ключ, на который отправлялись средства.  Более чем вероятно, что создатель этого адреса родился в 1975 году.

многократное хэширование

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

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

Что происходит на самом деле?

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

Пользователь создал бот для постоянного сканирования данных адресов и перехвата всех отправляемых на них биткоинов, и волей случая он наткнулся на транзакцию в 0,5 биткоина на адрес с раскрываемым закрытым ключом. К сожалению, бот сработал недостаточно хорошо, и  ему не удалось во время создать транзакцию. Биткоины были извлечены из кошелька и отправлены дальше. Однако пользователь что-то заподозрил и продолжил эксперимент с ботом, после чего он заметил, что аналогичный «адрес сбора» использовался во множестве способов раскрытия ключей. По меньшей мере, один адрес из всех методов перечислял биткоины, один за другим, в адрес кого-то, контролирующего всю систему. Ежедневно пользователь наблюдал более 6 транзакций, прошедших через его базу данных закрытых ключей.

Например, пользователь Reddit под ником /u/fitwear рассказал о взломе кошелька на blockchain.info и краже почти 9 BTC. Несмотря на то, что при создании кошелька он выполнил все меры предосторожности (использовал надежный пароль и двухфакторную аутентификацию), его биткоины пропали. В ответ на обращение в службу техподдержки он получил стандартный ответ, ссылающийся на то, что кто-то, возможно, завладел его данными, либо его устройство было повреждено вирусом.

Анонимному пользователю Pastebin удалось найти 9 биткоинов на адресе, копия закрытого ключа к которому содержалась в его базе данных.  Пользователю /u/fitwear повезло, и он получил свои биткоины назад, однако дальнейшее расследование адреса открыло очень тревожные подробности.

Очевидно, что предположения техподдержки blockchain.info о вирусе абсолютно необоснованны – логично, что разработчик создал бы закрытый ключ из какой-то конфиденциальной информации, а не случайного адреса.  Тот факт, что адрес является случайным, дает любому понимающему эту схему шанс забрать монеты до того, как хакер сможет отправить их в кошелек, находящийся под его контролем. Что-то здесь определенно  не сходится.

Код, который понадобится для генерирования расшифрованных закрытых ключей, удивительно прост – это всего лишь пара хэш-функций. В случае со сторонним провайдером  кошелька, этот фрагмент вредоносного ПО был бы спрятан среди тысяч строк кода.  Кроме того, эта функция не привлекла бы внимание во время проверки кода, потому что она просто хэшировала публичный адрес. Аналогично тому, когда мы прячем что-то на самом видном месте. Если бы вирус был закодирован способом, при котором создается закрытый ключ, известный только хакеру и его жертве, это было бы гораздо подозрительнее, чем кодирование системы генерации ключа, которая производит легко раскрываемый закрытый ключ.

Что дальше?

Несмотря на то, что обнаруженная  информация очень тревожна, безопасность Биткоина не пострадала.  99,999% генерируемых закрытых ключей создаются случайным образом, и если ключ генерируется правильно, статистически возможность того, что ваши закрытые ключи будут расшифрованы, крайне ничтожна. Обращаясь к примеру с количеством секунд,  прошедших с зарождения вселенной, попытку раскрыть случайно сгенерированный ключ можно сравнить с попыткой угадать во всем этом количестве секунд одну конкретную секунду. Очень маловероятно, что вы угадаете хотя бы  год, не говоря уже о месяце, дне, часе, минуте и секунде. Если вы пользуетесь проверенным кошельком и контролируете его закрытые ключи, вы 100% не пострадаете.

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

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