Среди главных аргументов в пользу криптовалют всегда были надёжность и безопасность блокчейна. И действительно, главные криптовалюты (биткоин и эфир) имеют репутацию самых безопасных цифровых активов или платёжных систем в истории. Но некоторым этого мало: они заявляют, что взломать криптовалюты невозможно. Распространение мифа об этой «неуязвимости» ставит таких криптовалютных энтузиастов в неловкое положение, когда события разворачиваются не в их пользу.
В прошлом месяце неизвестный хакер серьёзно подорвал репутацию криптовалюты Verge. Ему удалось захватить сеть три раза с интервалами в несколько часов с 4 по 6 апреля (а потом ещё раз), не позволяя любому другому пользователю совершать какие-либо платежи. Хуже того, в этот промежуток времени он мог майнить 1560 монет Verge (примерно на $80) в секунду. Конечно, это была катастрофа.
И что в итоге? Криптовалютный энтузиаст Дэниел Голдман попытался разобраться в своей статье для The Abacus Crypto Journal. Предлагаем вашему вниманию сокращённый перевод.
Спуфинг временной метки, или Честные ошибки против опасной лжи
Корень эксплойта — в особенности Verge, которая состоит в возможности создавать «неточные» временные метки. В протоколе блокчейна отдельные транзакции группируются вместе в один блок, который затем подтверждается целиком. Создание каждого блока имеет свою временную метку. Даже когда протокол блокчейна работает правильно, эти временные метки иногда могут идти не в хронологическом порядке; то есть блок 100 может иметь временную метку после блока 101.
Это происходит потому, что в децентрализованных сетях, которые не предоставляют какие-либо особые полномочия третьим лицам, точное соблюдение синхронизации времени не столь важно. Учитывая непредсказуемое расхождение во времени, которое требуется для распространения данных через p2p-сеть, вполне возможно, что время в блоках будет указано «не по порядку», даже когда все стороны честны. Другими словами, справедливо допускать некоторую гибкость; в случае с Verge (до взлома) протокол разрешал узлам «не соглашаться» относительно текущего времени с интервалом не больше двух часов.
Точкой входа для хакера был спуфинг временных меток, в котором добывались блоки из прошлого, но в пределах двухчасового окна, поэтому их могли принимать другие узлы.
Сложность майнинга, или Окружающие сеть стены
Для децентрализации Verge необходимо обеспечить участие мелких устройств (например, ноутбуков) в запуске программного обеспечения сети. Это в свою очередь означает ограничение объёма платёжной активности в сети, то есть установку точного времени блока (и, как следствие, ограничение на транзакции сети в секунду). Сеть Verge ограничивалась одним блоком в 30 секунд. Теперь можно спросить (учитывая, что сеть децентрализована), как это организовано. Что мешает участникам находить блоки с гораздо большей скоростью, тем более, что за принятый блок майнер получает вознаграждение?
Ответ — доказательство выполнения работы (Proof-of-Work). Для того чтобы блок считался действительным в сети, он должен содержать решение криптографически сложной вычислительной задачи. Характер этой задачи такой, что её сложность может быть скорректирована. Сложность нахождения блоков Verge постоянно корректируется на основе скорости подтверждения блока; если больше людей решат потратить больше вычислительной мощности на майнинг Verge, что позволит быстрее находить блоки, протокол повысит сложность майнинга, и наоборот. Таким образом, сеть Verge постоянно реагирует на изменение обстоятельств в реальном мире (стоимости майнинга, цены криптовалюты на рынке), чтобы сохранить баланс в системе.
Алгоритм, который Verge использует для вычисления текущей сложности, известен как Dark Gravity Wave; он рассчитывает среднюю скорость подтверждения блока в рамках двухчасового окна. Тут важно то, что сложность майнинга — это функция частоты последних блоков, а нахождение нового блока связано с их временными метками.
Следовательно, возникает проблема: если создаётся достаточно много ошибочных временных меток, то все они становятся недействительными. И именно это сделал хакер. После изучения данных блокчейна выяснилось, что на протяжении всего времени взлома (или взломов) каждый последующий блок был отправлен с временной отметкой примерно за час до настоящего времени, запутывая алгоритм майнинга. Если бы протокол владел человеческим языком, он говорил бы что-то вроде «О нет! Что-то не очень много блоков было принято! Майнинг стал слишком сложным — давайте сделаем его проще!» Поскольку временные метки постоянно подделывались, протокол постоянно уменьшал сложность, пока добыча не стала весьма лёгкой. Чтобы дать общее представление: средняя сложность за часы до первоначальной атаки была 1393093,39131, а во время атаки она достигла 0,00024414, то есть сложность уменьшилась на 99,999999%. Такое резкое уменьшение сложности означает большую вероятность подтверждения блоков — в нашем случае стал подтверждаться примерно один блок в секунду.
Суть атаки в том, как она обходит барьер сложности майнинга, а не пытается прорваться через него. Если безопасность, обеспечиваемая майнингом, — это окружающие сеть стены, и они слишком крепкие или высокие, то нужно просто найти способ обойти их.
Однако снижение сложности — это только половина истории. Сложность майнинга сама по себе не дала бы злоумышленнику особого преимущества. С резко сниженной сложностью нахождение блоков становится легче для хакера, но также и для всех остальных; майнеры всё ещё конкурируют друг с другом, как и раньше. Другими словами, независимо от сложности одному злоумышленнику всё равно понадобится 51% хешрейта сети, чтобы её захватить, что представляет собой непростую задачу.
Однако наш хакер действительно захватил сеть и смог сделать это с гораздо меньшим процентом хешрейта. Ему позволил это сделать второй компонент эксплойта, связанный с использованием Verge нескольких алгоритмов хеширования.
Майнинг Verge, или Когда пять алгоритмов ничем не лучше одного
Как правило, криптовалюты на основе Proof-of-Work используют один алгоритм хеширования, из которых наиболее распространён SHA-256. Тем не менее Verge позволяет майнерам использовать любой из пяти различных алгоритмов (Scrypt, X17, Lyra2rev2, myr-groestl и blake2s). Аргумент в пользу использования нескольких алгоритмов состоит в том, что, по мнению критиков битокина, со временем майнинговая индустрия главной криптовалюты стала слишком специализированной и централизованной, поскольку большую часть биткоинов добывают на ASIC-майнерах в нескольких крупных пулах. Эта тенденция к централизации противоречит фундаментальной идее биткоина, поэтому криптовалюта, использующая несколько алгоритмов хеширования, могла бы стать альтернативой «централизованным» монетам. Управление пятью различными алгоритмами с точки зрения аппаратного обеспечения сложнее, чем контроль только одного, поэтому монета будет более децентрализованной.
Итак, что мы имеем: правильное функционирование системы криптовалюты включает в себя сохранение 30-секундного интервала нахождения блоков, сохранение всех пяти алгоритмов экономически выгодными и предотвращение доминирования одного из них. Для этого каждый алгоритм имеет собственный параметр сложности, который настраивается независимо от остальных четырёх. Иными словами, сложность майнинга на Scrypt изменяется так, чтобы достигать 30-секундного интервала, то же самое происходит с X17 и остальными.
Это значит, что поддельная временная метка фактически не уменьшила сложность майнинга всей сети, а только опустила её для тех, кто майнил на одном из пяти алгоритмов; в нашем случае это был Scrypt. Таким образом, майнеры на Scrypt легко могли зарабатывать новые монеты, в то время как майнеры на других алгоритмах были вынуждены работать так же, как и раньше. Злоумышленнику нужно было конкурировать с майнерами только на этом алгоритме. Требуемый для захвата сети хешрейт опустился с 51% (захват всей сети) до 10% (преимущество над другими майнерами на Scrypt).
10% следуют из предположения, что на каждый из алгоритмов приходится равная доля мощности — 20%. Но в реальности всё оказалось иначе. Приводимые сообществом аргументы (наличие асиков на Scrypt, которые ещё не были развёрнуты, резервные ресурсы, доступные для аренды через Nicehash) показывают, что Scrypt в момент атаки был самым доступным из пяти алгоритмов для захвата сети. Можно с уверенностью предположить, что требуемый для захвата сети хешрейт был меньше 10%; по некоторым очень условным оценкам на Reddit, он составлял всего 0,4%.
Подведём итоги
Спуфинг временной метки позволил резко снизить сложность майнинга; использование Verge пяти алгоритмов означало, что достаточно свести к минимуму сложность только одного из них, что значительно упростило захват сети; экономический статус этого алгоритма ещё больше упростил захват; и, наконец, резкое сокращение времени добычи блоков сделало атаку в 30 раз более прибыльной.
Что можно почерпнуть из всего этого? Во-первых, эксплойт с использования временных меток для понижения сложности на самом деле известен достаточно давно и даже получил название — time-warp. Этот вектор атаки обсуждался на биткоин-форумах много лет назад. В сети Verge эта атака сработала во многом из-за использования более нового алгоритма регулирования сложности Dark Gravity Well, где сложность меняется на каждом новом блоке, в отличие от, скажем, биткоина, где она корректируется только на каждом 2016-м блоке. Это позволяет утверждать, что сеть биткоина может быть атакована таким способом только один раз в две недели против каждых 30 секунд у Verge.
Во-вторых, использование пяти алгоритмов, которое представляется достойным экспериментом для децентрализации экономики монеты, вводит новые сложности, повышающие вероятность возникновения непредвиденных уязвимостей.
В-третьих, разработчики программного обеспечения тоже люди. Даже когда основные принципы безопасности кажутся безупречными, всегда есть место для ошибки. Программное обеспечение не всегда работает так, как мы этого хотим, и то, что сбои происходят и могут привести к потере денег, в 2018 году никого особенно не шокирует. Но когда это программное обеспечение, по сути, представляет собой деньги, дополнительный уровень безопасности необходим.