На прошлой неделе многие пользователи биткоинами впервые столкнулись с таким ранее неведомым термином, как «transaction malleability» (уязвимость или эластичность биткоин-транзакций). Именно эту пресловутую «уязвимость» биржа Mt.Gox назвала ключевой причиной приостановки операций по вводу/выводу средств на своей площадке. Кроме того, «уязвимость» фигурировала в качестве причины эксплойта, используемого при «массированной и согласованной атаке» против Bitcoin сети. Итак, что же это за явление, как работает, и должно ли это нас беспокоить? Вот то, что нам удалось выяснить.
Что означает транзакционная уязвимость?
Это своего рода атака, которая позволяет кому-либо изменить уникальный ID биткоин-транзакции до получения подтверждения сети Биткоин. Изменение позволяет злоумышленнику делать вид, что сделка не была произведена до конца и требовать возврата денег.
Это то же самое, что и проблема «двойной траты»?
Нет. Двойная трата – это когда монеты израсходуются один раз, а затем, прежде чем первая сделка получит подтверждение, осуществляются различные транзакции с теми же самыми монетами. В нашем же случае, вся хитрость мошеннической сделки заключается в том, чтобы сначала получить подтверждение от сети Биткоин о том, что первая сделка не была произведена. Фактически это означает то, что можно вывести монеты два раза.
Как же работает эластичная транзакция?
Чтобы разобраться в этом, нужно знать, как проходят обычные транзакции в Биткоин. При отправке биткоинов, вы не снимаете их со счета и не отправляете по проводам. Биткоины никогда не пересылались подобным образом. Вместо этого, сделка создается в цепочке блоков Биткоин.
Цепочка блоков действует как гигантская книга учета для всей Биткоин сети. Она ведет учет того, с какого биткоин-адреса были отправлены средства на другой биткоин-адрес и когда. Таким образом, можно в каждый момент времени досконально узнать, сколько биткоинов находится на том или ином адресе, с какого на какой осуществлялись транзакции.
Когда биткоин-транзакция прошла, она включает в себя такую информацию, как адреса с которых были получены биткоины (входящие), куда они были направлены (исходящие), передаваемые суммы и с каких адресов эти средства были получены на адрес самого отправителя. Каждой операции присваивается уникальный ID, так что на них может ссылаться цепочка блоков системы. ID транзакции (ТХ ID ) генерируется при принятии информации о сделке, и пропуске ее через хеш-функцию.
Хеширование является математической процедурой, которая подразумевает принятие различных фрагментов данных и их объединения, при этом получается более короткий кусок информации, известный как хеш. В хеш каждой транзакции включена цифровая подпись пользователя, которая служит доказательством того, что сделка производится от лица пользователя. Это своего рода предоставление клиенту возможности «подписать» транзакционный документ.
Одним из ключевых свойств функции хеширования является то, что просто посмотрев на хеш невозможно сказать, какой была первоначальная (оригинальная) информация. Также невозможно предсказать, каким будет хеш, сгенерированный на основе фрагментов предоставленной вами информации. Если совершенно незначительная деталь меняется в любой из этих частей данных, то она изменяет хэш совершенно непредсказуемым образом.
Это гарантирует ID транзакции практически идеальную защиту от подделки. Каждая транзакция должна иметь только один возможный хеш. Вы можете доказать, что сделка действительна, просто пропустив все части информации, которые составили эту транзакцию, через хеш-функцию, чтобы убедиться в том, что вы получите тот же самый хеш.
Во всяком случае, основной принцип работы состоит именно в этом. И здесь же зарождается «уязвимость» транзакций. Предполагалось, что цифровые подписи клиентов, используемые как часть хеша для «подписания» сделок, должны быть определенного формата. Этот формат не всегда был должным образом проверен и означало, что подпись и в «плохом» формате могла быть введена в систему и принята ею. Подобное изменение подписи дает возможность создавать различные хеши для одной транзакции. И это уже совсем не хорошо. Но, как выясняется, это еще «цветочки». И вот, почему.
Как это может вызвать проблемы?
Одна из основных проблем сосредоточена на биржах, которыми клиенты биткоин часто пользуются для покупки и продажи биткоинов. Они отправляют официальную валюту или биткоины на торговую площадку, где они зарегистрировали свои аккаунты, на конвертацию. В какой-то момент они, возможно, пожелают вывести биткоины со своего счета. Существует несколько возможных сценариев. Вот вам парочка:
Вредоносные отдельные атаки
Давайте предположим, что Алиса владелец биржи, а у Евы на этой бирже имеется счет в биткоинах. Ева решает вывести свои монеты и просит Алису отправить биткоины на ее адрес. Когда Алиса отправляет деньги, она автоматически создает транзакцию, которая переводится для майнинга, для того что бы ее могли включить в цепочку блоков.
Но Ева делает вид, что Алиса никогда не пересылала ей монет. Она использует программный недостаток — «уязвимость транзакции» для того, чтобы дублировать оригинальную транзакцию Алисы, и слегка изменив подпись, сгенерировать совсем другой хеш. Затем она ретранслирует эту транзакцию уже с другим ID.
Существует вероятность того, что сделка Евы будет подтверждена в цепочке блоков. Если это произойдет, то программа будет уверенна в том, что сделка действительна и не делает записи в системе. А Ева может потом обратиться к Алисе, жалуясь на то, что она не получила монеты. Когда Алиса проверит ID своей транзакции в цепочке блоков, она его не найдет, и она может отправить биткоины повторно, то есть платить на этот раз будет из своего кармана.
Нелепые случайности
Если вы собственноручно используете специальное программное обеспечение для обработки ваших биткоинов, то можете сгенерировать неверные хеши по ошибке. Эти хеши могут быть «пойманы» другим кошельком, который должным образом отформатирует их. Но это также может изменить ID транзакции. Если ваш кошелек не предназначен для того, чтобы замечать операции с одними и теми же характеристиками, но с разными ID, то это может в конечном итоге привести к образованию «застрявших» сделок, которые находятся в подвешенном состоянии. Что еще хуже, пользователь может подумать, что у него все еще есть эти монеты для расходования.
В любом случае, если ваше программное обеспечение не справляется, то это превращается в настоящий бухгалтерский кошмар. Разработчик ядра Биткоин Григорий Максвелл рассказывает о таком развитии событий здесь.
Массовые DoS атаки
Кроме того, существует возможность создания и более серьезных проблем для сети Биткоин, в случае намеренного запуска атак, эксплуатирующих «уязвимость транзакции», на несколько бирж одновременно, возможно, с использованием программного обеспечения направленного на создание мутантных сделок. Подобные согласованные атаки имели место на этой неделе. Несколько биткоин-бирж ощутили на себе их удары.
Конечные системы учета этих бирж возможно и будут в состоянии справиться с определенным количеством мутантных сделок, но подобная многократная бомбардировка может привести их к материально-техническим проблемам.
Это может привести также и к краткосрочным проблемам на рынке. Любые неопределенность или сомнение по поводу стабильности рынка, естественно, окажут влияние на рыночные цены, тем более это касается таких неликвидных и волатильных продуктов как криптовалюты.
Означает ли это, что в протоколе Bitcoin допущена ошибка?
Существовало несколько аспектов с технологиями, которые используются в сети Биткоин и которые создают проблему «уязвимости транзакции». Одна из них была изначально в клиентском приложении — программном обеспечении, которое используется в качестве основы для создания своих собственных приложений и сервисов. Ошибка возникала при двойной проверки данных цифровой подписи перед ее передачей другой части программного обеспечения, на которой основывался биткоин-клиент.
Согласно заявлению Фонда Биткоин, сделанному на прошлой неделе, последняя атака «двойного вывода» имеет прямое отношение к мутантным версиям транзакций, которые «показали ошибки как в клиентском части, так и в программном обеспечении некоторых бирж», а это означает, что программные недостатки имеются в различных местах экосистемы Bitcoin. И эти вопросы требуют решения.
Ведущие разработчики также говорят о двух «крайних случаях» в клиентских приложениях (о тех недостатках, к которым очень редко привлекалось внимание). Оба случая связаны с биткоин-кошельками.
Как оказалось, есть довольно много других проблем и вопросов, связанных с «уязвимостью». Некоторые из них были включены одним из ключевых разработчиков Биткоин в Bitcoin Improvement Proposal — документ, который предлагает внести некоторые изменения в исходный код Биткоин.
В настоящее время основные разработчики не раскрывают деталей о других уязвимостях и проблемах, связанных с Биткоин, т.к. не хотят предоставлять хакерам и злоумышленникам чувствительной информации, которую затем можно было бы использовать в своих преступных целях.
Как это исправить?
Сообщество еще в 2011 году было в курсе о возможности создания неправильно сформированной подписи, о чем неоднократно упоминалось. Проблема здесь в том, что основная часть программного обеспечения, используемого клиентами Биткоин, не способна должным образом обрабатывать «плохо» сформированные подписи. Это не была ошибкой разработчиков протокола Биткоин. Проблема в том, что они не предусмотрели возможность двойной проверки подписи клиента перед ее передачей. Это было исправлено в 0.8 версии клиентского софта.
Однако не все биржи используют стандартный биткоин-клиент при обработке своих транзакций. Они могут использовать и собственные версии, которые все немного меняют. И биткоин-разработчики, и разработчики софта электронных кошельков и торговых площадок не прекращают работы над совершенствованием своих программ, пытаясь обеспечить их беспроблемное функционирование.
Другие вопросы относятся в большей степени к том, как протекают эти процессы. Основным вопросом является гибкость при проведении операций, но здесь возникает проблема неподтвержденных сделок. Каждая транзакция должна быть подтверждена в рамках всей цепочки блоков, что стабилизирует всю систему и исключает возможность мошенничества. Сама возможность контроля проведения операций пользователями сети намного упрочняет положение биткоинов.
Неужели для биткоинов наступил конец света? Мы наблюдаем коллапс криптовалюты?
Это недоразумение, не больше. Практически во всех программных продуктах существуют ошибки, но не все из них можно назвать критическими. Целостность всей платежной системы, использующей биткоины, не нарушена. Компьютерная сеть по прежнему существует и способна обрабатывать информацию.
В приведенном выше примере видно, что Алиса отправила Еве один биткоин 5 февраля в 12:10 GMT, что подтверждает уникальность проведенной операции. Она могла бы просто сказать, что “полученные данные показывают, что ваша сделка совершена в такое-то время и с такими-то параметрами. Так как ID изменилось, то проведение повторной операции невозможно”.
Биржи могли бы применять инструменты, с помощью которых автоматически отслеживать внесения изменений в транзакции. Это помогло бы исключать «мутирование». Во всяком случае «транзакционная уязвимость» подтверждает устойчивость децентрализованной системы по сравнению с централизованной. В конце концов, децентрализация — это и есть внутренняя ценность биткоина.