Back to Blog

Гонка со временем и стратегией: о спасении AnySwap и извлеченных уроках

Phalcon
April 4, 2022
8 min read

18 января наша система мониторинга обнаружила атаку на проект AnySwap (также известный как Multichain). Уязвимость связана с некорректной функцией anySwapOutUnderlyingWithPermit(), механизм проверки которой можно было обойти для снятия одобренных токенов.

Хотя проект применял различные подходы (например, рассылку транзакций пользователям, как показано на Рисунке 1) для уведомления пострадавших, многие из них не успели предпринять своевременных действий (то есть отозвать разрешения) для защиты своих средств. В результате злоумышленники могли непрерывно проводить атаки, чтобы завладеть средствами жертв.

Рисунок 1: Проект уведомил жертву через сообщения в Ethereum
Рисунок 1: Проект уведомил жертву через сообщения в Ethereum

Чтобы защитить потенциальных жертв, после долгих обсуждений наша команда решила провести экстренное спасение средств из уязвимого контракта AnySwap (0x6b7a87899490EcE95443e979cA9485CBE7E71522) в сети Ethereum. В частности, мы могли перевести средства с уязвимого контракта на наш «белый» кошелек — мультисиг-кошелек (0xd186540FbCc460f6a3A9e705DC6d2406cBcc1C47) в Ethereum.

Чтобы сделать наше «белое» спасение прозрачным, мы задокументировали наши намерения в PDF-файле и поделились хешем этого файла с сообществом. Это позволило отличить наши действия по экстренному спасению от действий злоумышленников и в то же время не раскрыло деталей (поскольку уязвимость все еще могла быть использована). Мы проводили экстренное спасение с 21 января 2022 года по 11 марта 2022 года, и соответствующие сообщения были опубликованы для общественности, как показано ниже:

Рисунок 2: Наш анонс о проведении спасения
Рисунок 2: Наш анонс о проведении спасения
Рисунок 3: Анонс о прекращении спасения
Рисунок 3: Анонс о прекращении спасения

Экстренное спасение — задача не из легких. Действительно, существует ряд проблем, включая как технические, так и нетехнические вопросы, усложняющие успешный исход. Поскольку спасательная операция уже завершена, мы можем всесторонне проанализировать весь процесс и поделиться извлеченными уроками. Мы верим, что этот опыт поможет сделать экосистему DeFi безопаснее.

Ключевые выводы (TL;DR)

  • Существует конкуренция между различными участниками, включая «белых хакеров» (whitehats) и злоумышленников. С течением времени плата за использование Flashbots быстро росла.
  • Flashbots не всегда работали. Некоторые злоумышленники перешли к использованию обычного мемпула для проведения успешных атак, применяя сложные стратегии.
  • Некоторые злоумышленники «отмывались», возвращая часть украденных средств, в то время как оставшуюся часть оставляли себе в качестве вознаграждения. Это явление, хотя и не впервые, вызывает споры в сообществе, поскольку такая мотивация может быть несправедливой по отношению к добросовестным «белым хакерам».
  • Для убеждения сообщества хорошей практикой является заранее публично сообщать о своих действиях, не раскрывая при этом чувствительной информации.
  • Сообщество может работать сообща, чтобы проводить спасательные операции более эффективно. Например, создать механизм координации для уменьшения или исключения конкуренции между «белыми хакерами».

Далее мы сначала представим общую картину процесса спасения за этот период. Затем мы проиллюстрируем наш способ выполнения спасения и решенные задачи. После этого мы обсудим извлеченные уроки, а в конце предложим идеи/рекомендации, которые могут помочь защитить экосистему.

0x1 Спасательные операции и атаки

0x1.1 Общие результаты

Атаки и спасательные операции, которые мы наблюдали и исследовали в данном отчете, продолжались в течение нескольких месяцев, начиная с блока 14028474 (18 января 2022 года) по блок 14421215 (20 марта 2022 года).

Учетные записи, участвовавшие в спасении и атаках, представлены в следующей таблице. Для простоты указаны только первые четыре символа адреса EOA. Аккаунт является либо спасательным, либо атакующим. Стоит отметить, что тип аккаунта определялся на основе меток (labels) Etherscan.io или целевых адресов переводов, которые мы наблюдали.

Всего было 9 спасательных аккаунтов, которые спасли 483,027693 ETH (с комиссией 295,970554 ETH, т.е. 61,27% от общей суммы), и 21 атакующий аккаунт, который присвоил 1433,092224 ETH (с комиссией 148,903707 ETH, т.е. 10,39% от общей суммы). Стоит заметить, что цифры потерь являются приблизительными из-за сложных взаимодействий. Например, атакующий аккаунт мог стать спасательным после переговоров с AnySwap, и мы обсудим это явление позже. Последний столбец таблицы указывает комиссию, отправленную майнерам, которая использовалась для победы в конкуренции за использование Flashbots.

Аккаунт Тип Кол-во жертв Объем потерь (ETH) Комиссия (ETH)
1 0x14ca** Спасательный 50 432.958062 287.849654
2 0x9a65** Спасательный 23 22.569429 0.000000
3 0x9117** Спасательный 14 18.897622 7.213585
4 0x17d2** Спасательный 3 3.552833 0.000000
5 0x6360** Спасательный 21 3.540061 0.907168
6 0x0edd** Спасательный 7 1.498706 0.000000
7 0x281e** Спасательный 1 0.006000 0.000000
8 0xd83b** Спасательный 1 0.004000 0.000000
9 0x8af3** Спасательный 6 0.000980 0.000147
10 0x4986** Атакующий 332 456.004547 0.000000
11 0xfa27** Атакующий 42 433.438935 46.636389
12 0x48e9** Атакующий 66 312.014657 0.000000
13 0x5738** Атакующий 67 83.589240 62.587238
14 0x34b2** Атакующий 7 63.599821 20.642705
15 0xd374** Атакующий 86 45.452703 12.824763
16 0x1fe7** Атакующий 9 12.817241 0.000000
17 0x98f5** Атакующий 20 8.381273 0.000000
18 0x455d** Атакующий 11 5.047377 0.544263
19 0x1b45** Атакующий 6 4.942442 3.074813
20 0x3ec7** Атакующий 6 3.705686 0.741137
21 0xbca4** Атакующий 1 2.784250 1.392125
22 0xb0ab** Атакующий 18 0.834068 0.296000
23 0x0a5b** Атакующий 1 0.286750 0.143375
24 0x2d3a** Атакующий 2 0.080090 0.000000
25 0x835d** Атакующий 5 0.063945 0.000000
26 0x1dbd** Атакующий 1 0.027431 0.012893
27 0x813d** Атакующий 1 0.019528 0.008007
28 0x85dd** Атакующий 6 0.002240 0.000000
29 0x2394** Атакующий 1 0.000000 0.000000
30 0x6360** Атакующий 2 0.000000 0.000000

0x1.2 Тенденция комиссий для участия в Flashbots

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

Рисунок 4 показывает наблюдаемую нами тенденцию (от блока 14028474 до блока 14369199). Первые несколько атак не включали никакой комиссии, что означает отсутствие конкуренции в тот период. Это логично, так как ранние атаки еще не были широко известны.

Первая атака с комиссией (10%) произошла в блоке 14029765. С тех пор размер комиссии быстро рос по мере вовлечения новых участников. Например, доля комиссии достигла 80% в блоке 14072385 и вскоре поднялась до 91% в блоке 14129449.

Вкратце, эта тенденция говорит о «гонке вооружений», где победа требует повышения комиссий майнерам.

Рисунок 4: Процент комиссии в атаках и спасательных операциях
Рисунок 4: Процент комиссии в атаках и спасательных операциях

0x2 Наше спасение и сопутствующие вызовы

0x2.1 Способ проведения спасения

Основная идея спасения довольно проста. Нам нужно было отслеживать аккаунты, которые дали права доступа к WETH уязвимому контракту. Когда на аккаунт поступал WETH, мы могли напрямую перевести его на наш мультисиг-кошелек, используя уязвимость контракта AnySwap. Ключевые требования:

  • R1: Эффективный поиск транзакций, передающих токены на кошельки жертв (transferred TXs).
  • R2: Правильное формирование транзакций для проведения спасения (rescue TXs).
  • R3: Успешное опережение (фронтраннинг) транзакций злоумышленников и других третьих лиц (attack TXs).

R1 и R2 не были для нас препятствием: мы создали внутреннюю систему мониторинга мемпула и инструменты для автоматического формирования транзакций.

Однако R3 оставался вызовом. Можно ожидать, что Flashbots помогут выиграть конкуренцию, но это не так просто: атакующие тоже используют их, и успех зависит от размера комиссии. Кроме того, нам пришлось отправлять обычные транзакции через мемпул, подбирая их правильное размещение. Наконец, мы соперничали с другими «белыми хакерами», чье поведение иногда было подозрительным.

0x2.2 Участие в конкуренции

Мы пытались защитить 171 потенциальную жертву, 10 из которых защитились самостоятельно, отозвав разрешения еще до нашего вмешательства. Из 161 оставшейся жертвы нам удалось спасти только 14 из-за жесткой конкуренции. Случаи неудач суммированы в таблице ниже.

Аккаунт Тип Жертв Потерь (ETH) Комиссия (ETH) Средн. комиссия %
1 0x14ca** Спасательный 44 431.651020 286.891724 66.46%
... ... ... ... ... ... ...

(Таблица сокращена для краткости)

Это принесло нам бесценные уроки для всего сообщества.

0x3 Извлеченные уроки

0x3.1 Как определять размер комиссии для майнеров Flashbots?

Наш подход был консервативным: мы старались тратить как можно меньше. Однако результаты показали, что это не работает, поскольку злоумышленники (и даже другие «белые хакеры») агрессивно повышали ставки, чтобы победить. Это напоминает игру с нулевой суммой.

В конечном итоге, попытки моделировать поведение участников и находить оптимальный баланс между успехом и затратами остаются сложной задачей.

0x3.2 Как занять правильную позицию в мемпуле?

Использование Flashbots не стало панацеей — из-за высокой конкуренции даже максимальные комиссии не гарантировали успех.

Альтернативой стало использование обычных транзакций с правильным позиционированием в мемпуле — непосредственно за транзакцией перевода токенов. Например, атакующий 0x48e9** присвоил 312 ETH, вообще не платя комиссии Flashbots.

Очевидно, что эта сложная стратегия очень полезна и заслуживает пристального внимания.

0x4 Другие мысли

0x4.1 Белый хакинг или атака?

Иногда грань между белым хакингом и атакой размыта. Например, аккаунт 0xfa27 изначально был помечен на Etherscan как «эксплуататор», но после переговоров с AnySwap вернул часть средств и был переименован в «белого хакера». Вопрос справедливости подобных «вознаграждений» остается открытым.

0x4.2 Конкуренция «белых хакеров»

Необходимо разработать механизм координации, чтобы избегать конкуренции между самими «белыми хакерами». Такая конкуренция не только переводит ресурсы, но и искусственно завышает комиссии, делая спасение дороже. К сожалению, без механизмов координации конкуренция неизбежна.

0x4.3 Как проводить спасение лучше

С одной стороны, для убеждения сообщества полезно заранее (до завершения спасения) публиковать хеш намерения или сам анонс, не раскрывая деталей уязвимости. С другой стороны, сообщество должно объединить усилия:

  • Майнеры/Flashbots могли бы создать «зеленый канал» для сертифицированных белых хакеров.
  • Проекты могли бы заранее закладывать бюджет на «спасательные комиссии».
  • Разработчикам стоит предусмотреть механизмы экстренного реагирования в самом коде смарт-контрактов.

О компании BlockSec

BlockSec — инновационная компания в области безопасности блокчейнов, основанная в 2021 году группой ведущих мировых экспертов по безопасности. Компания стремится повысить безопасность и удобство использования развивающегося мира Web3. BlockSec предоставляет услуги аудита безопасности смарт-контрактов, платформу Phalcon для проактивного развития безопасности, платформу MetaSleuth для отслеживания и расследования средств, а также расширение MetaSuites для разработчиков Web3.

На сегодняшний день компания обслужила более 300 клиентов, включая MetaMask, Uniswap Foundation, Compound, Forta и PancakeSwap, и привлекла десятки миллионов долларов инвестиций от таких фондов, как Matrix Partners, Vitalbridge Capital и Fenbushi Capital.

Официальный сайт: https://blocksec.com/ Twitter: https://twitter.com/BlockSecTeam