Уязвимость, получившая название CVE-2018-17144, существовала в коде биткоина с релиза версии Bitcoin Core 0.14.0 и могла привести к DoS-атаке и к инфляции биткоина. Однако сообщение о ней биткоин-разработчики получили лишь полтора года спустя — от загадочного анонима. Восстанавливаем хронологию событий.

баги в биткоине

Твиты с упоминанием бага начали появляться 18 сентября. Вечером того же дня в твиттере биткоин кэша появилось сообщение с саркастичным хэштегом #BestDevelopersInTheWorld: «Критический баг в [механизме] консенсуса в ПО Bitcoin Core (патч уже выпущен) позволил бы злоумышленнику убить 95% биткоин-нод».

Однако с появления отрывочной информации об обнаруженном баге сообществу пришлось ждать полного официального отчета несколько дней — он был опубликован на сайте Bitcoin Core 20 сентября.

Один из Core-разработчиков Лука Дашр заявил, что «только майнеры могли эксплуатировать баг за определенную цену, так что все зависит от ваших приоритетов — вы можете не захотеть прерывать выходной». Но стоимость атаки была бы лишь относительно большой и равнялась текущей награде майнера (12.5 биткоина, или $80,600). Зато взамен хакер мог бы выпускать биткоины свыше установленной фиксированной эмиссии и осуществлять двойное расходование, по сути, на любую сумму.

В посте, опубликованном на Bitcointalk на выходных, модератор Bitcointalk и сабреддита r/bitcoin Theymos назвал этот баг худшим с 2010 года. Тогда сгенерированный 74638 блок содержал транзакцию размером 184.4 миллиарда биткоина, что в 8780 раз превышало совокупную эмиссию биткоина. Хакер обнаружил, что код для проверки транзакций на потраченные монеты не работал для слишком больших транзакций. Сатоши и другие биткоин-разработчики выпустили обновление ПО, но сеть с миллиардами лишних монет успела просуществовать 9 часов.

Официальное заявление

20 сентября разработчики Bitcoin Core признались, что приняли решение скрыть одну из двух обнаруженных уязвимостей, «чтобы как можно быстрее выпустить обновления». «Было решено начать с патча и объявления наименее сложной DoS-уязвимости, одновременно связываясь с майнерами, бизнесами и другими пострадавшими системами, при этом отложив полноценное описание ситуации, чтобы дать системам время на обновление», — говорится в заявлении на сайте Bitcoin Core.

Уязвимость содержалась в версиях Bitcoin Core начиная с 0.14.0, когда была добавлена оптимизация, которая позволяла избегать затратных проверок того, что множественные входы одной транзакции не расходовали один и тот же вход дважды. А в Bitcoin Core 0.15 было внесено еще одно изменение: вместо утверждения, что выход, помеченный как израсходованный, ранее не расходовался, система просто утверждала, что он существует. Таким образом, в Bitcoin Core 0.15.X, 0.16.0, 0.16.1 и 0.16.2 при попытке двойного расходования выхода транзакции в рамках одной транзакции внутри блока (того, в котором расходуемый выход был создан), система бы выдала ошибку утверждения. Однако если выход, который пытаются повторно израсходовать, был создан в предыдущем блоке, майнеры могут затребовать уже потраченную сумму дважды и таким образом осуществить инфляцию биткоина.

В ночь с 17 на 18 сентября Bitcoin Core опубликовал две версии клиента, которые не содержат обнаруженные баги: Bitcoin Core 0.17.0rc4 и Bitcoin Core 0.16.3. На момент публикации официального заявления (20 сентября) разработчики Core писали, что, по их предположениям, более половины хэшрейта биткоина уже использует обновленные ноды.

Объявления с призывом обновить ПО публиковались на Reddit, Bitcointalk и в Twitter. «У вас должна быть запущена версия Bitcoin Core 0.16.3 и никакая другая. Более старые версии не должны существовать в сети. Если вы знаете кого-либо, кто имеет более старую версию, скажите им обновить ее как можно скорее», — пишет Theymos в посте, закрепленном на верху сабреддита r/bitcoin.

Однако в понедельник, 24 сентября, Лука Дашр опубликовал диаграмму, на которой видно, что более 87% сети все еще может пострадать от бага. И такая медлительность майнеров вызвала много вопросов, в том числе и к идеалу децентрализации. «Это продолжается каждый день, мы доверяем майнерам и теряем доверие к нам из-за претензий на децентрализованность сети», — написал Дашр. «Вот что происходит, когда люди фетишизируют “децентрализацию”, не задумываясь о ее сути. На данный момент ты обновил свою ноду, и для тебя проблема решена. Кто думает о давно забытой ноде Боба на Raspberry Pi?», — написал Мэтт Коралло.

А по мнению Эмина Гюн Сирера, «процент сети, не осуществивший апгрейд… соответствует экономически бесполезным нодам. Если бы они делали или влияли на что-то полезное, то кто-то бы озаботился тем, чтобы их обновить».

Coindesk отмечали, что даже не все «кровно» связанные с биткоином проекты оперативно выпустили патч. Первыми это сделали Omni Layer, Bitcoin Cash, Litecoin.

Помимо очевидной угрозы атаки, необновление ПО грозит майнингом невалидных блоков, невалидными транзакциями и даже форком сети (и когда получившиеся две ветки при благополучном исходе сольются обратно в одну, транзакции с «невыжившей» цепочки будут автоматически отменены). Theymos отметил, что последний сценарий маловероятен, но все же посоветовал предпринять меры предосторожности и «в ближайшую неделю учитывать, что любая транзакция с менее чем 200 подтверждениями может быть отменена».

Хронология событий

17 сентября 2018 (время UTC):

 14:57 Кто-то анонимно сообщает о критической уязвимости (о DoS-баге) биткоин-разработчикам из разных проектов: Питеру Вуйле, Грегори Максвеллу и Владимиру Ван дер Лаану из Bitcoin Core; разработчику под ником deadalnix из Bitcoin ABC и разработчикук sickpig из Bitcoin Unlimited. Как отмечает Theymos, «поскольку тонны альткоинов основаны на Bitcoin Core, это бы одновременно повлияло на огромную часть крипто-пространства».

Позднее «ответственность» за сообщение о баге взял на себя разработчик Bitcoin Cash и Bitcoin Unlimited под ником Awemany. Его профиль на Medium содержит только одну историю, опубликованную 22 сентября, под названием «600 микросекунд». Именно на столько один из Core-разработчиков Мэтт Коралло хотел оптимизировать валидацию блоков, опубликовав соответствующее предложение на GitHub в 2016. Это изменение Awemany винит в обнаруженном, «определенно самом катастрофическом баге за последние годы и одном из самых катастрофических багов за все время существования биткоина».

 15:15 Грегори Максвелл сообщает о баге Кори Филдсу, Сухасу Дафтуару, Алексу Мокросу и Мэтту Коралло.

 17:47 Мэтт Коралло обнаруживает еще один баг — инфляционный, который может позволить майнерам-злоумышленникам выпускать любое количество новых биткоинов. «Мы быстро определили, что проблема также была в инфляционной уязвимости и [она] имела те же корни и то же решение», — говорится в сообщении.

 19:15 Мэтт Коралло пытается связаться с CEO майнингового пула Slushpool, чтобы по мере готовности как можно быстрее передать ему патч, устраняющий уязвимость.

 20:15 Джон Ньюбери и Джеймс О'Бирн, разработчики Bitcoin Optech, проинформированы об уязвимости и помогают оповещать компании о том, что скоро будет выпущен патч для устранения DoS-уязвимости.

 20:30 Мэтт Коралло говорит с CTO и CEO Slushpool и передает им патч, сообщая только о DoS-уязвимости.

 20:48 Slushpool подтверждает, что осуществил апгрейд.

 21:30 Анонимному информатору направлен ответ с благодарностью.

 21:57 На Github опубликован патч и тестовая демонстрация DoS-бага.

 21:58 Bitcoin ABC публикует свой патч.

 22:07 Членам Bitcoin Optech и другим разработчикам отправлен email со ссылкой на Github и патч.

 23:21 Добавлена версия Bitcoin Core 0.17.0rc4 с устранением бага.

18 сентября 2018:

 00:24 Добавлена версия Bitcoin Core 0.16.3 с устранением бага.

 20:44 Bitcoin Core выпустил бинарные файлы и объявления.

 21:47 Bitcointalk и Reddit опубликовали баннеры, призывая обновить ПО.

19 сентября 2018:

 14:06 Рассылка от Питера Вуйле с еще одним призывом апгрейдить ПО.

Не лучшие в мире?

Многие разработчики и биткоин-энтузиасты взяли на себя ответственность за необнаружение бага. «Я беру полную ответственность за то, что управлял нодой, которая содержала баг CVE-2018-17144. Никто не заставлял меня использовать ПО с уязвимостью», — написал президент Nakamoto Institute Майкл Гольдштайн. «Я ответственен за баг CVE-2018-17144», — написал Джон Ньюбери. «Баги случаются. Это факт. Я не критикую их за то, что был этот баг. Я критикую идиотов-максималистов, которые считают, что Core-разработчики — это кто-то наподобие бога и определенно лучшие разработчики в мире», — сказал Крис Пасиа, ведущий разработчик OpenBazaar.

Theymos также отмечает, что за последние годы Core-разработчики «проделали хорошую работу» и в случае с последним багом смогли предоставить обновленное ПО, которое защитило сеть. «Я благодарен за их работу и старание», — пишет Theymos, одновременно отмечая, что «тот факт, что баг… смог существовать с 0.14.0 по 0.16.2, был бесспорно главной ошибкой» и, если политика Bitcoin Core не будет изменена, в будущем ситуация неизбежно повторится. «И нам может не так повезти в следующий раз», — пишет Theymos.

Однако он возлагает ответственность не только на основных разработчиков, но и на все сообщество — прежде всего, на многочисленные проекты, которые связаны с биткоином и используют его в своей деятельности, но при этом никак не помогают Core-разработке: «Показывать пальцем будет не очень конструктивно, но и также недостаточно будет сказать “нужно просто больше следить за кодом” и двинуться дальше. Этот баг был очень тонким, и я сомневаюсь, что его можно было найти, просто смотря на код… Более того, этот баг, возможно, не был бы обнаружен и при стандартном юнит-тестировании, поскольку ошибка была в логике высшего порядка. Возможно, все крупные биткоин-компании должны выделить для Core квалифицированных специалистов. Эту уязвимость можно было обнаружить с помощью сложных методов тестирования, и в настоящий момент многие компании не вносят вклад в развитие Core… Я не знаю точно, как можно не допустить повторения этого, но я знаю, что для сообщества будет ошибкой отмахнуться от этого бага просто потому, что это закончилось преимущественно безболезненно на этот раз».