Более года все версии Bitcoin Core содержали одну из самых ужасных ошибок в истории Bitcoin. В этой статье мы раскроем хорошие, плохие и злые (отсылка к фильму 1966 года "The Good, the Bad and the Ugly" - прим. переводчика) подробности об одной из самых неприятных ошибок Bitcoin Core на сегодняшний день.
Плохо, конечно, само существование ошибки, теперь зарегистрированной как CVE-2018-17144 в банке данных уязвимостей "Common Vulnerabilities and Exposures".
Ошибка появилась как часть апдейта Bitcoin Core 0.14.0, выпущенного в марте 2017 года для повышения производительности и связанного с маршрутизацией блоков. Вкратце, ошибка не давала узлам сети отвергать блоки, содержащие транзакцию, которая тратит одни и те же средства ("входы") несколько раз, что допускает нерегулярную форму двойных трат. Это при том, что одна из задач, решавшихся при разработке Bitcoin - предотвращение двойного расходования средств.
Эта серьезная проблема могла бы проявиться по-разному. Во-первых, версии Bitcoin Core с 0.14.0 по 0.14.2 (а в некоторых случаях и более новые версии) приняли бы блок, но в то же время признали бы, что что-то не так. Тем не менее, они не смогли бы точно сказать, что именно не так. В результате узел бы перестал работать и отключился. Таким образом, если бы недопустимый блок пробился к таким узлам - это могло бы вызвать крах сети. А это плохо...
Но дальше - хуже. В версиях Bitcoin Core с 0.15.0 до 0.16.2 было добавлено еще одно повышение производительности, которое допускало, что в некоторых случаях эти узлы даже не понимали, что что-то не так. В частности, если дважды потраченная монета не перемещалась в одном и том же самом блоке (что часто бывает), эти узлы приняли бы транзакцию и не блокировали бы как обычно. В гипотетическом, худшем случае, злоумышленник мог бы раздуть денежную массу Bitcoin, скопировав свои собственные монеты, и любой узел, работающий на Bitcoin Core версий с 0.15.0 по 0.16.2, принял бы эти монеты как валидные.
Технически, ошибка также могла привести к ветвлению блокчейна между затронутыми узлами (Bitcoin Core 0.15.0 до 0.16.2 и его форками) и незатронутыми узлами (в частности, Bitcoin Core 0.13.2 и более старыми, а также их форками). Однако это маловероятно, поскольку последняя категория, вероятно, не имела бы достаточного хэшрейта, чтобы создать хотя бы один блок в течение нескольких дней, не говоря уже о нескольких блоках. Поэтому, такие узлы просто остановились бы, ожидая действительного блока.
Тем не менее, ошибка, о которой идет речь, могла допустить одну из худших атак на Bitcoin в истории. Многих это отрезвляет, так как ошибка, потенциально приводящая к подобным тяжелейшим последствиям оставалась незамеченной около 18 месяцев.
Теперь хорошие новости. Первая и главная хорошая новость заключается в том, что эта ошибка никогда не была использована.
Вторая хорошая новость заключается в том, вероятность того, что эта ошибка могла бы быть вообще использована, крайне мала. Это связано с тем, что атака могла быть реализована только майнером, намеренно создающим атакующий блок, но не майнером, делающим это случайно или обычным пользователем.
Это означает, что майнер должен был бы сознательно рискнуть потерять вознаграждение за добытый блок в размере около 80 000 долларов. Подобная атака была бы замечена довольно быстро так как все происходит в публичном блокчейне. Достаточно быстро отчеты о сбоях заполнили бы чаты и форумы. В этот момент было бы выявлено, что некорректный блок фактически был вызван ошибкой.
Как и произошло в 2010 и 2013 годах, когда из-за ошибок в коде произошло ветвление блокчейна, большинство майнеров бы провели апгрейд или даунгрейд используемого ПО, отвергая атакующий блок и продолжая майнить честную ветку. Со временем, валидная ветка перевесит атакующую и даже уязвимые узлы переключатся на корректную ветку, оставляя атакующий майнер без вознаграждения за блок. Также подобный инцидент сразу же снизил бы рыночную цену атакуемой монеты, тем самым значительно снизив финансовую эффективность самой атаки.
Третья часть хороших новостей заключается в том, что разработчик с ником awemany ответственно раскрыл ошибку в первую очередь именно разработчикам, работающим над Bitcoin Core (а также над Bitcoin ABC и Bitcoin Unlimited). Первоначально ошибка была принята за ошибку отказа в обслуживании (DoS). Но, при дальнейшем рассмотрении, сотрудник Bitcoin Core и Chaincode Labs Мэтт Коралло (Matt Corallo) обнаружил, что эта же ошибка являлась еще и уязвимостью влияния на сеть. Ошибка была исправлена уже на следующий день и были выпущены версии Bitcoin Core 0.16.3 и релиз кандидат Bitcoin Core, 0.17.0. Между тем, группа участников Bitcoin Core, которая знала о проблеме, обратилась к ключевым игрокам в экосистеме Bitcoin и попросила их перейти на Bitcoin Core 0.16.3.
Четвертая часть хороших новостей заключается в том, что большинство майнеров в сети достаточно быстро обновили используемое ПО, а это означает, что даже если злоумышленник попытается использовать ошибку, он не продвинется далеко. Честные майнеры достаточно быстро преодолеют атакующую цепь, и в этот момент даже необновленные узлы будут воспринимать валидную цепочку как единственно верную. Однако, чтобы обезопасить свои транзакции, пользователям в настоящее время рекомендуется дождаться дополнительных подтверждений до принятия платежа.
Злые особенности... Исправление подобной ошибки может быть сложной задачей в открытой, децентрализованной, постоянно действующей сети, поддерживаемой программным обеспечением с открытым исходным кодом. Например, когда Bitcoin Unlimited в начале 2017 года исправил критическую ошибку, сам факт исправления уязвимости в коде показал ее потенциальным противникам, открыв окно атаки до того момента, пока исправление не будет развернуто на большинстве узлов сети.
Чтобы избежать таких атак, разработчики Bitcoin Core решили не сразу раскрывать серьезность ошибки общественности. Первоначально, скрыв полную информацию от майнеров и пользователей, они сообщили о DoS-уязвимости, но не про уязвимость влияния на сеть. Они надеялись, что DoS-уязвимость и настоятельные рекомендации станут достаточными причинами для обновления пользователями своего программного обеспечения, не привлекая внимание потенциальных злоумышленников.
Однако, не все разделяли этот подход. Поскольку ошибка попала под пристальное внимание, все больше людей начали самостоятельно выяснять, что ошибка была более серьезной, чем просто DoS-уязвимость. Некоторые из них раскрывали полные детали уязвимости, поставив сеть Bitcoin под угрозу атаки. После того как информация об об этой уязвимости была опубликована в Hacker News (хотя позже она была убрана), стало бессмысленно дальше держать ее в секрете.
К счастью, к моменту утечки подробной информации о проблеме, большинство крупных игроков майнинга Bitcoin уже обновило используемое ПО, обезопасив сеть от атаки, после чего Bitcoin Core опубликовали полную техническую информацию об ошибке.
Большое количество альткоинов, базирующихся на исходном коде Bitcoin, возможно, все еще уязвимо и факт публичной известности проблемы не снимает с них угрозы. Хотя, такие криптовалюты как Bitcoin ABC сразу же опубликовали обновления свое ПО, обезопасив свои сети от потенциальных атак.
По материалам Bitcoin Magazine
Читайте также
В Сальвадоре арестовали критика легализации биткоина
Национальная гражданская полиция Сальвадора выпустила заявление, что Марио Гомес был задержан в связи с расследованием финансового мошенничества.
Что ждет биткоин: поступательный рост до $100 тысяч или обвал?
Основная криптовалюта за последние дни показала резкий рост котировок, поднимаясь выше отметки 65 тысяч долларов впервые с апреля. На этом фоне не за горами достижение новых исторических максимумов. Достигнет ли биткоин отметки в 100,000 долларов в этом году, или рынок ждет коррекция?