Автор: 九九

фон

5 декабря 2023 года базовая платформа разработки Web3 Thirdweb заявила, что в предварительно созданном смарт-контракте была обнаружена проблема безопасности, и это затронуло все токены ERC20, ERC721 и ERC1155, развернутые с использованием предварительно созданного смарт-контракта. (Информацию о конкретных затронутых версиях кода контракта см. на странице https://blog. Thirdweb.com/security-vulnerability/)

По данным службы безопасности SlowMist, 7 декабря 2023 года токен Time в сети ETH подвергся атаке именно из-за этой уязвимости, и злоумышленник получил прибыль в размере около 190 000 долларов США. По-прежнему существует множество контрактов токенов с уязвимостями, которые подвергаются атакам.Команда безопасности SlowMist немедленно вмешалась в анализ и поделилась результатами следующим образом:

необходимые знания

1. ERC-2771 — стандарт метатранзакций. Пользователи могут делегировать выполнение транзакций стороннему серверу пересылки, часто называемому ретранслятором или сервером пересылки.

Обычно адрес прямого вызывающего абонента в контракте получается с помощью msg.sender, но в случае использования ERC-2771, если msg.sender является ролью пересылки, данные входящего вызова будут усечены и будут получены последние 20 слов. .раздел в качестве прямого адреса вызывающего абонента транзакции.

2. Multicall — это библиотека смарт-контрактов, которая позволяет выполнять несколько вызовов функций в пакетном режиме, тем самым снижая транзакционные издержки. Эта библиотека часто используется для оптимизации производительности и удобства работы пользователей с DApps, особенно когда требуется несколько операций чтения.

Как видно из кода, библиотека Multicall, используемая уязвимым контрактом в проекте ThirdWeb, выполняет другие функции в контракте, который ссылается на библиотеку, циклически вызывая функцию DelegateCall.

первопричина

Основная причина уязвимости заключается в том, что контракт токена использует библиотеки ERC-2771 и Multicall. Злоумышленник вызывает функцию множественного вызова контракта токена через функцию выполнения контракта пересылки, чтобы выполнить другие функции контракта (например, сжигание токенов). Этот метод успешно проходит проверку isTrustedForwarder по стандарту ERC-2771 и, наконец, разрешает вызывающую функцию в последние 20 байтов вредоносных данных вызова. Таким образом, злоумышленник успешно обманул контракт, полагая, что вызывающий абонент был адресом другого пользователя, что, в свою очередь, привело к сжиганию токенов других пользователей.

Анализ шагов атаки

В качестве примера для анализа мы возьмем атакующую транзакцию 0xecdd11...f6b6:

1. Злоумышленник сначала использовал 5 WETH для обмена на 345 539 9346 токенов времени в пуле Uniswap V2.

2. Затем вызовите функцию выполнения контракта пересылки и создайте вредоносные данные для вызова функции множественного вызова контракта токена. В это время контракт токена будет использовать вредоносные данные, переданные злоумышленником в DelegateCall, для выполнения функции записи контракт токена и записать адрес пула.62 227 259 510 токенов времени.

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

Анализ принципа атаки

В функции выполнения контракта Forward, после проверки подписи req.from, вызов будет использоваться для взаимодействия с req.to (адрес токена). Req.data, переданный злоумышленником,

Поскольку 0xac9650d8 является сигнатурой функции multicall, будет вызвана функция multicall контракта токена, а значение данных, передаваемое функцией multicall, равно 0x42966c680000000000000000000000000000000000000000c9112ec16d958e8da81800007 60dc1 e043d99394a10605b2fa08f123d60faf84.

Почему в значении данных, передаваемых в функцию многовызова, нет req.from? Это связано с тем, что нижний уровень EVM будет усекать необходимое значение на основе смещения при обработке вызова.Смещение, установленное в значении данных вызова, переданном злоумышленником, равно 38, а длина значения равна 1, поэтому он просто перехватывает значение данных. 42966c680000000000000000000000000000000000000c9112ec16d958e8da8180000760dc1e043d99394a10605b2fa08f123d60faf84.

Подробную информацию см. в описании вызова в коде операции EVM (https://www.evm.codes/?fork=shanghai).

Поскольку 0x42966c68 является сигнатурой функции записи, функция записи контракта токена будет вызываться через вызов делегата на основе значения данных, созданного злоумышленником.

Функция _msgSender() переопределяется библиотекой ERC-2771.

Поскольку multicall вызывается через Delegatecall, msg.sender, переданный isTrustedForwarder, на самом деле является адресом контракта Forward, тем самым выдавая суждение, и в конечном итоге значение, возвращаемое _msgSender(), представляет собой последние 20 байтов переданных данных вызова. то есть адрес пула 0x760dc1e043d99394a10605b2fa08f123d60faf84.

в заключение

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

Команда безопасности SlowMist рекомендует участникам проекта не использовать Multicall и ERC2771Context одновременно при написании контрактов токенов.Если ожидаемый спрос требует одновременной ссылки, вы должны проверить, соответствует ли длина данных вызова ожиданиям, или использовать последнюю официальную версию Multicall и ERC2771Контекстные контракты.

ссылка

Адрес злоумышленника: 0xfde0d1575ed8e06fbf36256bcdfa1f359281455a

Контракт атаки: 0x6980a47bee930a4584b09ee79ebe46484fbdbdd0

Связанные транзакции атаки: https://etherscan.io/tx/0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

Подробности о затронутой версии: https://blog. Thirdweb.com/security-vulnerability/.

Инструмент смягчения последствий: https://mitigate. Thirdweb.com/.