В шаге от катастрофы: Анатомия последнего бага биткоина
Уязвимости в программном обеспечении криптовалют всегда были и остаются одной из главных угроз их развитию: не так давно почти сразу после запуска в сети EOS был обнаружен серьёзный баг, а несовершенство алгоритмов хеширования криптовалюты Verge и одного из форков биткоина привело к реализации атак 51%. Казалось бы, такие ошибки — удел альткоинов, но уж точно не биткоина. Ведь что может быть хуже, чем уязвимость самой главной криптовалюты, суточный оборот которой составляет $4,5 млрд.? Возможно, только незнание о существующей угрозе.
«Самый катастрофический баг»
18 сентября разработчики Bitcoin Core объявили о выпуске обновления для устранения уязвимости к DDoS-атакам. Оказалось, что такую атаку можно было реализовать через флуд трафика или отправление полным нодам информации, способной вызвать сбои в сети.
Исправление уязвимости CVE-2018-1744 первоначально было адресовано нескольким разработчикам, которые имели дело как с Bitcoin Core, так и с другими криптовалютными проектами. Баг был описан разработчиком Bitcoin Cash, известным как Awemany. В своём посте на Medium он заявил, что CVE-2018-17144 — это «самая катастрофическая ошибка за последние годы и, безусловно, одна из самых катастрофических ошибок в биткоине». В национальной базе данных уязвимостей США (NVD) проблема описывается следующим образом:
Bitcoin Core 0.14.x до 0.14.3, 0.15.x до 0.15.2 и 0.16.x до 0.16.3 и биткоин-узлов 0.14.x до 0.16.x до 0.16.3 позволяют удалённый отказ в обслуживании (сбой приложения), чем могут злоупотреблять майнеры через дублирование входа (input). Атакующий может реализовать сбой bitcoind или Bitcoin-Qt.
Однако уязвимость оказалась более серьёзной, чем утверждали разработчики Bitcoin Core, поскольку могла позволить злонамеренным майнерам искусственно увеличить выпуск биткоинов посредством двойного входа.
Майнеры могли бы разбить цепочку блоков в случае, если бы попытались проверить блок, содержащий транзакцию, которая стремится дважды использовать один и тот же вход. Это привело бы к сбою всей инфраструктуры биткоина. Кроме того, злонамеренные майнеры, которые проигнорировали бы вознаграждение за блок в размере 12,5 BTC (приблизительно $80 000), теоретически могли привести к разрушению всей экосистемы.
Ложь во благо или простое невежество?
Возможно, из-за возможных катастрофических последствий разработчики решили сохранить баг в секрете, чтобы выиграть время для его исправления.
В отчёте, сделанном 20 сентября, разработчики объяснили, что команда приняла все необходимые меры для поощрения немедленного обновления ПО и повышения осведомлённости заинтересованных участников, вместе с тем откладывая публикацию полной информации об уязвимости, чтобы получить время для модернизации систем. Разработчики Bitcoin Core решились раскрыть масштаб уязвимости только после того, как большая часть хешрейта биткоина была обновлена до новой версии ПО. В заявлении Bitcoin Core говорилось:
Мы не знаем о каких-либо попытках воспользоваться этой уязвимостью. Тем не менее по-прежнему критически важно, чтобы пользователи применяли последние патчи для устранения возможности больших реорганизаций, майнинга недействительных блоков или одобрения недействительных транзакций.
Кто обнаружил баг?
Одним из тех, кто помог устранить эту критическую ошибку, был разработчик Bitcoin Core Кори Филдс, который в начале года обнаружил одну из серьёзнейших уязвимостей Bitcoin Cash — настолько разрушительную, что, по словам Кори, она могла сделать безопасные транзакции в сети Bitcoin Cash невозможными. Это полностью подорвало бы функциональность (и, следовательно, цену) криптовалюты.
Реакция сообщества
Пользователи биткоина сильно критиковали команду разработчиков Bitcoin Core за то, каким образом та выкатила патч и «горячее» сообщение об ошибке. Решение опубликовать объявление без консультаций с участниками сетей альткоинов разочаровало многих сторонников биткоина. Среди тех, кто публично критиковал команду, был и так называемый «секретный агент» Bitcoin Core Джон Карвальго, который в серии твитов описал процесс принятия решений командой «за закрытыми дверями».
Событие стало ещё одним поводом для споров между сторонниками биткоина и Bitcoin Cash. Однако множество пользователей биткоина поблагодарили разработчиков за их тяжёлый труд на добровольной основе.
Возможные последствия
Несмотря на то, что ошибка исправлена, остаётся вопрос: что произошло бы, если бы её вовремя не устранили? Многие спрашивали, удалось ли кому-то воспользоваться уязвимостью, чтобы создать «кучу фейковых биткоинов». Кто-то даже обнаружил, что в тестнете в результате уязвимости было создано 0,1 биткоина.
Ответы на эти вопросы предоставлены командой Bitcoin Core в её последнем заявлении:
Хранимые средства не подвержены и никогда не подвергались риску. Даже если бы кто-то в полной мере воспользовался ошибкой, теоретический ущерб хранимым средствам был невозможен. Однако на данный момент остаётся небольшой риск раскола блокчейна. При таком расколе транзакции могут быть отменены после их полного подтверждения. Поэтому в течение следующей недели или около того вы должны учитывать, что есть небольшая возможность отмены любой транзакции, у которой менее 200 подтверждений.
Питер Уил, один из разработчиков биткоина, заверил, что если бы этой ошибкой кто-то воспользовался, то она была бы уже замечена любым новым узлом.
Позже он добавил, что в случае, если бы такая ошибка была использована кем-то после выпуска обновлений, «на всех узлах версии 0.14.0 произошёл бы сбой, и все, кто обновился, увидели бы предупреждение о том, что они не находятся в основном блокчейне».
Всё хорошо, что хорошо кончается
Таким образом, децентрализация и прозрачность биткоина свелись к минимуму, на что указывает описанная ситуация с уязвимостью CVR-2018-1744, когда ответственные решения принимались меньшинством. Но чего только не сделаешь перед страхом потери миллиардов долларов.
Вероятность сбоя всей системы была высокой. Недаром уязвимость в разных источниках описывается как «очень страшная», «основная», «катастрофическая» и одна из трёх из четырёх самых серьёзных ошибок, когда-либо найденных в коде биткоина.