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

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


Экстренное спасение — задача не из легких. Действительно, существует ряд проблем, включая как технические, так и нетехнические вопросы, усложняющие успешный исход. Поскольку спасательная операция уже завершена, мы можем всесторонне проанализировать весь процесс и поделиться извлеченными уроками. Мы верим, что этот опыт поможет сделать экосистему 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.
Вкратце, эта тенденция говорит о «гонке вооружений», где победа требует повышения комиссий майнерам.

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



