Back to Blog

Сбор MEV-ботов путем использования уязвимостей в Flashbots Relay

Code Auditing
February 6, 2024
6 min read

В апреле 2023 года злоумышленник использовал уязвимость в релее Flashbots для атаки на множество MEV-ботов, заработав около 20 млн долларов США. Первопричиной этой атаки является то, что при определенных условиях конфиденциальная транзакция могла попасть в публичный пул, после чего злоумышленник мог провести бэкранинг этой утекшей транзакции и получить прибыль. Мы также отметили несколько сложных методов, использованных в ходе атаки, например, использование транзакций-приманок (honeypot) для атаки на жертв и механизм самозащиты в контракте атакующего.

Контекст

Flashbots

Flashbots, как указано на их веб-сайте, — это «научно-исследовательская организация, созданная для смягчения негативных внешних эффектов, создаваемых максимальной извлекаемой стоимостью (MEV) для блокчейнов с состоянием, начиная с Ethereum». В экосистему Flashbots входит несколько различных сущностей, включая искателей (searchers), строителей (builders) и релеи (relays). На следующем изображении показана их взаимосвязь.

Изображение взято из документации Flashbots

Протокол PBS (разделение между предлагающим и строителем блока) — это протокол, который позволяет предлагающему блок (proposer) продавать свое место в блоке (поскольку они выбраны для его формирования) нескольким строителям для максимизации прибыли. В частности, многочисленные искатели отслеживают транзакции в мемпуле и генерируют бандлы, которые затем отправляются строителям. Строитель агрегирует бандлы от искателей, создает наиболее ценный блок и отправляет его релею. Релей передает блок предлагающему — валидатору, который был выбран для формирования блока в рамках текущего слота эпохи.

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

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

Сэндвич-атака

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

Предположим, у нас есть пул DEX с двумя токенами: WETH и USDC. Пользователь отправляет запрос на обмен WETH на USDC. Эта транзакция обмена попадает в мемпул и становится доступной MEV-боту (скажем, искателю). Затем бот создает две транзакции: одну до транзакции пользователя, а другую — после.

В частности, первая транзакция бота — обмен WETH на USDC, что повышает цену USDC. Затем выполняется транзакция пользователя (он получает меньше USDC, так как цена USDC стала выше из-за первой транзакции). После этого вторая транзакция бота обменивает USDC на WETH, что позволяет получить больше WETH, чем было затрачено в первом свопе.

Изображение взято из статьи Liyi Zhou et al. «High-Frequency Trading on Decentralized On-Chain Exchanges».

Бэкранинг (Backrunning)

Бэкранинг — это стратегия исполнения транзакции сразу после крупной сделки. По сути, бэкранинг использует возможности арбитража, возникающие из-за влияния крупной сделки на цену токена. Например, если пользователь совершает крупную сделку в пуле DEX по обмену WETH на USDC, это может сделать цену USDC выше, чем на других биржах. Бот для бэкранинга может мгновенно уловить эту арбитражную возможность, чтобы обменять USDC на WETH по более низкой цене, получить больше WETH, а затем продать WETH в других пулах DEX для получения прибыли.

Уязвимость

Как показано в пост-мортем анализе, уязвимость существовала в коде релея. Он раскрывал содержимое блока строителя (злонамеренному) предлагающему, даже если подписанный заголовок блока был недействителен (хотя сама подпись была валидной). В этом случае недействительный заголовок и содержимое блока, отправленные в сигнальную цепь (beacon chain), отклонялись, но предлагающий мог выиграть гонку, чтобы опубликовать свой собственный блок и использовать leaked-содержимое предыдущего блока для получения прибыли.

Процесс атаки

Злоумышленником выступал злонамеренный предлагающий, а жертвами — MEV-боты, намеревавшиеся провести сэндвич-транзакции.

Давайте используем реальную транзакцию атаки в качестве примера.

Блок 16964664
Позиция 0 Транзакция жертвы: 0xd2edf726fd3a7f179c | Phalcon Explorer (blocksec.com) MEV-бот использовал 2454.1 WETH для обмена на 4.5 STG
Позиция 1 Транзакция атаки: 0x4b2a2d03b3dc136ef9 | Phalcon Explorer (blocksec.com) Атакующий использовал 158 STG для получения 2454.1 WETH

Транзакции жертвы и атакующего находятся на позициях 0 и 1 в блоке 16964664 соответственно. По сути, жертва (MEV-бот) совершила крупную сделку, используя 2454.1 WETH для покупки 4.5 STG в пуле Uniswap WETH-STG. Это создало большую арбитражную возможность, и атакующий использовал 158 STG, чтобы вывести все WETH из пула.

Возникает вопрос: почему жертва (MEV-бот) была готова использовать 2454 WETH (стоимостью около 5 млн долларов США) для обмена на 4.5 токена STG (стоимостью около 3 долларов США) в пуле? Заметим, что когда жертва совершала этот своп, ликвидность в пуле была крайне низкой (0.005 WETH и 4.5 STG).

Наш анализ показывает, что есть две причины, заставившие MEV-бота совершить такой нелепый обмен.

Во-первых, атакующий использовал транзакцию-приманку (honeypot), чтобы заманить жертву в ловушку для проведения сэндвич-атаки. Хэш этой приманки: 0xd534c46ba5a444e886 | Phalcon Explorer (blocksec.com). Конкретно, атакующий транслировал транзакцию обмена WETH на STG (до блока 16964664). Поскольку ликвидность в пуле была очень низкой, это создало для MEV-бота возможность провести сэндвич-атаку. Как показано на рисунке ниже, MEV-бот мог создать бандл сэндвич-атаки, состоящий из трех транзакций.

Во-вторых, MEV-бот использовал «жадную» стратегию сэндвича и задействовал Flashbots для отправки этой транзакции. Чтобы максимизировать прибыль, первая транзакция внутри бандла пытается выкупить почти все токены STG (за 2454 WETH). Это очень жадная стратегия: использовать 5 млн долларов (2454 WETH), чтобы заработать около 700 долларов (0.35 WETH) — соотношение 7000:1. Бот предполагал, что этот своп НЕ будет раскрыт публике, пока он не будет зафиксирован в цепочке. Однако это предположение было нарушено из-за уязвимости в релее. Воспользовавшись этим, атакующий создал новый бандл, включив в него исходную транзакцию сэндвич-атаки бота и добавив бэкранинг-транзакцию, чтобы забрать 2454 WETH.

Рисунок в Twitter BlockSec показывает весь процесс атаки.

Механизм самозащиты

Мы знаем, что атакующий отправил транзакцию-приманку, чтобы заманить жертву обменом WETH на STG. Однако что происходит, если сэндвич-транзакций для эксплуатации приманки не находится? В таких случаях атакующий отслеживал состояние пула и исполнял обратный своп, чтобы защитить свои 0.35 Ether — весьма умный ход. Ниже представлен декомпилированный код смарт-контракта (0xe73f1576af5573714404a2e3181f7336d3d978f9), который исполнил транзакцию-приманку.

Чтобы проверить наши выводы, мы симулировали транзакцию-приманку в Phalcon Fork, но на позиции 0 блока 16964664.

Итоги

Это первая атака, которая использовала уязвимость в релее Flashbots в сочетании со сложными стратегиями атаки.

  • Во-первых, эта атака эксплуатировала уязвимость нулевого дня в релее Flashbots.
  • Во-вторых, она использовала жадную стратегию сэндвич-атаки и транзакции-ловушки (honeypot), чтобы заманить MEV-бота (жертву).
  • В-третьих, она включала механизм самозащиты, чтобы сохранить затраты (0.35 WETH) на транзакцию-приманку в том случае, если атака не увенчается успехом.

Читайте другие статьи в этой серии:

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit