В ходе недавней атаки на сеть Эфириума злоумышленнику удалось существенно замедлить работу сети, используя опкод Excodesize; в разгар атаки, время генерации блоков достигало 60 секунд.
Атака не была бесплатной для злоумышленника: стоимость газа, использованного в спам-транзакциях, составляла 4,5–5 долларов в минуту в пересчете по текущему курсу эфира.
Комментируя произошедшее, Виталик Бутерин написал в блоге, что уже готовы изменения в коде клиента, с помощью которых можно будет обрабатывать атакованные блоки существенно быстрее, чем это делается в последнем релизе. Однако, команда хочет быть до конца уверенной, что
1) усовершенствования охватывают все атакованные блоки,
2) сами апдейты не станут источниками уязвимости нехватки памяти,
3) учтены все возможные модификации атаки.
Отвечая на вопрос, «Чего хотел добиться атакующий»?, Бутерин ответил:
«Лично я думаю, это кто-то из тех, кому не нравится наша идеология».
Майнерам: Увеличение лимита газа
«Мы призываем майнеров увеличить лимит газа до 1.5 миллиона, чтобы приложения и смарт-контракты могли нормально выполняться», – из блога Бутерина.
Одним из поводов к такому обращению стало заявление команды стартапа FirstBlood: краудсейл токенов 1SŦ, который должен был начаться 26 сентября, оказался под угрозой из-за того, что лимит газа был снижен чтобы противостоять атаке – организаторы не могли развернуть смарт-контракт, управляющий продажей токенов.
В то же время, идет активное обсуждение перспективных изменений на уровне протокола, чтобы автоматические балансировать стоимость газа для проблемных опкодов.
В настоящее время Фонд Эфириума рекомендует запускать клиенты geth и Parity со следующими параметрами:
- Geth с флагами: –cache 1024 –targetgaslimit 1500000 –gasprice 20000000000
- Parity с флагами: –cache-size-db 1024 –gas-floor-target 1500000 –gasprice 20000000000 –gas-cap 1500000
Согласно Бутерину, это увеличит размер кэша, уменьшит количество обращений узлов к диску, и уменьшит газ-лимит в 3 раза, что в свою очередь, во столько же раз уменьшит время обработки блока.
Механизм консенсуса не затронут атакой
По словам Бутерина, механизм консенсуса не был нарушен (то есть, не произошло форка), все клиенты Эфириума продолжали работу. Атака была, в основном, подавлена к 22 сентября, и к 25 сентября работа сети восстановлена.
В течение ближайшей недели в основных клиентах Эфириума будут реализованы более стабильные способы решения проблемы и риск аналогичных атак будет существенно снижен.
Эти способы включают:
- Апдейт в коде майнеров, который будет автоматически понижать газ-лимит в два раза, если майнер фиксирует, что время генерации блока более чем на 5 секунд превышает нормативное (14 сек). Бутерин подчеркивает, что это только изменение стратегии майнера, а не софт- или хардфорк.
- Изменения числовых параметров в настройках кэша.
- Отдельное увеличение кэша для Excodesize, потому что операции read именно этого оператора занимают гораздо больше времени, чем другие операторы, задействующие множественные операции ввода-вывода.
- Локальный (на диске) кэш состояния сети.
Фонд Эфириума также планирует заменить базу данных leveldb на более оптимизированную версию, возможность глубокой модернизации рассматривает и команда Parity. Однако эти модернизации – дело более отдаленного будущего.
Возможные изменения на уровне протокола
В будущем возможны изменения базового низкоуровневого протокола. В следующем релизе Metropolis была бы полезной функция, увеличивающая стоимость газа для опкодов, которые совершают операции чтения состояния системы, или обращаются к внешним акаунтам.
Повышения стоимости газа до 500 000 минимум, скорее всего будет достаточно. Однако реализовывать выполнение этой функции нужно так, чтобы это не отразилось на работе существующих контрактов. Для реализации этой функции будет достаточно EIP90.
Для реализации предлагаемых действий необходимо будет дополнительно понизить ограничение на максимальное количество байтов, которое может прочитать транзакция; помимо защиты от атак, это снизит размер доказательств Меркла. В качестве побочного эффекта это поднимет уровень безопасности легкого клиента и шардинга.
В целом, атака оказала положительный эффект на сеть. Несмотря на то, что почти все разработчики в момент атаки находились в Шанхае на конференции DevCon-2, меры были приняты максимально быстро: вектор атаки был локализован и последствия минимизированы. В результате, атака стала хорошим стресс-тестом системы.
И последнее: краудсейл FirstBlood (см. выше) все-таки состоялся, так как лимит газа был к этому времени повышен. Менее чем за 20 минут было продано токенов 1SŦ на сумму свыше 5.5 миллиона долларов. Интересно, что синхронно с началом продаж токенов (на одном и том же блоке) снова началась атака спамом транзакций. Атака закончилась сразу с окончанием продаж токенов. В результате, бенефициарами атаки стали пользователи китайской биржи Yunbi: биржа аккумулировала большое количество заявок на покупку 1SŦ и провела их на первых минутах продажи. Всего на заявки Yunbi пришлось более 90% выкупленных токенов. Многие частные инвесторы не успели оформить заявки, из-за замедления транзакций, вызванного этим рецидивом атаки.