Искривления времени, уязвимости майнинга, DOS-атака и многое другое.
Майнинг в Verge: когда 5 алгоритмов – это перебор
Традиционно в криптовалютах на основе протокола proof-of-work блоки добываются при помощи одного алгоритма, чаще всего – SHA-256. В Verge же можно было использовать 5 разных алгоритмов (для любознательных – Scrypt, X17, Lyra2rev2, myr-groestl и blake2s.). Причина использования нескольких алгоритмов описана ниже.
Некоторые критики Биткойна утверждают, что со временем майнинг Биткойна стал слишком специализированным и централизованным, большая часть майнинга выполняется на ASIC (сокр. от «application-specific integrated circuit», интегральная схема специального назначения) – устройствами, созданными исключительно для майнинга валюты, а большая часть майнинга Биткойна выполняется в нескольких майнинговых пулах группами майнеров, которые объединяют свои ресурсы и разделяют заработанное между собой. Эти тенденции к разным типам «централизации», по их словам, противоречат фундаментальному принципу криптовалют. Использование коина с несколькими алгоритмами майнинга является противовесом для таких тенденций. Смысл заключается в том, что управление пятью различными алгоритмами с точки зрения оборудования, производства и управления ресурсами неизбежно будет сложнее, чем контроль одного алгоритма, что позволит Verge достичь большей децентрализации и распределенности майнинга.
Ситуация такова: единственный способ добиться корректной работы – а понятие «корректная работа» в этом случае включает в себя сохранение 30-секундного интервала между блоками, поддержание экономической целесообразности всех пяти алгоритмов для майнеров и недопущение доминирования одного алгоритма (что лишило бы смысла весь эксперимент) – это сделать так, чтобы каждый алгоритм имел собственный параметр сложности, который бы настраивался независимо от остальных четырех. Иными словами, сложность майнинга в алгоритме Scrypt настраивается так, чтобы соблюдать 30-секундный интервал для каждого блока, как в X17 и других алгоритмах.
Это означает, что наш хакер в действительности не снизил сложность майнинга для всей сети; он понизил ее только для тех, кто майнил при помощи одного из пяти алгоритмов – Scrypt. И пока майнеры Scrypt наслаждались смехотворно легким майнингом, для остальных майнеров, работающих на других алгоритмах, сложность задач не уменьшилась, а значит, вся их совокупная мощность не поможет обеспечить безопасность сети. Это означало, что злоумышленник работал только с алгоритмом Scrypt и ему приходилось конкурировать с другими пользователями, которые делали то же самое; таким образом, требуемая хеш-мощность для нашего атакующего составляла не более 50% (доминирование над всей сетью), а всего лишь более 10% (доминирование над другими майнерами Scrypt).
Сейчас мы уйдем в область предположений, но похоже, что ситуация была еще хуже. Мы предположили цифру в 10%, исходя из того, что на каждый алгоритм надо выделять примерно одинаковое количество ресурсов (такова суть механизма настройки сложности майнинга). В реальности, однако, аксиомы свободной рыночной экономики соблюдаются далеко не всегда. В сообществе считается, что различные факторы – например, существование неактивированных еще ASIC для Scrypt, а также свободных ресурсов, доступных для аренды через Nicehash и т. д. – привели к тому, что доминирование в майнинге на Scrypt во время атаки обходилось намного дешевле, чем на любом другом из четырех алгоритмов. Можно с уверенностью предположить, что требуемая скорость хеширования в итоге была намного меньше 10% – по некоторым предварительным оценкам, приводившимся на Reddit, хеш рейт мог составлять всего 0,4%.
Подведем итог: подделка временных отметок позволила резко снизить сложность майнинга; использование пяти алгоритмов означало, что можно было понизить сложность только для одного из них, что значительно упростило захват всей сети; экономический и производственный статус этого конкретного алгоритма майнинга еще больше упростил захват; и наконец, вследствие пониженной сложности майнинга, резко сократилось время на формирование блоков, что сделало атаку примерно в 30 раз более прибыльной.
Извлеченные уроки
Какой вывод можно сделать из этой ситуации? Краткосрочные последствия взлома были предсказуемо хаотичными и непонятными. Спустя несколько дней главные разработчики исправили несколько ошибок при помощи утилит, в которых также могут закрасться ошибки, и в конечном итоге в сети провели хард-форк, что могло изначально произойти и случайно (ну или не случайно). Что касается реакции в мире, то в течение недели после взлома цена Verge увеличилась на 30%, а на следующей неделе было объявлено, что валюта Verge будет приниматься в качестве платы за подписку на pornhub.com. Как самый большой взлом криптовалюты на уровне протокола мог привести к росту этой валюты в цене и, позже, к заключению партнерства с самым посещаемым порносайтом – я оставлю этот вопрос открытым. Лично я считаю, что дело просто в том, что в мире нет смысла, а люди совершенно свихнулись.
Но я отвлекся. Мысля более глобально, мы можем извлечь из этой ситуации несколько уроков:
Во-первых, прием использования временных меток для искусственного понижения сложности на самом деле был известен довольно давно, и даже успел получить название – уязвимость «time-warp» («искривление времени»). Несколько лет назад на форуме Биткойна обсуждался вектор атаки. В некоторой степени, использование более нового алгоритма корректировки сложности Dark Gravity Well, в котором сложность настраивается с каждым новым блоком, помогло реализовать атаку на Verge. В Биткойне же сложность изменяется только каждые 2016 блоков. Несмотря на то что такая растянутая во времени и прерывистая настройка сложности может показаться странным решением, взлом Verge ясно дал понять, что на самом деле это мера безопасности: если в Биткойне и есть какой-то способ несколько снизить сложность майнинга, то нападающий может делать это только один раз в каждые 2 недели, что делает результаты атаки незначительными по сравнению с Verge, где хакеры могут понижать сложность майнинга каждые 30 секунд.
Интересно, что одно из предполагаемых преимуществ Dark Gravity Wave заключается в том, что он должен быть невосприимчив к уязвимости «time-warp». Учитывая, насколько решительно это предположение было опровергнуто, другие валюты, использующие этот алгоритм, должны как минимум занервничать.
Что касается использования пяти алгоритмов: хотя на первый взгляд это кажется достойным экспериментом в экономически стимулирующей децентрализованной среде, он вводит новые сложности, которые неизбежно увеличивают вероятность возникновения непредвиденных уязвимостей.
В обоих случаях этот взлом представляет собой веский аргумент в пользу проверенных механизмов, и призывает проявлять осторожность с усложнением и введением неоправданных рисков, связанных с финансовыми активами людей. В этих вопросах команда Биткойна проявила себя на высоте.
Вопрос стоит несколько шире: разработчики программного обеспечения, хоть они и неохотно это признают, в конечном счете всего лишь люди. Даже когда основные принципы безопасности кажутся совершенно надежными, всегда может найтись место для ошибки. Возникают неожиданные атаки, компромиссы не всегда оправдывают себя и, конечно, никто не отменял возможность возникновения старых добрых багов. Программное обеспечение не всегда работает так, как нам того хочется, и никто в 2018 году не удивится, что подобные баги могут привести к потере средств. Но когда программное обеспечение само является деньгами, нам нужно быть особенно осторожными.
Учитывая, что у большинства из нас нет свободного времени для проведения тщательного анализа кода каждого проекта, в который мы инвестируем, лучшая защита от катастрофы – это доверие к проверенным системам с положительным опытом работы и консервативным подходом к разработке.
И если вы хотите сделать ставку на некоторые фонды в экспериментальных проектах, связанных с переводом денег, то вы как минимум должны осознавать риски. В конечном счете лучшая защита – это когда комьюнити требует обеспечить должные меры предотвращения будущих катастроф. Если я не ошибаюсь, то Джордж Сантаяна сказал: «Те, кто не может извлечь уроки из уязвимостей в системах безопасности прошлого, обречен повторять их снова и снова в будущем». Эти слова нужно помнить, чтобы мы неожиданно для себя снова не повторили ошибки прошлого.